2013-10-31 10 views
11

私はwebsockets +と一緒に遊び始めていますが、私はGoのwebsocketでかなり基本的なことを誤解していると思います。Goでwebsocketを提供する

私は単にWebSocket接続をリッスンし、それに応じて処理したいと考えています。しかし、Goでwebsocketを使用しているすべての例は、websocketに接続するWebページを提供していますが、これは必須条件ですか?

次は私が設定している基本的なエコーサーバです:

package main 

import (
    "fmt" 
    "code.google.com/p/go.net/websocket" 
    "net/http" 
) 

func webHandler(ws *websocket.Conn) { 
    var s string 
    fmt.Fscan(ws, &s) 
    fmt.Println("Received: ", s) 
} 

func main() { 
    fmt.Println("Starting websock server: ") 
    http.Handle("/echo", websocket.Handler(webHandler)) 
    err := http.ListenAndServe(":8080", nil) 
    if err != nil { 
    panic("ListenAndServe: " + err.Error()) 
    } 
} 

これを接続するために使用するJavaScriptです:「WSへ WebSocketの接続::

ws = new WebSocket("ws://localhost:8080/echo"); 
ws.onmessage = function(e) { 
    console.log("websock: " + e.data); 
}; 

しかし、これは、その結果//localhost:8080/echo 'failed:予期しない応答コード:403

答えて

15

JavascriptのWebソケットを使用している場合、めったにフレームの読み込みが必要ありませんctly。正直言って、私はそれをどうやって行うのかもわかりません。

幸いにも、websocketパッケージのタイプはCodecとなっています。私の提案は、代わりにRecieveSendメッセージに事前定義されたwebsocket.Messageコーデックを使用することです。

メッセージは、WebSocket接続上のフレームでテキスト/バイナリデータを送受信するコーデックです。テキストフレームを送受信するには、文字列型を使用します。バイナリフレームを送受信するには、[]バイトタイプを使用します。 websocket.Messageを使用して

、あなたのwebHandlerは次のようになります:

func webHandler(ws *websocket.Conn) { 
    var in []byte 
    if err := websocket.Message.Receive(ws, &in); err != nil { 
     return 
    } 
    fmt.Printf("Received: %s\n", string(in)) 
    websocket.Message.Send(ws, in)  
} 

そして、いや、それはGoは、Webページを提供しています要件はありません。あなたが受け取った403エラーは、Goやwebsocketパッケージとは関係ありません。

+0

ifブロックの中断とはどういう意味ですか? –

+1

@ElgsQianChenブレークは、最初のメッセージの後に切断されないように、forループにReceiveとSendを置いておくことの可能性が最も高いです。私はそれを代わりに 'return'に変更しました。 – ANisus

+0

ああ、そうだ。 @ANisusの説明をありがとう。 –

10

私は同様の問題を持っていたし、403エラーの問題は、Goはhttp Origin headerをどのように扱うかに関連している:

ハンドラのWebSocketブラウザクライアントにシンプルなインターフェイスです。 Originヘッダーが有効なURLであるかどうかをチェックします。 funcのwebsocket.Conn.Config()。Originを検証したいかもしれません。 Handlerの代わりにServerを使用する場合は、websocket.Originを呼び出し、Handshake funcの起点を確認することができます。したがって、Originヘッダーを送信しないブラウザ以外のクライアントを受け入れる場合は、Serverを使用できます。そのハンドシェイクで起点をチェックしません。原点チェックを無効にするには

、あなたのようなものを使用する必要があります。

http.HandleFunc("/echo", 
    func (w http.ResponseWriter, req *http.Request) { 
     s := websocket.Server{Handler: websocket.Handler(webHandler)} 
     s.ServeHTTP(w, req) 
    }); 

私(サーバー用WebSocket通信のサーバー)のための問題を解決し、私はそれが問題を解決できると思う少なくとも、起点ヘッダーが一致しない場合も同様です。

+0

私はクロスオリジンチェックを無効にする方法も探しています。 src/ondemand/server.go:103:http.Handleへの引数でhttp.Handler型としてfuncリテラル(タイプfunc(http.ResponseWriter、* http.Request)を使用できません): \t func(http.ResponseWriter、* http .Request)はhttp.Handlerを実装していません(ServeHTTPメソッドがありません) – coulix

+0

熱心な、ありがとう!このソリューションだけでなく、私はすでに持っているものに収まる! –

関連する問題