Golang服务器关闭客户端的连接:websocket
我使用WebSocket的golang服务器有问题。 服务器打开连接,客户机可以连接到该连接,但问题是,当服务器开始向客户机发送数据时,客户机连接会在一小段时间后关闭。我建议问题出在服务器上,而不是客户端,因为我试图用另一个web客户端连接到服务器,这是同一个问题。我不明白原因!有人能帮我吗 server.go:Golang服务器关闭客户端的连接:websocket,websocket,go,Websocket,Go,我使用WebSocket的golang服务器有问题。 服务器打开连接,客户机可以连接到该连接,但问题是,当服务器开始向客户机发送数据时,客户机连接会在一小段时间后关闭。我建议问题出在服务器上,而不是客户端,因为我试图用另一个web客户端连接到服务器,这是同一个问题。我不明白原因!有人能帮我吗 server.go: func Echo(ws *websocket.Conn) { fmt.Println("Echoing") for { msg :
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])
}
当您可以使用
websocket.JSON.Receive
反序列化消息时,为什么要使用ws.Read
以下是服务器:
客户:(我改为在退出前接收10条消息)
一旦客户端关闭websocket连接,服务器将打印字符串“Can not send”。当您可以使用
websocket.JSON.Receive来反序列化消息时,为什么使用ws.Read
以下是服务器:
客户:(我改为在退出前接收10条消息)
一旦客户端关闭websocket连接,服务器将打印字符串“Can not send”。正如其他人所指出的,您的问题是,您还必须接收消息
目前,当有人连接时,您的程序将进入for循环,并开始用消息轰炸客户端。可能不是echo服务器的预期行为
首先要接收
消息,然后发送
回复:
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
}
}
}
可在操场上找到完整的工作版本:
因为它使用WebSocket,所以您必须在本地计算机上编译它。正如其他人所指出的,您的问题是,您还必须接收消息
目前,当有人连接时,您的程序将进入for循环,并开始用消息轰炸客户端。可能不是echo服务器的预期行为
首先要接收
消息,然后发送
回复:
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
}
}
}
可在操场上找到完整的工作版本:
由于它使用WebSocket,您必须在本地计算机上编译它。您的客户端只读取一条消息并退出。如果你把它放在一个循环中,它会工作得很好。我尝试过:对于{var msg=make([]字节,512)var n int If n,err=ws.Read(msg);err!=nil{log.Fatal(err)break}fmt.Printf(“接收:%s.\n”,msg[:n]),但它存在一个EOF错误,请给出一个你正在使用的可运行的示例。我所能运行的您发布的代码完全按照预期工作。您的客户端只读取一条消息并退出。如果你把它放在一个循环中,它会工作得很好。我尝试过:对于{var msg=make([]字节,512)var n int If n,err=ws.Read(msg);err!=nil{log.Fatal(err)break}fmt.Printf(“接收:%s.\n”,msg[:n]),但它存在一个EOF错误,请给出一个你正在使用的可运行的示例。我所能运行的你发布的代码工作完全符合预期。我替换了它,但我也有同样的问题。客户端:收到:{orderCommand 3}退出状态1Exit客户端的状态为0(即成功)。客户端存在后,服务器继续运行,并打印“无法发送…”,因为客户端已关闭连接。它按预期工作。我更换了它,但我也有同样的问题。客户端:收到:{orderCommand 3}退出状态1Exit客户端的状态为0(即成功)。客户端存在后,服务器继续运行,并打印“无法发送…”,因为客户端已关闭连接。它按预期工作。