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
0
投稿
猜你喜欢
- 一、引言池化技术在Java中应用的很广泛,简而论之,使用对象池存储某个实例数受限制的实例,开发者从对象池中获取实例,使用完之后再换回对象池,
- 前言首先,先说明我只是初步接触yolov7,写这篇文章的主要目的是可以让大家快速应用自己的数据集进行训练。没有接触过yolov5也没有关系,
- 使用matplotlib生成图片,想要背景透明,而且图例部分也显示透明效果,找到了大概的设置方法,特此记录。# coding=utf-8#
- 前言其实我觉得接口测试很简单,比一般的功能测试还简单(这话我先这样说,以后可能会删O(∩_∩)O哈!),现在
- 记住:这时候08安装的时候要自定义一个实例 比如:mysql2008(不能在使用默认实例了) sql server 2008 express
- 一、字符串离散化示例对于一组电影数据,我们希望统计电影分类情况,应该如何处理数据?(每一个电影都有很多个分类)思路:首先构造一个全为0的数组
- 开发一个相机应用,需要申请三个权限:相机、读文件、写文件。1、在AndroidManifest.xml中添加<uses-permiss
- 前言JS为什么要用ajax来提交在使用from提交时,浏览器会向服务器发送选中的文件的内容而不仅仅是发送文件名。为安全起见,即file-up
- pyx文件是python的c扩展文件,代码要符合cython的规范,用什么编辑器写都行。我在eric4上写的,结果它默认用python解释器
- 本文实例讲述了Django框架使用内置方法实现登录功能。分享给大家供大家参考,具体如下:一 内置登录退出思维导图二 Dj
- 我就废话不多说了,直接上代码吧!# -*- coding: utf-8 -*-"""Created on Th
- 1 简介在日常运行程序的过程中常常涉及到循环迭代过程,对于执行时间很短的程序来说倒无所谓,但对于运行过程有明显耗时的涉及循环迭代的程序,为其
- 开发环境的搭建是一件入门比较头疼的事情,在上期的文稿基础上,增加一项Anaconda的安装介绍。Anaconda是Python的一个发行版本
- PDOStatement::closeCursorPDOStatement::closeCursor — 关闭游标,使语句能再次被执行。(P
- easy_thumbnails:A powerful, yet easy to implement thumbnailing applica
- 今天填一个坑,俄罗斯方块!!俄罗斯方块的移动不难实现,但是旋转就不太容易实现,究其原因是因为Python中没有数组这种数据结构,所以不能用矩
- 摘要主要是介绍python 的回调函数callback。什么是回调函数当程序运行是,一般情况下,应用程序会时常通过API调用库里所预先备好的
- 1、DOMWEB标准现在可真是热门中热门,不过下面讨论的是一个不符合标准的document.all[]。DOM--DOCUMENTOBJEC
- 此次遇到的问题是在import pycurl 时报错pycurl:libcurl link-time version is older th
- 在使用Python绘制图表前,我们需要先安装两个库文件numpy和matplotlib。Numpy是Python开源的数值计算扩展,可用来存