2014-05-07 180 views
1

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

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]) 
} 
+0

您的客户只读取1条消息并退出。如果你把它放在一个循环中,它会工作得很好。 – JimB

+0

我试过了:对于{ \t var msg = make([] byte,512) \t var n int \t if n,err = ws.Read(msg); !ERR =零{ \t \t log.Fatal(ERR) 断裂 \t} \t fmt.Printf( “接收:%S \ n” 个,MSG [:N]) },但它以EOF误差存在 – Farah

+0

请发表您正在使用的可运行示例。我所能发布的代码的运行方式与预期完全相同。 – JimB

回答

2

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

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

一旦客户端关闭websocket连接,服务器将打印字符串“无法发送”。

+0

我把它取代了,但它对我来说也是一样的问题。客户端:收到:{orderCommand 3}退出状态1 – Farah

+0

客户端的退出状态为0(即成功)。服务器在客户端存在后继续运行,并且由于客户端已关闭连接而打印出“无法发送...”。它按预期工作。 – lbolla

3

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

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

首先要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 
     } 
    } 
} 

一个完整的工作版本可以在游乐场发现:http://play.golang.org/p/nQ3fJ5Nb0I

因为它使用的WebSockets,你必须编译它在你的本地计算机。

相关问题