Go WebSocket 简单使用

栏目: Html5 · 发布时间: 5年前

内容简介:WebSocket在 HTML5 游戏和网页消息推送都使用比较多。WebSocket 是 HTML5 的重要特性,它实现了基于浏览器的远程socket,它使浏览器和服务器可以进行全双工通信。WebSocket 具体的特性和 http 的区别这里就不多说,可以去自己查一下。Go 官方没有提供对 WebSocket 的支持,必须选择第三方提供的包。《Go Web 编程》一书中的例子使用了

WebSocket在 HTML5 游戏和网页消息推送都使用比较多。WebSocket 是 HTML5 的重要特性,它实现了基于浏览器的远程socket,它使浏览器和服务器可以进行全双工通信。

WebSocket 具体的特性和 http 的区别这里就不多说,可以去自己查一下。

Go 官方没有提供对 WebSocket 的支持,必须选择第三方提供的包。《Go Web 编程》一书中的例子使用了 golang.org/x/net 下的 websocket 包。 另外一个使用比较多的是 gorilla/websocket ,我接触的项目是使用的这个。下面我就以 gorilla/websocket 来写一个简单的通信示例。

gorilla/websocket 的资料参考:

GitHub: https://github.com/gorilla/websocket

Doc: https://godoc.org/github.com/gorilla/websocket

gorilla/websocket 接口简述

Upgrader

Upgrader 用于升级 http 请求,把 http 请求升级为长连接的 WebSocket。结构如下:

type Upgrader struct {
    // 指定升级 websocket 握手完成的超时时间
    HandshakeTimeout time.Duration

    // 指定 io 操作的缓存大小,如果不指定就会自动分配。
    ReadBufferSize, WriteBufferSize int

    // 写数据操作的缓存池,如果没有设置值,write buffers 将会分配到链接生命周期里。
    WriteBufferPool BufferPool

    //按顺序指定服务支持的协议,如值存在,则服务会从第一个开始匹配客户端的协议。
    Subprotocols []string

    // 指定 http 的错误响应函数,如果没有设置 Error 则,会生成 http.Error 的错误响应。
    Error func(w http.ResponseWriter, r *http.Request, status int, reason error)

    // 请求检查函数,用于统一的链接检查,以防止跨站点请求伪造。如果不检查,就设置一个返回值为true的函数。
    // 如果请求Origin标头可以接受,CheckOrigin将返回true。 如果CheckOrigin为nil,则使用安全默认值:如果Origin请求头存在且原始主机不等于请求主机头,则返回false
    CheckOrigin func(r *http.Request) bool

    // EnableCompression 指定服务器是否应尝试协商每个邮件压缩(RFC 7692)。 
    // 将此值设置为true并不能保证将支持压缩。 
    // 目前仅支持“无上下文接管”模式
    EnableCompression bool
}

func (*Upgrader) Upgrade

Upgrade 函数将 http 升级到 WebSocket 协议。定义如下:

// responseHeader包含在对客户端升级请求的响应中。 
// 使用responseHeader指定cookie(Set-Cookie)和应用程序协商的子协议(Sec-WebSocket-Protocol)。
// 如果升级失败,则升级将使用HTTP错误响应回复客户端
// 返回一个 Conn 指针,拿到他后,可使用 Conn 读写数据与客户端通信。
func (u *Upgrader) Upgrade(w http.ResponseWriter, r *http.Request, responseHeader http.Header) (*Conn, error)

使用实例

type WsServer struct {
    ......
    upgrade  *websocket.Upgrader
}

func NewWsServer() *WsServer {
    
    ws.upgrade = &websocket.Upgrader{
        ReadBufferSize:  4096,
        WriteBufferSize: 1024,
        CheckOrigin: func(r *http.Request) bool {
            if r.Method != "GET" {
                fmt.Println("method is not GET")
                return false
            }
            if r.URL.Path != "/ws" {
                fmt.Println("path error")
                return false
            }
            return true
        },
    }
    return ws
}

func (self *WsServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    ......
    conn, err := self.upgrade.Upgrade(w, r, nil)
    if err != nil {
        fmt.Println("websocket error:", err)
        return
    }
    fmt.Println("client connect :", conn.RemoteAddr())
    go self.connHandle(conn)

}

WebSocket 客户端

  • 更新中

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算机视觉

计算机视觉

Richard Szeliski / 艾海舟、兴军亮 / 清华大学出版社 / 2012-1 / 109.00元

《计算机视觉——算法与应用》探索了用于分析和解释图像的各种常用技术,描述了具有一定挑战性的视觉应用方面的成功实例,兼顾专业的医学成像和图像编辑与交织之类有趣的大众应用,以便学生能够将其应用于自己的照片和视频,从中获得成就感和乐趣。本书从科学的角度介绍基本的视觉问题,将成像过程的物理模型公式化,然后在此基础上生成对场景的逼真描述。作者还运用统计模型来分析和运用严格的工程方法来解决这些问题。 本......一起来看看 《计算机视觉》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具