websocket

gorilla/websocket的简单使用

安装

$ go get github.com/gorilla/websocket

简介

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
}

func handler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
        return
    }

}

如上所示,conn代表着一个Websocket连接,过使用Upgrade.Upgrade方法,就可以从http请求中 获取一个Websocket的连接句柄,通过使用WriteMessage以及ReadMessage两个方法,就能发送和读取消息

for {
    messageType, p, err := conn.ReadMessage()
    if err != nil {
        log.Println(err)
        return
    }
    if err := conn.WriteMessage(messageType, p); err != nil {
        log.Println(err)
        return
    }
}

在以上的代码中,

  • p代表的是一个切片,其中的值可以是二进制消息(websocket.BinaryMessage)或者文本消息(websocket.TextMessage)
  • messageType是一个整型

当然,在一个应用中,可以通过使用io.WriteCloserio.Reader两个接口来发送和接受Websocket消息 对于发送一个消息来说,可以使用NextWrite方法来获取一个io.WriteClose的实例,并将消息写入,并使用Close方法关闭 对于接收一个消息来说,可以使用NextReader方法来获取io.Reader的实例,并且读取信息,知道读取完毕并返回,例如:

for {
    messageType, r, err := conn.NextReader()
    if err != nil {
        return
    }
    w, err := conn.NextWriter(messageType)
    if err != nil {
        return err
    }
    if _, err := io.Copy(w, r); err != nil {
        return err
    }
    if err := w.Close(); err != nil {
        return err
    }
}

消息控制

Websocket协议定义了三种消息控制语句,close, ping, pong, 调用WriteControl,WriteMessage,NextWrite发送方法是等价的

通过NextReader,ReadMessage或者Read方法向连接句柄发送关闭客户端消息,并且返回*CloseError

使用SetPingHandler以及SetPongHandler方法设置回调函数

results matching ""

    No results matching ""