提供: tty00

移動: 案内検索

はじめに

Gorilla WebSocketは、GoWebScoketパッケージ。

インストール

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 {
	//コネクションのクローズの検出
	}