2014年9月18日木曜日

Golang Cafe #47

9/14(日)に開催された「Golang Cafe #47」に参加してきました。

参加者は主催の +Takashi Yokoyama さん、+Takanobu Hagino さん、私の3名でした。

今回はGoでWebSocketを叩きました。週中にHaginoさんが先行して触られていたので、要所で説明を頂きながら進めて行きました。

まずはgolang-samples/websocket/simpleのソース(main.goとindex.html)とgo.net/websocketのドキュメントをにらめっこしました。

クライアント側のサンプルとして、昨年、Haginoさん主催で開催された「HTML5を業務アプリで使うための勉強会」でのファイルが紹介されたので懐かしかったです。
# サンプルの中で対象となるファイルは「sample01.html」と「sample01.js」です。

途中、Goをソースからビルドしていた「Yokoyama@早すぎる男」さんが「Go 1.4からはsrc/pkgはsrc/に変更」にハマっていて作業が遅れていた事が発覚。それに触発されて「Hagino@先走る男」さんもGo 1.4化にチャレンジしたのですが「Windowsの最新ビルドはfail中」にハマってしまってGo 1.3.1に戻られていました。
# 私ができたのは、そんなお二人の姿を向かいの席から暖かく見守ることのみ...q@w@p

その後、Haginoさんから「チャットを作ってみよう」という提案があったので、そちらにチャレンジしましたが、私の結果は半分成功で半分失敗(^^;) 原因はHaginoさん作のソースを中途半端に実装していたためでした。

ちなみに、半分成功で半分失敗の挙動は、Webブラウザーにて2つのウィンドウからアクセスした後、メッセージを送ると片方のウィンドウにしか表示されないというものです。

以下、記録として、そんな私の半々ソース(?)です。

package main

import (
        "code.google.com/p/go.net/websocket"
        "io"
        "net/http"
        "sync"
)

var (
        mux       sync.Mutex
        clientMap = make(map[*websocket.Conn]bool)
)

func addClient(ws *websocket.Conn) {
        mux.Lock()
        defer mux.Unlock()
        _, ok := clientMap[ws]
        if !ok {
                clientMap[ws] = true
        }
}

func echoHandler(ws *websocket.Conn) {
        addClient(ws)
        for k, _ := range clientMap {
                io.Copy(k, ws)
        }
}

func main() {
        http.Handle("/echo", websocket.Handler(echoHandler))
        http.Handle("/", http.FileServer(http.Dir(".")))
        err := http.ListenAndServe(":8080", nil)
        if err != nil {
                panic("ListenAndServe: " + err.Error())
        }
}

後日、タイムリーにQiitaへ「WebSocketをGoで触ってみた」という記事が投稿されたので、見直しておきます。

次回は、9/11(木)に東京で開催された「GolangTestNight (Gunosy.go#10)」の各発表資料を読み進めるようです。

0 件のコメント: