go java websocket_Go WebSocket 简单使用

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

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

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

gorilla/websocket 接口简述

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 客户端

更新中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值