当前位置: 首页 > news >正文

golang-websocket

WebSocket 是一种新型的网络通信协议,可以在 Web 应用程序中实现双向通信。

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) {//升级成websocketconn, 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))}}
http://www.lryc.cn/news/69298.html

相关文章:

  • Nginx + fastCGI 实现动态网页部署
  • 精彩回顾 | Fortinet Accelerate 2023·中国区巡展厦门站
  • ChatGPT 和对话式 AI 的未来:2023 年的进展和应用
  • Nginx配置WebSocket(WS)和WebSocket Secure(WSS)的完整指南
  • 链表--part 1--链表基础理论(概括)
  • 【V2G】电动汽车接入电网优化调度研究(Matlab代码实现)
  • Excel中时间戳与标准日期格式的互相转换
  • 【Kafka集群】Kafka针对用户做ACL权限控制
  • 国内外数据安全治理框架介绍与分析
  • 【Nodejs】使用Nodejs搭建HTTP服务,并实现公网远程访问
  • 面试题之介绍自己测试的项目,担任的角色和做出的成果
  • HTB靶机012-Valentine-WP
  • 微信小程序nodejs+vue社区居民健康服务系统uniapp
  • 尝试探索水下目标检测,基于yolov5轻量级系列模型n/s/m开发构建海底生物检测系统
  • 大数据Doris(二十四):Doris数据Insert Into导入方式介绍
  • macOS Ventura 13.5beta (22G5027e)发布
  • 基于SpringBoot的财务管理系统的设计与实现
  • 使用OpenCV进行肺炎诊断检测
  • 北华大学第九届程序设计竞赛 题解
  • 【Java算法题】剑指offer_01数据结构
  • 最简单配置jenkins容器使用宿主机的docker方法
  • Android aidl及binder基础知识巩固
  • [日记]LeetCode算法·二十五——二叉树⑤ AVL树(插入+删除)附代码实现
  • flink-1.13.6 例子
  • Go语音基于zap的日志封装
  • 可持续能源技术具有改变世界的潜力,并且已经在多个方面展现出积极的影响。
  • Java常用工具之StringUtils类
  • MyBatis-plus的批量插入方式对比分析
  • 【系分论文】论软件开发模型及应用
  • 渗透测试--5.3.使用john破解密码