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

4.网络编程-websocket(golang)

目录

什么是websocket

golang中使用websocket

Server端

Client端 


什么是websocket

WebSocket是一种在互联网上提供全双工通信的协议,即允许服务器和客户端之间进行双向实时通信的网络技术。它是作为HTML5的一部分标准化的,旨在解决传统HTTP协议在实时性、长连接方面存在的不足。

以下是WebSocket的主要特点和工作方式:

  1. 双向通信:不同于HTTP请求-响应模式的单向通信,WebSocket允许服务器和浏览器(或客户端)都能发起数据传输,实现实时的数据交互。

  2. 持久连接:一旦WebSocket握手成功建立,浏览器和服务器之间会保持一个持续打开的TCP连接,无需为每个数据包都重新建立连接。

  3. 基于TCP:WebSocket协议是基于TCP的,确保了数据可靠传输。

  4. 轻量级协议:虽然WebSocket握手阶段借用了一些HTTP的概念,但随后的数据传输则采用专有的简洁二进制帧格式,有效减少了头部开销,更适合实时通信场景。

  5. 事件驱动:WebSocket API是事件驱动的,开发者可以通过监听各种事件(如open、message、error、close)来处理连接状态变化和数据接收。

  6. 低延迟:由于避免了HTTP的“请求-响应”循环,WebSocket能够减少不必要的延迟,对于实时聊天、游戏、股票报价、协同编辑等应用场景尤为适用。

WebSocket的工作流程始于一次特殊的HTTP请求,通过升级协议(Upgrade)头信息,客户端请求将HTTP连接转换为WebSocket连接。如果服务器同意升级,那么双方就进入WebSocket协议的通信阶段,直至连接关闭为止。

golang中使用websocket

在Go语言中使用WebSocket,您可以使用第三方库如github.com/gorilla/websocket来实现。以下是一个基本的WebSocket服务器端和客户端示例:

go get -u github.com/gorilla/websocket

Server端

