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.WriteCloser
和io.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
方法设置回调函数