繁体   English   中英

Golang Server关闭客户端的连接:websocket

[英]Golang Server close the connection of the client : websocket

我在使用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])
}

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

当前,当有人连接时,您的程序将进入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

由于它使用websocket,因此必须在本地计算机上进行编译。

当可以使用websocket.JSON.Receive来反序列化消息时,为什么要使用ws.Read

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM