【问题标题】:Golang Server close the connection of the client : websocketGolang Server 关闭客户端的连接:websocket
【发布时间】:2014-05-07 13:46:08
【问题描述】:

我使用 websockets 的 golang 服务器有问题。 服务器打开连接,客户端可以连接,但问题是当服务器开始向客户端发送数据时,客户端连接在一小段时间后关闭。我建议问题出在服务器而不是客户端,因为我尝试使用另一个 Web 客户端连接到服务器,这是同样的问题。我不明白原因!有人可以帮我吗?

server.go:

    func Echo(ws *websocket.Conn) {
    fmt.Println("Echoing")

         for {
        msg := MessageReceived{Name: "OrderCommand", Nbmsg: 3}

        if err := websocket.JSON.Send(ws, msg); err != nil {
            fmt.Println("Can't send")
            break
        }

    //os.Exit(0)
         }
}

func checkError(err error) {
    if err != nil {
        Log("Fatal error ", err.Error())
        os.Exit(1)
    }
}


func main() {

    http.HandleFunc("/save", saveHandler)
    http.Handle("/", websocket.Handler(Echo))
    err:= http.ListenAndServe(":8081", nil)
    checkError(err)

}

和client.go:

 import (
    "code.google.com/p/go.net/websocket"
    "fmt"
    "log"
)

func main() {
    origin := "http://localhost/"
    url := "ws://localhost:8081/echo"
    ws, err := websocket.Dial(url, "", origin)
    if err != nil {
        log.Fatal(err)
    }

    var msg = make([]byte, 512)
    var n int
    if n, err = ws.Read(msg); err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Received: %s.\n", msg[:n])
}

【问题讨论】:

  • 您的客户端只读取了 1 条消息并退出。如果你把它放在一个循环中,它会工作得很好。
  • 我试过了:for { var msg = make([]byte, 512) var n int if n, err = ws.Read(msg); err != nil { log.Fatal(err) break } fmt.Printf("Received: %s.\n", msg[:n]) } 但存在 EOF 错误
  • 请发布您正在使用的可运行示例。我可以运行您发布的代码的内容完全符合预期。

标签: websocket go


【解决方案1】:

正如其他人指出的那样,您的问题是您也必须收到一条消息。

目前,当有人连接时,您的程序将进入 for 循环并开始用消息轰炸客户端。可能不是回显服务器的预期行为。

首先你想Receive 发消息,然后Send 回复:

func Echo(ws *websocket.Conn) {
    fmt.Println("Echoing")

    msg := new(MessageReceived)

    for {
        // The server blocks here until a message from the client is received
        websocket.JSON.Receive(ws, &msg)

        fmt.Printf("Received message: %+v\n", msg)

        // Reencode the same message and send it back
        if err := websocket.JSON.Send(ws, msg); err != nil {
            fmt.Println("Can't send echo")
            break
        }
    }
}

完整的工作版本可以在 Playground 找到:http://play.golang.org/p/nQ3fJ5Nb0I

由于它使用 websockets,你必须在本地计算机上编译它。

【讨论】:

    【解决方案2】:

    既然可以使用websocket.JSON.Receive 反序列化消息,为什么还要使用ws.Read

    这里是服务器:http://play.golang.org/p/NZ6VJ4daGm 和客户端:http://play.golang.org/p/rkJVKGhrGk(我已经更改为在退出前接收 10 条消息)。

    一旦客户端关闭 websocket 连接,服务器将打印字符串“Can't send”。

    【讨论】:

    • 我替换了它,但我的问题是一样的。客户端:收到:{orderCommand 3} 退出状态 1
    • 客户端退出状态为0(即成功)。客户端存在后服务器继续运行,并打印“无法发送...”,因为客户端已关闭连接。它按预期工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    相关资源
    最近更新 更多