2014-05-07 259 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,你必須編譯它在你的本地計算機。

相關問題