Websocket
WebSocket可以实现客户端与服务器间双向、基于消息的文本或二进制数据传输。它是浏览器中最靠近套接字的API。但WebSocket连接远远不是一个网络套接字,因为浏览器在这个简单的API之后隐藏了所有的复杂性,而且还提供了更多服务:
- 连接协商和同源策略;
- 与既有HTTP基础设施的互操作;
- 基于消息的通信和高效消息分帧;
- 子协议协商及可扩展能力。
WebSocket资源URL采用了自定义模式:ws表示纯文本通信(如ws://example.com/socket),wss表示使用加密信道通信(TCP+TLS)。
使用
本例用gin框架,引入github.com/gorilla/websocket包,项目源码可到https://github.com/shidawuhen/asap/tree/feature_pzq_longconnect查看
服务端核心代码:
ping函数,将请求升级为websocket。另外只有Get请求才能进行升级。当客户端请求ping时,便建立了长连接,服务端读取客户端数据,如果数据为ping,则返回pong,如果不为ping,则把输入的内容返回。
1 | package main |
客户端核心代码:
本人前端知识匮乏,简单做了一版,大家后面可以优化。
- 要使用websocket,客户端必须发起websocket请求
- websocket的建立和使用也很方便,主要涉及
- new WebSocket:创建websocket对象
- onopen:连接建立时触发
- onmessage:客户端接收服务端数据时触发
- onerror:通信发生错误时触发
- onclose:连接关闭时触发
该代码块的主要功能是和服务端建立连接,在文本框输入信息,将信息发送给服务端,并将服务端返回内容显示出来
1 |
|
服务端运行起来之后,请求http://localhost:9090/longconnecthtml即可查看效果
展示
- 大家打开浏览器,便可看到该请求为websocket请求,而且为pending状态
- 另外也可以查看到在发起请求的时候,request header中有很多新的参数,具体含义大家可以看我提供的参考资料
- console中显示的是服务端推送到客户端的数据
参考资料
- golang长连接和短连接的学习
- https://www.zhihu.com/question/22925358
- Golang-长连接-状态推送
- https://www.sohu.com/a/337381368_657921 Golang实现单机百万长连接服务 - 美图的三年优化经验
- https://blog.csdn.net/zaimeiyeshicengjing/article/details/94456453 golang 长连接web socket原理
- https://blog.csdn.net/zaimeiyeshicengjing/article/details/94463243 golang Gin建立长连接web socket
- https://www.runoob.com/html/html5-websocket.html HTML5 WebSocket