Мне нужно решить проблему с веб-узлами на сервере golang - PullRequest
0 голосов
/ 14 июля 2020

У меня есть сервер на GoLang и googollee/go-socket.io.
Когда сервер и клиент работают на одном порту, сокеты работают нормально. Но когда я запускаю, они находятся на разных портах, на клиенте возникает ошибка:

WebSocket connection to 'ws://localhost:4444/socket.io/?EIO=3&transport=websocket&sid=6' failed: Error during WebSocket handshake: Unexpected response code: 403

POST http://localhost:4444/socket.io/?EIO=3&transport=polling&t=NDDzcYM&sid=5 400 (Bad Request)

GET http://localhost:4444/socket.io/?EIO=3&transport=polling&t=NDDzcYC&sid=5 400 (Bad Request)

WebSocket connection to 'ws://localhost:4444/socket.io/?EIO=3&transport=websocket&sid=5' failed: Error during WebSocket handshake: Unexpected response code: 403

А на сервере:

connected: 1 closed client namespace disconnect meet error: json: cannot unmarshal object into Go value of type string connected: 2

Это мой код:

package main

import (
"fmt"
"log"
"net/http"
"github.com/gorilla/mux"
"github.com/rs/cors"

socketio "github.com/googollee/go-socket.io"
)

func main() {
fmt.Println("Hello world")
router := mux.NewRouter()
router.HandleFunc("/is-alive", isAlive).Methods("GET")

server, err := socketio.NewServer(nil)
if err != nil {
    log.Fatal(err)
}

server.OnConnect("/", func(s socketio.Conn) error {
    s.SetContext("")
    fmt.Println("connected:", s.ID())
    s.Emit("change")
    s.Join("bcast")
    return nil
})

server.OnEvent("/", "msg", func(s socketio.Conn, msg string) string {
    s.SetContext(msg)
    s.Emit("change")
    fmt.Println("event: msg")
    return "recv " + msg
})

server.OnError("/", func(s socketio.Conn, e error) {
    fmt.Println("meet error:", e)
})

server.OnDisconnect("/", func(s socketio.Conn, reason string) {
    fmt.Println("closed", reason)
})

go server.Serve()
defer server.Close()

router.Handle("/socket.io/", server)
c := cors.New(cors.Options{
    AllowedOrigins: []string{"http://localhost:3000"},
    AllowCredentials: true,
})
handler := c.Handler(router)

log.Println("Serving at localhost:4444...")
log.Fatal(http.ListenAndServe(":4444", handler))
}

func isAlive(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
}

В моем приложении реагирования

 import socketIOClient from "socket.io-client";

 export class SocketClientManager {

 public socket = socketIOClient("ws://localhost:4444");

 public subscribe() {
    this.socket.emit("msg", { msg: "Hello!" });
 }

 public setCallback(callback: (arg: any) => void) {
    this.socket.on("change", callback);
 }

 public async unsubscribe() {
    this.socket.disconnect();
 }

}

1 Ответ

0 голосов
/ 14 июля 2020

Сообщение об ошибке указывает на то, что сервер попытался демаршалировать ваш JSON объект в строку, но ожидал чего-то другого.

Причина в определении вашего метода:

server.OnEvent("/", "msg", func(s socketio.Conn, msg string) string {

msg имеет тип строки.

Однако затем вы отправляете сообщение другого типа:

public subscribe() {
    this.socket.emit("msg", { msg: "Hello!" });
}

Это сообщение можно описать в следующем определении структуры:

type Message struct {
    Msg string `json:"msg"`
}

Таким образом, преобразование вашей информации в строку не работает, потому что отправленный вами объект не является строкой, а должен быть представлен по-другому.

Чтобы исправить это, у вас есть два варианта:

  1. Измените определение метода на стороне сервера, чтобы иметь возможность принимать данные клиента:

    Используйте server.OnEvent("/", "msg", func(s socketio.Conn, msg Message) string {, отметив, что msg теперь имеет тип Message , которая соответствует полученным данным.

OR

Измените данные, которые отправляет ваш клиент:

Используйте this.socket.emit("msg", "Hello!"); для отправки только строки (которая затем будет правильно декодирована в ваш msg аргумент строки типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...