import "websocket"

websocketパッケージは、Web Socketプロトコルのクライアントおよびサーバを実装しています。このプロトコルは、http://tools.ietf.org/html/draft-hixie-thewebsocketprotocolにて定義されています。

パッケージファイル

client.go server.go websocket.go

変数

var (
    ErrBadScheme            = os.ErrorString("bad scheme")
    ErrBadStatus            = &ProtocolError{"bad status"}
    ErrBadUpgrade           = &ProtocolError{"missing or bad upgrade"}
    ErrBadWebSocketOrigin   = &ProtocolError{"missing or bad WebSocket-Origin"}
    ErrBadWebSocketLocation = &ProtocolError{"missing or bad WebSocket-Location"}
    ErrBadWebSocketProtocol = &ProtocolError{"missing or bad WebSocket-Protocol"}
    ErrChallengeResponse    = &ProtocolError{"mismatch challange/response"}
)

Conn型

Connは、Web Socketと通信するチャネルです。この型はnet.Connインタフェースの実装です。

type Conn struct {
    // The origin URI for the Web Socket.
    Origin string
    // The location URI for the Web Socket.
    Location string
    // The subprotocol for the Web Socket.
    Protocol string
    // contains unexported fields
}

Dial関数

func Dial(url, protocol, origin string) (ws *Conn, err os.Error)

Dialは、Web Socketへの新しいクライアント接続を開きます。

下は、簡単なクライアントの例です。

package main

import (
 	"websocket"
 	"strings"
)

func main() {
 	ws, err := websocket.Dial("ws://localhost/ws", "", "http://localhost/");
 	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())
	}
	// use msg[0:n]
}

(*Conn) Close関数

func (ws *Conn) Close() os.Error

Closeは、Connへのio.Closerインタフェースの実装です。

(*Conn) LocalAddr関数

func (ws *Conn) LocalAddr() net.Addr

LocalAddrは、この接続のWeb Socketのoriginを返します。

(*Conn) Read関数

func (ws *Conn) Read(msg []byte) (n int, err os.Error)

Readは、Connへのio.Readerインタフェースの実装です。

(*Conn) RemoteAddr関数

func (ws *Conn) RemoteAddr() net.Addr

RemoteAddrは、この接続のWeb Socketのlocationを返します。

(*Conn) SetReadTimeout関数

func (ws *Conn) SetReadTimeout(nsec int64) os.Error

SetReadTimeoutは、この接続のネットワークリードタイムアウト値をナノ秒単位で設定します。

(*Conn) SetTimeout関数

func (ws *Conn) SetTimeout(nsec int64) os.Error

SetTimeoutは、この接続のタイムアウト値をナノ秒単位で設定します。

(*Conn) SetWriteTimeout関数

func (ws *Conn) SetWriteTimeout(nsec int64) os.Error

SetWritetTimeoutは、この接続のネットワークライトタイムアウト値をナノ秒単位で設定します。

(*Conn) Write関数

func (ws *Conn) Write(msg []byte) (n int, err os.Error)

Writeは、Connへのio.Writerインタフェースの実装です。

DialError型

type DialError struct {
    URL      string
    Protocol string
    Origin   string
    Error    os.Error
}

func (*DialError) String

func (e *DialError) String() string

Draft75Handler型

Draft75Handlerは、draft-hixie-thewebsocketprotocol-75(近日中に廃止)をベースにしたWeb Socketへのインタフェースです。

type Draft75Handler func(*Conn)

(Draft75Handler) ServeHTTP関数

func (f Draft75Handler) ServeHTTP(w http.ResponseWriter, req *http.Request)

ServeHTTPは、Web Socket用のhttp.Handlerインタフェースの実装です。

Handler型

Handlerは、WebSocketへのインタフェースです。

下は、簡単なサーバの例です。

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.Handler(EchoServer));
	err := http.ListenAndServe(":12345", nil);
	if err != nil {
		panic("ListenAndServe: " + err.String())
	}
}
type Handler func(*Conn)

(Handler) ServeHTTP関数

func (f Handler) ServeHTTP(w http.ResponseWriter, req *http.Request)

ServeHTTPは、Web Socket用のhttp.Handlerインタフェースの実装です。

ProtocolError型

type ProtocolError struct {
    os.ErrorString
}

WebSocketAddr型

WebSocketAddrは、Web Socket用のnet.Addrの実装です。

type WebSocketAddr string

(WebSocketAddr) Network関数

func (addr WebSocketAddr) Network() string

Networkは、Web Socketのネットワークタイプ、”websocket”を返します。

(WebSocketAddr) String関数

func (addr WebSocketAddr) String() string

Stringは、Web Socketのネットワークアドレスを返します。