我很驚訝你還沒有收到答覆。
你需要做的就像下面的代碼。當您收到傳入的websocket連接時,會爲此連接生成一個新的goroutine。如果你讓那個goroutine結束,它將斷開websocket客戶端。
我假設你不一定會在同一臺計算機上運行客戶端和服務器。如果你總是這樣,那麼最好是通過頻道或者類似的渠道進行溝通,而不是使用網絡插口或網絡端口。我只提到這一點,因爲我不完全確定你使用的是什麼。我只希望我回答你問題的正確部分。
package main
import (
"code.google.com/p/go.net/websocket"
"flag"
"fmt"
"net/http"
"os"
"time"
)
type Message struct {
RequestID int
Command string
SomeOtherThing string
Success bool
}
var mode *string = flag.String("mode", "<nil>", "Mode: server or client")
var address *string = flag.String("address", "localhost:8080", "Bind address:port")
func main() {
flag.Parse()
switch *mode {
case "server":
RunServer()
case "client":
RunClient()
default:
flag.Usage()
}
}
func RunServer() {
http.Handle("/", http.FileServer(http.Dir("www")))
http.Handle("/server", websocket.Handler(WSHandler))
fmt.Println("Starting Server")
err := http.ListenAndServe(*address, nil)
if err != nil {
fmt.Printf("HTTP failed: %s\n", err.Error())
os.Exit(1)
}
}
func WSHandler(ws *websocket.Conn) {
defer ws.Close()
fmt.Println("Client Connected")
for {
var message Message
err := websocket.JSON.Receive(ws, &message)
if err != nil {
fmt.Printf("Error: %s\n", err.Error())
return
}
fmt.Println(message)
// do something useful here...
response := new(Message)
response.RequestID = message.RequestID
response.Success = true
response.SomeOtherThing = "The hot dog left the castle as requested."
err = websocket.JSON.Send(ws, response)
if err != nil {
fmt.Printf("Send failed: %s\n", err.Error())
os.Exit(1)
}
}
}
func RunClient() {
fmt.Println("Starting Client")
ws, err := websocket.Dial(fmt.Sprintf("ws://%s/server", *address), "", fmt.Sprintf("http://%s/", *address))
if err != nil {
fmt.Printf("Dial failed: %s\n", err.Error())
os.Exit(1)
}
incomingMessages := make(chan Message)
go readClientMessages(ws, incomingMessages)
i := 0
for {
select {
case <-time.After(time.Duration(2e9)):
i++
response := new(Message)
response.RequestID = i
response.Command = "Eject the hot dog."
err = websocket.JSON.Send(ws, response)
if err != nil {
fmt.Printf("Send failed: %s\n", err.Error())
os.Exit(1)
}
case message := <-incomingMessages:
fmt.Println(message)
}
}
}
func readClientMessages(ws *websocket.Conn, incomingMessages chan Message) {
for {
var message Message
err := websocket.JSON.Receive(ws, &message)
if err != nil {
fmt.Printf("Error: %s\n", err.Error())
return
}
incomingMessages <- message
}
}
重塑車輪,也許是爲了好玩嗎?聽起來很像Salt:http://saltstack.org/或木偶實驗室木偶:http://docs.puppetlabs.com/mcollective/index.html – djangofan 2012-02-21 00:27:01
很好的鏈接,但我想自己實現這樣的東西 – farnoy 2012-02-21 07:10:36
我使用類似的東西(在websockets中使用瀏覽器 - 服務器通信的遊戲服務器),所以我知道如何去做,但我不明白這裏真正的問題。如果只是「渠道是溝通的好方法」,那麼答案是肯定的。 – 2012-04-25 07:05:45