提供: tty00
(ページの作成:「== インストール == go get github.com/gorilla/websocket == サンプルコード == === websocketサーバ === ws.go <source lang=go> package main import( "github...」) |
|||
行1: | 行1: | ||
+ | == はじめに == | ||
+ | [https://github.com/gorilla/websocket Gorilla WebSocket]は、[http://golang.org/ Go]の[http://www.rfc-editor.org/rfc/rfc6455.txt WebScoket]パッケージ。 | ||
+ | |||
== インストール == | == インストール == | ||
go get github.com/gorilla/websocket | go get github.com/gorilla/websocket | ||
行28: | 行31: | ||
} | } | ||
− | conn.SetReadDeadline( time.Now().Add( 5 * time.Second ) ) // | + | conn.SetReadDeadline( time.Now().Add( 5 * time.Second ) ) //ReadMessageのタイムアウトを設定する。 |
conn.WriteMessage(websocket.TextMessage,data) | conn.WriteMessage(websocket.TextMessage,data) | ||
行40: | 行43: | ||
} | } | ||
} | } | ||
− | |||
func handlerRoot(w http.ResponseWriter, r *http.Request){ | func handlerRoot(w http.ResponseWriter, r *http.Request){ | ||
行98: | 行100: | ||
</html> | </html> | ||
</source> | </source> | ||
+ | |||
+ | == コネクションのクローズを検出する == | ||
+ | Gorilla WebSocketはコネクションの状態を取得できない。コネクションのクローズを任意のタイミングで検出したいときは、 | ||
+ | Connに対して"func (*Conn) ReadMessage"を呼び出す。コネクションがクローズ状態の時はエラーとなる。 | ||
+ | <source lang=go> | ||
+ | conn.SetReadDeadline( time.Now() ) //タイムアウト時間を短くする。 | ||
+ | _, p , err_r := conn.ReadMessage() | ||
+ | if err_r != nil { | ||
+ | //コネクションのクローズの検出 | ||
+ | } | ||
+ | </source> | ||
+ | [[Category:Golang]] |
2014年8月30日 (土) 15:27時点における版
はじめに
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 { //コネクションのクローズの検出 }