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消息、实现消息广播、连接管理等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/599643.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Frida】【Android】 10_爬虫之WebSocket协议分析

🛫 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

【C#】yield使用

&#x1f4bb;代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks;namespace ConsoleApp15 {internal class Program{static void Main(string[] args){IEnumerable<int&…

【微服务】面试题(一)

最近进行了一些面试&#xff0c;这几个问题分享给大家 一、分别介绍一下微服务、分布式以及两者的区别 微服务&#xff08;Microservices&#xff09;和分布式系统&#xff08;Distributed Systems&#xff09;是两种不同的软件架构风格&#xff0c;虽然它们之间有些重叠&#…

uniapp极光推送、java服务端集成

一、准备工作 1、进入【服务中心】-【开发者平台】 2、【创建应用】&#xff0c;填写应用名称和图标&#xff08;填写项目名称&#xff0c;项目logo就行&#xff0c;也可填写其他的&#xff09; 3、选择【消息推送】服务&#xff0c;点击下一步 ​ ​ Demo测试 参照文档&…

Stable Diffusion介绍

Stable Diffusion是一种前沿的开源深度学习模型框架&#xff0c;专门设计用于从文本描述生成高质量的图像。这种称为文本到图像生成的技术&#xff0c;利用了大规模变换器&#xff08;transformers&#xff09;和生成对抗网络&#xff08;GANs&#xff09;的力量&#xff0c;以…

css伪类:last-child或:first-child不生效

目录 一、问题 二、原因及解决方法 三、总结 tiips:如嫌繁琐&#xff0c;直接移步总结即可&#xff01; 一、问题 1.想使用伪类:last-child给 for循环出来的最后一个元素单独添加样式。但是发现无论怎么写都没有添加上去。 2.真是奇怪呀&#xff0c;明明写的没有问题呀&a…

【Linux ARM 裸机】开发环境搭建

1、Ubuntu 和 Windows 文件互传 使用过程中&#xff0c;要频繁进行 Ubuntu 和 Windows 的文件互传&#xff0c;需要使用 FTP 服务&#xff1b; 1.1、开启 Ubuntu 下的 FTP 服务 //安装 FTP 服务 sudo apt-get install vsftpd //修改配置文件 sudo vi /etc/vsftpd.conf//重启…

(Git) gitignore基础使用

文章目录 前言.gitignore 模式匹配注释 #转义 \直接匹配任意字符匹配 *单个字符匹配 ?目录分割 /多级目录 **范围匹配 []取消匹配 ! 检查是否生效父子文件END 前言 Git - gitignore Documentation (git-scm.com) 在使用git管理的项目中&#xff0c;可以通过.gitignore文件管理…

Vue3与TypeScript中动态加载图片资源的解决之道

在前端开发中&#xff0c;Vue.js已成为一个备受欢迎的框架&#xff0c;尤其是在构建单页面应用时。Vue3的发布更是带来了许多性能优化和新特性&#xff0c;而TypeScript的加入则进一步提升了代码的可维护性和健壮性。然而&#xff0c;在实际的项目开发中&#xff0c;我们有时会…

前端组件化探索:打造创意Canvas绘图小程序的关键技术与实现

摘要 在前端开发领域&#xff0c;Canvas 绘图已经成为了实现用户交互和视觉展示的重要手段。尤其在移动应用和小程序开发中&#xff0c;Canvas 的应用更为广泛。本文将结合一个实际的创意绘图小程序项目&#xff0c;探讨前端组件化技术在实现绘图功能中的关键作用&#xff0c;…

【分治算法】大整数乘法Python实现

文章目录 [toc]问题描述基础算法时间复杂性 优化算法时间复杂性 Python实现 个人主页&#xff1a;丷从心. 系列专栏&#xff1a;Python基础 学习指南&#xff1a;Python学习指南 问题描述 设 X X X和 Y Y Y都是 n n n位二进制整数&#xff0c;计算它们的乘积 X Y XY XY 基础…

uniapp - 微信小程序 - 使用uCharts的一些问题

文章目录 uniapp - 微信小程序 - 使用uCharts的一些问题一、开发者工具显示正常&#xff0c;真机调试统计图不随页面滚动二、数据过多开启滚动条&#xff0c;无法滑动滚动条三、饼图点击不显示提示窗/点击位置bug、多个同类型统计图点击不显示提示框问题四、 formatter 自定义 …