提供: tty00
はじめに
Gorilla WebSocketは、GoのWebScoketパッケージ。
インストール
go get github.com/gorilla/websocket
サンプルコード
websocketサーバ
ws.go
package main import( "github.com/gorilla/websocket" "net/http" "log" "time" ) var upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } func handlerWS(w http.ResponseWriter, r *http.Request){ var data = []byte("Hello") conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println("Error@handlerWS") } conn.SetReadDeadline( time.Now().Add( 5 * time.Second ) ) //ReadMessageのタイムアウトを設定する。 conn.WriteMessage(websocket.TextMessage,data) _, p , err_r := conn.ReadMessage() //メッセージを受信するまで処理は停止する。非同期処理はGoroutinesやChannelを使用し実現する。 if err_r != nil { log.Println("Error@ReadMessage") log.Println(err) }else{ log.Println( "ReadMessage="+string(p) ) } } func handlerRoot(w http.ResponseWriter, r *http.Request){ http.ServeFile(w, r, "index.html") } func main(){ upgrader.CheckOrigin = func(r *http.Request) bool { return true } //Originのチェックを無効にする。 http.HandleFunc("/", handlerRoot) //ルートディレクトリの登録 http.HandleFunc("/ws", handlerWS) //Websocketハンドラの登録 log.Println("HTTP Start") http.ListenAndServe(":8080", nil) }
クライアント
index.html
<html> <head> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> <script> var socket; main = function (){ var url = "ws://localhost:8080/ws"; socket = new WebSocket( url ); socket.onmessage = function (msg){ var str = ""; $('#output').append('<p>'+ msg.data +'</P>') str = str + msg.data; $('#output').append('<p>'+ str.length +'</P>') } $('#send').click(function(){ var text = $('#msg').val(); socket.send(text); $('#msg').val(''); }) } $(main); </script> </head> <body> <input id="msg" type="text"/> <button id="send">OK</button> <div id="output"></div> </body> </html>
コネクションのクローズを検出する
Gorilla WebSocketはコネクションの状態を取得できない。コネクションのクローズを任意のタイミングで検出したいときは、 Connに対して"func (*Conn) ReadMessage"を呼び出す。コネクションがクローズ状態の時はエラーとなる。
conn.SetReadDeadline( time.Now() ) //タイムアウト時間を短くする。 _, p , err_r := conn.ReadMessage() if err_r != nil { //コネクションのクローズの検出 }