Golang websocket协议使用浅析
作者:Sahm5k 发布时间:2024-02-07 14:19:28
标签:Go,GoLang,websocket,协议
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


猜你喜欢
- 1、说明(1)写函数时,可以为每个参数指定默认值。当调用函数为参数提供实际参数时,Python将使用指定的实际参数;否则,将使用参数的默认值
- 本文实例讲述了php实现的微信分享到朋友圈并记录分享次数功能。分享给大家供大家参考,具体如下:1.引入JS文件2.通过config接口注入权
- 下面我们将学习两个项目案例代码,分别解决Excel常见场景中的数据筛选问题和数据匹配问题。数据筛选要求我们在表中筛选出符合条件的数据。数据匹
- 什么是Selenium先带领大家学习下Selenium的基本概念吧。Selenium主要用于web应用程序的自动化测试,但并不局限于此,它还
- 一、Flask简介Flask 是一个 Python 实现的 Web 开发微框架。官网:http://flask.pocoo.org/二、De
- 本章的内容完全基于上文的理论基础,实际上一旦理解了索引背后的机制,那么选择高性能的策略就变成了纯粹的推理,并且可以理解这些策略背后的逻辑。示
- function GetRequest() { var
- 故障现象 Oracle Database 11g 数据库普通用户登录时提示 ORA-28002: the password will exp
- ①捕捉一个异常捕捉一个异常以用0作为除数会得到ZeroDivisionError异常为例,print(1/0)为例程序的持续执行,不因该异常
- 目录一. 加载数据1. 继承Dataset类并重写关键方法2. 使用Dataloader加载数据二. 模型设计三. 训练四. 测试结语pyt
- 之前有文章,使用Android平台的OpenCV接入了视频,控制的目标是手机的摄像头,这是OpenCV的好处,使用OpenCV可以使用跨平台
- 一、MySQL数据库的实例管理器概述:1、MySQL数据库的实例管理器(IM)是通过TCP/IP端口运行的后台程序,用来监视和管理MySQL
- ueditor是百度编辑器,在本地的iis环境是可以上传图片了,但放在服务器的iis环境无法上传图片了,经过搜索发现是iis设置问题,引起这
- 1.使用测量工具,量化性能才能改进性能,常用的timeit和memory_profiler,此外还有profile、cProfile、hot
- 以前做音乐项目的时候,最让我们头痛的就是满足用户的问题。在音乐的领域,不要试图去满足所有用户这个定律得到了最充分的验证。究其原因,无非是音乐
- 获取标签内容使用element.attribute()方法获取dom元素的内容,如:dr = driver.find_element_by_
- webconfig配置:<connectionStrings> <add name="MS
- ?? 写在前面现在已经有很多项目团队使用Vue3+TS进行开发,同时也就意味着Vue3的生态越来越完善,如果还是停留在Vue2的阶段已经ou
- 对图像块应用仿射变换,我们将其称为图像扭曲(或者仿射扭曲)。该操作不仅经常应用在计算机图形学中,而且经常出现在计算机视觉算法中。一、仿射变换
- ASP中RegExp是什么 '名字字符检验Public Function CheckName(Str) &nbs