Blogger Syntax Highliter

Tuesday, June 1, 2010

HTML5 の WebSocket Draft76

最近気になっている技術としてHTML5があります。とは言ってもcanvasとか絵を動かす方は1年以上前ですが。

で、特に最近注目している箇所として、WebSocketがあります。まだ、ドラフト段階で日々RFCや様々な実装が更新されています。Socketと名前がついているので試してみたくなるじゃないですか。

Socketと入ってもTCPを使用したプロトコルになっており、TCPの3Way-Handshake後に、HTTP GETベースの2WayのHandshakeがあります。

今回は、サーバとしてgoのwebsocketパッケージと、chromeを使用しました。

goは、googleが出しているdraft-hixie-thewebsocketprotocol-76の実装がされている状態で、chromeは、draft-hixie-thewebsocketprotocol-75の物がリリースされている状態でしたので、当然繋がりません。

Draft76で繋ぎたかったのですが仕方なく、goのwebsocketをDraft75Handlerとして使う事によりDraft75でChromeと接続する事ができました。

Handshake時にクライアントからの要求で送られてくるHTTPヘッダ
Upgrade:
Connection:
Origin:
Sec-Websocket-Key1: <- Draft76で追加 Sec-Websocket-Key2: <- Draft76で追加 go内のサンプルコードをDraft75にした場合のコード。
package main

import (
  "http"
  "io"
  "websocket"
)

// Echo the data received on the Web Socket.
func EchoServer(ws *websocket.Conn) {
  io.Copy(ws, ws);
}

func main() {
  http.Handle("/echo", websocket.Draft75Handler(EchoServer));
  err := http.ListenAndServe(":12345", nil);
  if err != nil {
    panic("ListenAndServe: " + err.String())
  }
}

ChromiumのソースにはDraft76の実装はされているので、今後リリースされるChromeではDraft76で試せればと思います。
あとは、CluscoreのReactor patternなネットワークエンジンにWebSocketを実装しなければいけませんね。

goのDraft76対応箇所
http://code.google.com/p/go/source/detail?spec=svn3f986a031b92a1b3cdaa3c3fceff19692ff21170&r=ef24ea09359c372ec0943aae5f42b3ff337e4713

ChromiumのDraft76対応箇所
http://codereview.chromium.org/1108002