ページ

2011年1月12日

golangのWebsocketクライアント

Pythonの人たちには黙っていましたが、僕はgoが好きです。ごめんなさい、ごめんなさい。さて、PythonでWebsocketのクライアントを先週書きました。正確には年末にちょこちょこって書いて、年明けにちょびっと修正しただけです。まあ、そんなことはいいのですが、僕がWebsocketのチャットサーバのサンプルを書いたのがgoでした。そのときは、多分クライアントの実装はなかったと思うのですが、あれから一年たったのでクライアントも実装されているに違いないと信じて見てみました。ありました。ほら
API自体は僕の書いたものと同じで、Read/Writeの低レベルなものです。上のページにはサンプルコードが載っています。こんな感じです(そのままだと動かないので修正しています)。ChatのサーバはPythonで以前書いたものです。
package main

import (
 "websocket"
    "bytes"
 "fmt"
)

func main() {
  ws, err := websocket.Dial("ws://localhost:5000/chat", "", "http://localhost:5000/");
  if err != nil {
  panic("Dial: " + err.String())
 }
 if _, err := ws.Write([]byte("hello, world!\n")); err != nil {
  panic("Write: " + err.String())
 }
 var msg = make([]byte, 512);
 if n, err := ws.Read(msg); err != nil {
  panic("Read: " + err.String())
 } else {
  var b = bytes.NewBuffer(msg[0:n])
  fmt.Printf(b.String())
 }
}

goだと、クライアントはDialなんですね。なかなか素敵です。Dialの第2引数がプロトコルを指定するみたいなんですが、何なんでしょう?URLでプロトコルは分かると思います。第3引数はoriginです。僕の書いたPythonのクライアントはoriginはurlから決めていました。originは外部から与えないといけないのかな?wssの場合はhttpsでwsの場合はhttpでいいような気がするし(自分で書いたものはプロトコル切り替えていない・・・)、originとurlのホスト名とかがずれることがあるのか、よく分かりません。そもそも、originが何のために必要なのかもよく分かっていないのですが・・・。
Websocketは何気によく分からないことが多いです。

0 件のコメント: