LoginSignup
11
12

More than 5 years have passed since last update.

Go で WebSocket を簡単に扱えるパッケージを作った

Last updated at Posted at 2016-08-31

趣味で Go 言語で WebSocket サーバーを書いてるんですが、そこで使ってる WebSocket コネクションのハンドリング部分をパッケージとして切り出したら便利なんじゃないかと思って切り出してみました。ベースは github.com/gorilla/websocket です。

インストール方法

$ go get github.com/shiwano/websocket-conn

使い方

func Connect(ctx context.Context, settings Settings, url string, requestHeader http.Header) (*Conn *http.Response, error)
func UpgradeFromHTTP(ctx context.Context, settings Settings, w http.ResponseWriter, r *http.Request) (*Conn, error)

type Conn struct {
    Stream() <-chan Data
    Err() error
    SendBinaryMessage(data []byte) error
    SendTextMessage(text string) error
}

サンプルコード

サーバー側:

package main

import (
    "context"
    "net/http"
    "github.com/shiwano/websocket-conn"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        ctx, cancel := context.WithCancel(context.Background())
        defer cancel()

        c, err := conn.UpgradeFromHTTP(ctx, conn.DefaultSettings(), w, r)
        if err != nil {
            w.Write([]byte("Error"))
            return
        }
        d := <-c.Stream()
        c.SendTextMessage(d.Message.Text() + " World")
        cancel()
    })
    http.ListenAndServe(":5000", nil)
}

クライアント側:

package main

import (
    "context"
    "log"
    "github.com/shiwano/websocket-conn"
)

func main() {
    c, _, err := conn.Connect(context.Background(), conn.DefaultSettings(), "ws://localhost:5000", nil)
    if err != nil {
        log.Fatal(err)
    }
    c.SendTextMessage("Hello")
    d := <-c.Stream()
    log.Println(d.Message.Text()) // Hello World
    for d := range c.Stream() {
        if d.EOS {
            log.Println("Closed: ", c.Err())
        }
    }
}

上記のコードをそれぞれ実行したら、クライアント側で Hello World と出力されるはずです。こんな感じでけっこうお手軽に WebSocket サーバーとそのクライアントを作れるので、よかったら使ってみてください(´・ω・`)

11
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
12