go的websocket实现
这里的Sec-WebSocket-Accept的计算方法是:
base64(hsa1(sec-websocket-key + 258EAFA5-E914-47DA-95CA-C5AB0DC85B11))
如果这个Sec-WebSocket-Accept计算错误浏览器会提示:
Sec-WebSocket-Accept dismatch
如果返回成功,Websocket就会回调onopen事件
websocket的数据传输使用的协议是:
FIN:1位,用来表明这是一个消息的最后的消息片断,当然第一个消息片断也可能是最后的一个消息片断;
RSV1, RSV2, RSV3: 分别都是1位,如果双方之间没有约定自定义协议,那么这几位的值都必须为0,否则必须断掉WebSocket连接;
Opcode:4位操作码,定义有效负载数据,如果收到了一个未知的操作码,连接也必须断掉,以下是定义的操作码:
* %x0 表示连续消息片断
* %x1 表示文本消息片断
* %x2 表未二进制消息片断
* %x3-7 为将来的非控制消息片断保留的操作码
* %x8 表示连接关闭
* %x9 表示心跳检查的ping
* %xA 表示心跳检查的pong
* %xB-F 为将来的控制消息片断的保留操作码
Mask:1位,定义传输的数据是否有加掩码,如果设置为1,掩码键必须放在masking-key区域,客户端发送给服务端的所有消息,此位的值都是1;
Payload length: 传输数据的长度,以字节的形式表示:7位、7+16位、或者7+64位。如果这个值以字节表示是0-125这个范围,那这个值就表示传输数据的长度;如果这个值是126,则随后的两个字节表示的是一个16进制无符号数,用来表示传输数据的长度;如果这个值是127,则随后的是8个字节表示的一个64位无符合数,这个数用来表示传输数据的长度。多字节长度的数量是以网络字节的顺序表示。负载数据的长度为扩展数据及应用数据之和,扩展数据的长度可能为0,因而此时负载数据的长度就为应用数据的长度。
Masking-key:0或4个字节,客户端发送给服务端的数据,都是通过内嵌的一个32位值作为掩码的;掩码键只有在掩码位设置为1的时候存在。
Payload data: (x+y)位,负载数据为扩展数据及应用数据长度之和。
Extension data:x位,如果客户端与服务端之间没有特殊约定,那么扩展数据的长度始终为0,任何的扩展都必须指定扩展数据的长度,或者长度的计算方式,以及在握手时如何确定正确的握手方式。如果存在扩展数据,则扩展数据就会包括在负载数据的长度之内。
Application data:y位,任意的应用数据,放在扩展数据之后,应用数据的长度=负载数据的长度-扩展数据的长度。
参考自http://blog.csdn.net/fenglibing/article/details/6852497
具体使用go的实现例子:
html:
PS:后来发现官方也有实现了websocket,只是它不是在pkg下,而是在net的branch下
强烈建议使用官方的websocket,不要自己写
https://code.google.com/p/go.net/
当然如果自己实现了一遍协议,看官方的包自然会更清晰了。
Go 实现 WebSockets:2. 如何在 Go 中创建 WebSockets 应用程序 上一篇文章我们先介绍了什么是 WebSockets 协议。本篇文章将来介绍如何利用 Go 来实现一个 WebSockets。要基于 net/http 库编写一个简单的 WebSocket 响应服务器,我们需要: 1.建立握手 2.从客户端接收数据帧 3.向客户端发送数据帧 4.关闭握手
Go 实现 WebSockets:1. 什么是 WebSockets 日常工作中,在不刷新页面的情况下发送消息并获得即时响应是我们认为理所当然的事情。但在过去,启用实时功能对开发人员来说是一个真正的挑战。开发者社区从 HTTP 长轮询和 AJAX 走过了漫长的道路,终于找到了构建真正实时应用程序的解决方案。
Go 入门很简单:如何在 Go 中使用日志包 在我们的日常编程中,日志很重要。只要是我们写代码,就有可能出现 Bug。日志文件就是一种快速找到这些 bug,更好地了解程序工作状态的方法。
相关文章
- 【Go命令教程】3. go install
- 【Go命令教程】2. go build
- 如何安装 第三方 Go 离线包? (GOPATH、 go install)
- 手写token解析器、语法解析器、LLVM IR生成器(GO语言)
- Go入门:创建第一个Go工程
- 【Go语言】【8】GO语言的条件语句和选择语句
- 对Python和Go的函数传参研究
- [Go] golang 替换组件包 更新 go.mod, go.sum 的方式
- [Go] Viper 加载项目配置,go build 打包配置文件进二进制
- Atitit golang开发环境搭建 目录 1. 编辑helo.go1 1.1. 调试编译1 2. Ide选择liteide2 3. 问题解决2 4. 附录2 4.1. Go语言标准库常
- Atitit websocket 的前后端实现最佳实践t66 目录 1. 技术选型1 2. 1.首先,在pom.xml引入如下jar包。Java-WebSocket-1.3.0.jar1 3.
- 【Go进阶】了解实践go类型断言
- 【Go环境】配置go环境变量、go mod命令大全
- Go语言自学系列 | golang嵌套结构体
- Go语言自学系列 | go语言数字类型
- go 实现websocket推送
- Go微服务全链路跟踪详解
- 我为什么从python转向go
- Go语言基础:切片slice的声明及使用