package mainimport ("log""net/http""github.com/gorilla/websocket"
)var upgrader = websocket.Upgrader{ReadBufferSize:  1024,WriteBufferSize: 1024,CheckOrigin: func(r *http.Request) bool {return true // 允许所有源,生产环境中应根据需要设置更严格的CORS策略},
}func serveWs(w http.ResponseWriter, r *http.Request) {conn, err := upgrader.Upgrade(w, r, nil)if err != nil {log.Println("Failed to set up WebSocket connection:", err)return}defer conn.Close()for {// 读取客户端发送的消息msgType, msg, err := conn.ReadMessage()if err != nil {log.Println("Failed to read WebSocket message:", err)break}log.Printf("Received message from client: %s", msg)// 假设我们只是简单地将接收到的消息回传给客户端err = conn.WriteMessage(msgType, msg)if err != nil {log.Println("Failed to send WebSocket message:", err)break}}
}func main() {http.HandleFunc("/ws", serveWs)log.Println("Starting WebSocket server on :8080...")err := http.ListenAndServe(":8080", nil)if err != nil {log.Fatal("Error starting server:", err)}
}

Client端 

package mainimport ("github.com/gorilla/websocket""log""net/url"
)func main() {u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/ws"}log.Printf("Connecting to %s", u.String())c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)if err != nil {log.Fatal("Failed to connect to WebSocket server:", err)}defer c.Close()err = c.WriteMessage(websocket.TextMessage, []byte("Hello from client!"))if err != nil {log.Println("Failed to send message:", err)return}_, msg, err := c.ReadMessage()if err != nil {log.Println("Failed to receive message:", err)return}log.Printf("Received message from server: %s", msg)
}

在这个简单的示例中,服务器端创建了一个WebSocket升级器(upgrader),用于将HTTP请求升级为WebSocket连接。当客户端连接到/ws端点时,服务器端会创建一个新的WebSocket连接并进入一个无限循环,不断地读取客户端发送的消息并将其回传给客户端。

客户端则使用默认的Dialer连接到服务器,发送一条消息("Hello from client!"),然后接收并打印来自服务器的回复。在实际应用中,您需要根据需求扩展和定制这些基础功能,例如处理不同类型的WebSocket消息、实现消息广播、连接管理等。

相关文章:

4.网络编程-websocket(golang)

目录 什么是websocket golang中使用websocket Server端 Client端 什么是websocket WebSocket是一种在互联网上提供全双工通信的协议,即允许服务器和客户端之间进行双向实时通信的网络技术。它是作为HTML5的一部分标准化的,旨在解决传统HTTP协议在实…...

docker安装部署mysql后忘记root密码

应用场景是:用docker安装完mysql后,使用安装时候设置的密码登录不上MySQL; 1、修改docker映射出mysql的配置文件:my.cnf 在mysqld最下方添加skip-grant-tables进入安全模式(随意一个密码即可登录mysql) [m…...

c++的学习之路:14、list(1)

本章讲一下如何使用list,代码在文章末 目录 一、list介绍 二、增 三、删 四、查和改 五、交换 六、代码 一、list介绍 首先还是看一看官方文档的介绍如下图,如下方五点: 1. list是可以在常数范围内在任意位置进行插入和删除的序列式…...

huawei 华为交换机 配置 VLAN 聚合示例

组网需求 某公司拥有多个部门且位于同一网段,为了提升业务安全性,将不同部门的用户划分到不同VLAN 中,如 图 5-7 所示, VLAN2 和 VLAN3 属于不同部门。各部门均有访问Internet需求,同时由于业务需要,不同部…...

【QT+QGIS跨平台编译】056:【pdal-dimbuilder+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdal介绍二、dimbuilder介绍三、pdal下载四、文件分析五、pro文件六、编译实践七、生成Dimension.hpp八、生成pdal_features.hpp一、pdal介绍 PDAL(Point Data Abstraction Library)是一个开源库,用于处理点云数据的获取、过滤、转换、分析和…...

【Python】探索Python中的aiohttp:构建高效并发爬虫

后来 我总算学会了 如何去爱 可惜你 早已远去 消失在人海 后来 终于在眼泪中明白 有些人 一旦错过就不再 🎵 HouZ/杨晓雨TuTu《后来》 在数据密集和网络密集的任务中,提高程序的执行效率是非常重要的。Python作为一门强大的编程语言…...

创建真实项目vue2项目

1. 创建 vue create 项目名 2. 选择自定义 3. 勾选以下必备选项 4.选择使用vue2 5. 选择哈希模式(n); css选择Less 6. ESLint校验 选择 7. 保存(按照默认) 8. 在哪里添加ESLint文件 9. 要不要把这个改成将来的预设&am…...

【大数据】安装hive-3.1.2

1、上传HIVE包到/opt/software目录并解压到/opt/modules/ tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /opt/modules/ 2、修改路径 mv /opt/modules/apache-hive-3.1.2-bin/ /opt/modules/hive 3、将hIVE下的bin目录加入到/etc/profile中 export HIVE_HOME/opt/module…...

STM32工程 如何设置堆栈大小(Heap和Stack)

方法1:通过CubeMX、CubeIDE 配置 方法2:直接在启动文件中修改 (适合所有Keil工程) Heap、Stack的值大小,不管使用哪种开发环境,它俩都肯定在启动文件中。 可以通过CtrlF,搜索: Heap&#xff0…...

光纤资源运维管理升级方案,让您的网络资产价值倍增!

光纤资源管理的现状与风险 1. 管理现状 ▌▶ 排查难 ▌▶ 跟踪难 2. 潜在风险 故障隐患 资源丢失 增加业务中断时长 纤心占用不清 障排查复杂 运维压力巨大 基于数字孪生物联网技术的数字化管理升级方案 1. 快速创建光纤资源数字孪生空间 市级 区级 街道 光缆 机房 机柜 2…...

【深度学习】最强算法之:深度Q网络(DQN)

深度Q网络 1、引言2、深度Q网络2.1 定义2.2 原理2.3 实现方式2.4 算法公式2.5 代码示例 3、总结 1、引言 小屌丝:鱼哥, 马上清明小长假了, 你这准备去哪里玩啊? 小鱼:哪也不去,在家待着 小屌丝&#xff1a…...

微软文本转语音和语音转文本功能更新,效果显著!

今天我要和大家分享一个新功能更新——微软的文本转语音和语音转文本功能。最近,微软对其AI语音识别和语音合成技术进行了重大升级,效果非常好,现在我将分别为大家介绍这两个功能。 先来听下这个效果吧 微软文本转语音和语音转文本功能更新 …...

充场拉新工作室保证金靠谱吗?找一手渠道是否免费?

在当前的互联网经济中,充场拉新工作室作为一种新兴的创业项目,吸引了众多创业者的关注。然而,关于是否需要支付保证金、加盟费,以及如何寻找免费的充场拉新一手渠道,许多人仍然存在疑问。 本文将为您提供专业的解答&a…...

揭秘淘宝商品详情数据接口(Taobao.item_get)

淘宝商品详情数据接口(Taobao.item_get)是一种允许开发者通过API访问淘宝平台上的商品详情信息的接口。通过该接口,开发者可以获取到商品的标题、价格、销量、描述等详细信息,为商品展示和销售提供数据支持。 请求示例&#xff0…...

Linux从入门到精通 --- 4(上).快捷键、软件安装、systemctl、软链接、日期和时区、IP地址

文章目录 第四章(上):4.1 快捷键4.1.1 ctrl c 强制停止4.1.2 ctrl d 退出4.1.3 history4.1.4 历史命令搜索4.1.5 光速移动快捷键4.1.6 清屏 4.2 软件安装4.2.1 yum4.2.2 apt 4.3 systemctl4.4 软链接4.4.1 ln 4.5 日期和时区4.5.1 date命令4.5.2 date进行日期加减…...

ESP32调试笔记

目录 基于Thonny和micropythonESP32-CAM开发板无法连接Thonnyesp32cam局域网图传esp32代码上位机代码 基于Thonny和micropython ESP32-CAM开发板无法连接Thonny esp32cam有两个模式:下载模式、运行模式 两种模式的接线不同 IO0 短路 GND ! 正是因为两种模式接线…...

python -- NotOpenSSLWarning: urllib3 v2 only supports OpenSSL 1.1.1+

报错分析 完整的报错:urllib3 v2 only supports OpenSSL 1.1.1, currently the ssl module is compiled with LibreSSL 2.8.3. See: https://github.com/urllib3/urllib3/issues/3020报错分析:LibreSSL 是 OpenSSL 的一个分支,LibreSSL 2.8.…...

解决nginx代理后,前端拿不到后端自定义的header

先说结论,因为前端和nginx对接,所以需要在nginx添加如下配置向前端暴露header add_header Access-Control-Expose-Headers Authorization 排查过程 1.后端设置了Authorization 的响应头作为token的返回,前后端本地联调没有问题 response.s…...

C++从入门到精通——类的6个默认成员函数之构造函数

构造函数 前言一、构造函数的概念二、构造函数特性 前言 类的6个默认成员函数:如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数…...

第十四届蓝桥杯省赛大学B组(C/C++)整数删除

原题链接:整数删除 给定一个长度为 N 的整数数列:A1,A2,...,AN。 你要重复以下操作 K 次: 每次选择数列中最小的整数(如果最小值不止一个,选择最靠前的),将其删除,并把与它相邻的…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...