Golang websocket协议使用浅析
作者:Sahm5k 时间:2024-02-07 14:19:28
WebSocket与HTTP协议的主要区别
HTTP 和 WebSocket 协议的区别 HTTP 是单向的,而 WebSocket 是双向的。
在客户端和服务器之间的通信中,每个来自客户端的 HTTP 请求都会建立一个新的连接,并在从服务器收到响应后关闭,而WebSocket连接只建立一次,并在服务器或客户端终止连接之前重复使用。
HTTP 的空闲连接的超时时间为 60 秒。可用于响应时间非常短的调用。
WebSocket 空闲连接的超时时间为 3600 秒(1 小时),可应用于响应时间长于 60 秒的调用,最大连接数为 250。
WebSocket服务器
首先,创建一个 HTTP 服务器。在这个服务器中,创建一个用于处理 WebSocket 连接的函数 handleWebSocket。
其实就是开启一个http服务器。
func HandleWebSocket(w http.ResponseWriter, r *http.Request) {
}
func main() {
http.HandleFunc("/ws", HandleWebSocket)
http.ListenAndServe(":8080", nil)
}
然后在该函数中,使用 gorilla/websocket 包来处理 WebSocket 连接。
1.建立upgrade变量。
websocket协议建立连接的握手过程就是http协议的头部加入了upgrade字段(upgrade:websocket)。
首先要导入"github.com/gorilla/websocket"包
var upgrade = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
CheckOrigin: func(r *http.Request) bool {
return true
},
}
2.升级http连接成websocket连接,处理websocket连接
将http连接头部加入upgrade字段,成为websocket协议。
func HandleHome(w http.ResponseWriter, r *http.Request) {
//升级成websocket
conn, err := upgrade.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
}
//websocket读写逻辑
for {
messageType, p, err := conn.ReadMessage()
if err != nil {
log.Println(err)
return
}
log.Println("receive:", string(p))
conn.WriteMessage(messageType, []byte("hello, i am server"))
}
}
WebSocket客户端
客户端主要是用来测试websocket服务器是否正确工作的,下面提供两种websocket服务器。
html+js实现
<!DOCTYPE html>
<html>
<head>
<title>WebSocket Test</title>
</head>
<body>
<script>
var ws = new WebSocket("ws://localhost:8080/ws");
ws.onopen = function() {
console.log("WebSocket connection opened.");
ws.send("Hi From the Client!")
};
ws.onmessage = function(event) {
console.log("Received message: " + event.data);
};
ws.onclose = function() {
console.log("WebSocket connection closed.");
};
ws.onerror = function(event) {
console.log("WebSocket error: " + event.data);
};
</script>
</body>
</html>
利用golang websocket包实现
func WebSocketClient() {
conn, _, err := websocket.DefaultDialer.Dial("ws://127.0.0.1:8080/ws", nil)
if err != nil {
panic(err)
}
defer conn.Close()
for {
time.Sleep(time.Second)
conn.WriteMessage(websocket.TextMessage, []byte("hi i am client"))
_, p, err := conn.ReadMessage()
if err != nil {
log.Println(err)
}
println("client recv:", string(p))
}
}
来源:https://blog.csdn.net/weixin_44866921/article/details/130736131
标签:Go,GoLang,websocket,协议
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
python读取yaml文件后修改写入本地实例
2021-12-20 02:53:54
Python中关键字is与==的区别简述
2022-07-09 10:32:09
JS判断浏览器类型与版本的实现代码
2024-05-13 10:36:32
详解javascript中var与ES6规范中let、const区别与用法
2024-05-09 15:06:17
详解mysql数据库中文乱码问题
2024-01-23 05:34:56
![](https://img.aspxhome.com/file/2023/0/67070_0s.jpg)
python使用pygame模块实现坦克大战游戏
2022-01-15 01:30:38
![](https://img.aspxhome.com/file/2023/8/99418_0s.png)
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
2024-06-05 09:40:40
![](https://img.aspxhome.com/file/2023/5/122505_0s.png)
Python实现滑雪小游戏
2023-08-10 15:30:03
![](https://img.aspxhome.com/file/2023/7/66397_0s.gif)
vue实现瀑布流组件滑动加载更多
2024-05-02 17:09:45
pytorch获取模型某一层参数名及参数值方式
2022-07-03 06:10:28
修改Linux下MySQL 5.0的默认连接数
2009-09-01 10:16:00
Python自定义scrapy中间模块避免重复采集的方法
2022-02-19 13:32:44
Perl哈希表用法解析
2023-08-23 19:12:48
PHP结构型模式之代理模式
2023-05-25 06:55:34
js表单验证控制代码大全
2010-03-07 14:25:00
MySQL自定义函数和存储过程示例详解
2024-01-27 15:25:02
Blender Python编程实现批量导入网格并保存渲染图像
2021-06-09 04:21:20
![](https://img.aspxhome.com/file/2023/5/124965_0s.jpg)
10个不为人知的Google失败作品
2008-05-24 16:56:00
![](https://img.aspxhome.com/file/UploadPic/20085/24/200852417924655s.jpg)
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
2022-07-03 20:51:47
pandas使用之宽表变窄表的实现
2022-04-21 06:04:02
![](https://img.aspxhome.com/file/2023/2/99702_0s.jpg)