我有一个问题与我的golang服务器,我使用websockets。服务器打开连接,客户端可以连接到它,但问题是,当服务器开始向客户端发送数据时,客户端连接在一小段时间后关闭。我建议问题是与服务器,而不是与客户端,因为我试图连接到服务器与另一个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循环并开始用消息轰炸客户端。这可能不是echo服务器的预期行为。
首先你想要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: %+vn", 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,你必须在你的本地计算机上编译它
当可以使用websocket.JSON.Receive
反序列化消息时,为什么要使用ws.Read
?
这里是服务器:http://play.golang.org/p/NZ6VJ4daGm客户端:http://play.golang.org/p/rkJVKGhrGk(我已经更改为在退出前接收10条消息)。
一旦客户端关闭websocket连接,服务器将打印字符串"Can't send"