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

Golang Websocket框架:实时通信的新选择

前言

在现代应用程序中,实时通信已经成为了一种必需的特性。而Websocket是一种在客户端和服务器之间建立持久连接的协议,可以实现实时的双向通信。Golang作为一门高效且简洁的语言,也提供了一些优秀的Websocket框架,方便开发者构建实时应用。本文将介绍一些流行的Golang Websocket框架,以及它们的特点和使用方式。

Gorilla Websocket

Gorilla Websocket是Golang中最为知名和广泛使用的Websocket框架之一。它提供了一系列功能强大的工具和库,使得开发者可以轻松地构建高效的实时应用。

特点

  • 支持标准的Websocket协议
  • 提供了高级的API,例如广播、自定义消息处理等
  • 支持分片、压缩、TLS等高级特性
  • 完善的文档和活跃的社区支持

使用示例

下面是一个使用Gorilla Websocket的简单示例:

package mainimport ("log""net/http""github.com/gorilla/websocket"
)var upgrader = websocket.Upgrader{ReadBufferSize:  1024,WriteBufferSize: 1024,
}func echo(w http.ResponseWriter, r *http.Request) {// 将HTTP请求升级为Websocket连接conn, err := upgrader.Upgrade(w, r, nil)if err != nil {log.Println(err)return}defer conn.Close()for {// 读取客户端发送的消息messageType, message, err := conn.ReadMessage()if err != nil {log.Println(err)break}// 向客户端发送消息err = conn.WriteMessage(messageType, message)if err != nil {log.Println(err)break}}
}func main() {http.HandleFunc("/echo", echo)log.Fatal(http.ListenAndServe(":8080", nil))
}

在上面的示例中,我们首先创建了一个upgrader对象,该对象用于将HTTP请求升级为Websocket连接。然后,我们定义了一个echo函数,用于处理Websocket连接的读写操作。最后,在main函数中,我们将echo函数注册为/echo路径上的HTTP处理函数,并通过http.ListenAndServe启动了一个简单的Web服务器。

nhooyr/websocket

nhooyr/websocket是一个使用纯粹Golang实现的Websocket库,它的设计目标是提供一种更简洁和易用的API。

特点

  • 纯粹的Golang实现,无需任何第三方依赖
  • 简洁而灵活的API设计
  • 支持标准的Websocket协议
  • 提供了高级特性,例如分片、压缩等

使用示例

下面是一个使用nhooyr/websocket的简单示例:

package mainimport ("log""net/http""time""github.com/nhooyr/websocket"
)func echo(w http.ResponseWriter, r *http.Request) {// 升级HTTP请求为Websocket连接conn, err := websocket.Accept(w, r, nil)if err != nil {log.Println(err)return}defer conn.Close(websocket.StatusInternalError, "Internal Server Error")for {// 从客户端读取消息messageType, message, err := conn.Read(nil)if err != nil {log.Println(err)return}// 向客户端发送消息err = conn.Write(r.Context(), messageType, message)if err != nil {log.Println(err)return}}
}func main() {http.HandleFunc("/echo", echo)srv := &http.Server{Addr:         ":8080",ReadTimeout:  10 * time.Second,WriteTimeout: 10 * time.Second,}log.Fatal(srv.ListenAndServe())
}

在上面的示例中,我们首先使用websocket.Accept函数将HTTP请求升级为Websocket连接。然后,我们定义了一个echo函数,用于处理Websocket连接的读写操作。最后,我们创建了一个带有超时设置的http.Server对象,并通过ListenAndServe方法启动了一个Web服务器。

go-websocket

go-websocket是另一个受欢迎的Golang Websocket框架,它提供了一组简单而强大的API,用于构建高效的实时应用。

特点

  • 提供了简单而强大的API,方便开发者进行Websocket编程
  • 支持标准的Websocket协议
  • 高度模块化,易于扩展和定制

使用示例

下面是一个使用go-websocket的简单示例:

package mainimport ("fmt""log""net/http""time""github.com/zhouhui8915/go-websocket"
)func echo(ws *websocket.Conn) {for {// 读取客户端发送的消息messageType, data, err := ws.ReadMessage()if err != nil {log.Println(err)return}// 向客户端发送消息err = ws.WriteMessage(messageType, data)if err != nil {log.Println(err)return}}
}func main() {http.HandleFunc("/echo", func(w http.ResponseWriter, r *http.Request) {if websocket.IsWebSocketUpgrade(r) {c, err := websocket.Upgrade(w, r)if err != nil {http.Error(w, "Could not open websocket connection", http.StatusBadRequest)return}defer c.Close()echo(c)} else {fmt.Fprintf(w, "Hello, %s!", r.URL.Path[1:])}})srv := &http.Server{Addr:         ":8080",ReadTimeout:  10 * time.Second,WriteTimeout: 10 * time.Second,}log.Fatal(srv.ListenAndServe())
}

在上面的示例中,我们首先定义了一个echo函数,该函数用于处理Websocket连接的读写操作。然后,在HTTP处理函数中,我们使用websocket.IsWebSocketUpgrade函数检查HTTP请求是否需要升级为Websocket连接。如果是,则使用websocket.Upgrade函数将HTTP请求升级为Websocket连接,并调用echo函数对连接进行处理。如果不是,则返回一个简单的问候消息。

总结

Golang提供了一些优秀的Websocket框架,方便开发者构建高效和可靠的实时应用。无论是Gorilla Websocket、nhooyr/websocket还是go-websocket,都有自己独特的特点和优势。开发者可以根据自己的实际需求选择适合的框架进行开发。无论选择哪个框架,都可以借助Golang的高性能和简洁的语法,轻松构建出优秀的实时应用。

以上就是关于Golang Websocket框架的介绍,希望对你有所帮助!

相关文章:

Golang Websocket框架:实时通信的新选择

前言 在现代应用程序中,实时通信已经成为了一种必需的特性。而Websocket是一种在客户端和服务器之间建立持久连接的协议,可以实现实时的双向通信。Golang作为一门高效且简洁的语言,也提供了一些优秀的Websocket框架,方便开发者构…...

ExoPlayer架构详解与源码分析(7)——SampleQueue

系列文章目录 ExoPlayer架构详解与源码分析(1)——前言 ExoPlayer架构详解与源码分析(2)——Player ExoPlayer架构详解与源码分析(3)——Timeline ExoPlayer架构详解与源码分析(4)—…...

第二证券:基本面改善预期强化 机构聚焦科技成长

沪指日前迎来“三连涨”。10月26日,上证指数、深证成指和创业板指全部收红,分别收涨0.48%、0.40%、0.65%。此前的两个交易日,上证指数、深证成指也均收涨,创业板指24日涨幅也达到了0.85%。 从近期密布发布的策略报告来看&#xf…...

大语言模型在天猫AI导购助理项目的实践!

本文主要介绍了Prompt设计、大语言模型SFT和LLM在手机天猫AI导购助理项目应用。 ChatGPT基本原理 “会说话的AI”,“智能体” 简单概括成以下几个步骤: 预处理文本:ChatGPT的输入文本需要进行预处理。 输入编码:ChatGPT将经过预…...

【STM32】GPIO控制LED(HAL库版)

STM32最新固件库v3.5/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.c 林何/STM32F103C8 - 码云 - 开源中国 (gitee.com) STM32最新固件库v3.5/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c 林何/STM32F103C8 - 码云 - 开源中国 (gitee.…...

第27届亚洲国际动力传动与控制技术展览会盛大开幕,意大利国家展团闪耀回归

2023年10月24日,第27届亚洲国际动力传动与控制技术展览会(PTC ASIA)在上海新国际博览中心正式拉开帷幕。作为亚太地区动力传动行业的风向标,PTC ASIA致力于为来自世界各地的参展企业提供专业的采供、技术信息交互平台,…...

永恒之蓝漏洞 ms17_010 详解

文章目录 永恒之蓝 ms 17_0101.漏洞介绍1.1 影响版本1.2 漏洞原理 2.信息收集2.1 主机扫描2.2 端口扫描 3. 漏洞探测4. 漏洞利用5.后渗透阶段5.1创建新的管理员账户5.2开启远程桌面5.3蓝屏攻击 永恒之蓝 ms 17_010 1.漏洞介绍 永恒之蓝(ms17-010)爆发于…...

汽车托运全流程介绍

从来没有办理过小轿车托运的客户都很好奇究竟汽车是如何被托运的呢?整个托运的过程介绍又是怎样的呢?因为托运汽车装车时客户本人都不在场,看不到整个的托运过程。今天具体的捋顺下整个的操作过程。 托运汽车装车前的准备工作 1.整个车辆装载过程中需要用到2名拥有…...

【API篇】八、Flink窗口函数

文章目录 1、增量聚合之ReduceFunction2、增量聚合之AggregateFunction3、全窗口函数full window functions4、增量聚合函数搭配全窗口函数5、会话窗口动态获取间隔值6、触发器和移除器7、补充 //窗口操作 stream.keyBy(<key selector>).window(<window assigner>)…...

React JSX常用语法总结

React JSX语法 什么是React JSX JSX&#xff08;javascript xml&#xff09; 就是JavaScript和XML结合的一种格式&#xff0c;是JavaScript的语法扩展&#xff0c;只要把HTML代码写在JS中&#xff0c;就为JSX。用于动态构建用户界面的Javascript库&#xff0c;发送请求获取数据…...

DVWA-Cross Site Request Forgery (CSRF)

大部分网站都会要求用户登录后,使用相应的权限在网页中进行操作,比如发邮件、购物或者转账等都是基于特定用户权限的操作。浏览器会短期或长期地记住用户的登录信息,但是,如果这个登录信息被恶意利用呢?就有可能发生CSRF CSRF的英文全称为Cross Site Request Forgery,中文…...

浅谈安科瑞可编程电测仪表在老挝某项目的应用

摘要&#xff1a;本文介绍了安科瑞多功能电能表在老挝某项目的应用。AMC系列交流多功能仪表是一款专门为电力系统、工矿企业、公用事业和智能建筑用于电力监控而设计的智能电表。 Abstract&#xff1a;This article introduces the application of the multi-function energy …...

Java项目源码合集

以下只是源码合集的一部分&#xff0c;源码均已本地正常调试运行&#xff0c;如需请与我联系。 序号项目名称演示地址1springbootvue药店销售管理系统https://pan.baidu.com/s/1n-Vk5Pr5z7s3IcN3WsCkdg?pwdve6z 2基于ssm协同过滤技术的旅游景点购票系统https://pan.baidu.com…...

Python学习笔记--生成器

四、生成器 1、为什么需要生成器 通过上面的学习&#xff0c;可以知道列表生成式&#xff0c;我们可以直接创建一个列表。 但是&#xff0c;受到内存限制&#xff0c;列表容量肯定是有限的。而且&#xff0c;创建一个包含 1000 万个元素的列表&#xff0c;不仅占用很大的存储…...

【Python学习】—Python基础语法(五)

【Python学习】—Python基础语法&#xff08;五&#xff09; 一、循环的嵌套使用 二、九九乘法表 #外层循环表示行数 for i in range(1,10):#内层循环表示每一行的数据for j in range(1,i1):#输出每一行的内容print(f"{i} * {j} {i * j} \t",end"") #外层…...

【js】JavaScript清除所有(多个)定时器的方法:

文章目录 一、停止单个定时器二、暂停与恢复定时器三、使用Promise来管理定时器四、使用ES6特性管理定时器五、案例&#xff08;定时获取页面列表数据&#xff09; 一、停止单个定时器 #在某些情况下&#xff0c;我们可能只需要停止单个定时器。 #在JavaScript中&#xff0c;我…...

java实现周易64卦并返回对应的卦象(含百度百科链接)

《易经》是中华民族传统思想文化中自然哲学与人文实践的理论根源&#xff0c;是古代汉民族思想、智慧的结晶&#xff0c;被誉为“大道之源”&#xff0c;是古代帝王之学&#xff0c;政治家、军事家、商家的必修之术。 《易经》含盖万有&#xff0c;纲纪群伦&#xff0c;是中华…...

# 算法与程序的灵魂

文章目录 前言算法与程序的关系例子1&#xff1a;冒泡排序例子2&#xff1a;斐波那契数列算法优化与进阶总结 前言 大家好我是艾老虎尤&#xff0c;算法与程序是计算机科学中两个非常重要的概念。算法是解决问题的方法和步骤&#xff0c;而程序是算法的具体实现。在计算机科学…...

2023-10-21 美团2024秋招后端开发岗笔试题

1 考察dfs和拓扑排序 1.1 题目描述&#xff08;如果拓扑排序不清楚可以去做一下lc 207. 课程表&#xff09; 1.2 答案 import java.util.*;public class Meituan {static int m,n;public static void main(String[] args) {Scanner in new Scanner(System.in);m in.nextInt…...

汽车托运是怎样收费

汽车托运是如何收费的呢?一般来说&#xff0c;汽车托运的费用是会随着每公里来增加&#xff0c;目前的托运的每公里费用在1.2-1.8元之间&#xff0c;托运的距离越远那么它的托运单价费用就会越低&#xff0c;如果你运气好找到一家在搞活动的汽车托运公司&#xff0c;那么你就算…...

AI辅助开发:让快马智能生成带安全验证的路由器手机登录界面

最近在做一个路由器管理后台的移动端登录页面&#xff0c;需要实现192.168.1.1这个常见路由器地址的手机端登录功能。作为一个前端开发者&#xff0c;我发现用AI辅助开发可以大大提升效率&#xff0c;特别是处理安全验证这类复杂逻辑时。下面分享下我的实践过程。 需求分析 首先…...

Qwen-Image-Layered快速部署:ComfyUI镜像一键启动与配置

Qwen-Image-Layered快速部署&#xff1a;ComfyUI镜像一键启动与配置 1. 引言&#xff1a;图像分层的革命性突破 1.1 传统图像编辑的痛点 在常规的图像处理流程中&#xff0c;我们常常遇到一个根本性难题&#xff1a;图像一旦生成或拍摄完成&#xff0c;就变成了一个"不…...

改进的樽海鞘群算法在光伏MPPT中的应用探索

改进的樽海鞘群算法 光伏mppt 在原来的基础上引入了将反向学习的思想融入到领导者的更新机制&#xff0c;在搜索最优值的过程中&#xff0c;使得算法拥有更好的全局开发能力和局部开发能力。 追随者更新公式则根据适应度就行了改进&#xff0c;新的位置会更加偏向于适应度较好的…...

Vibe coding对程序员的影响

一、深化核心能力数学与算法基础掌握离散数学、概率论等基础理论熟练应用动态规划、图论等算法范式示例&#xff1a;优化算法时间复杂度 O(n\log n)--O(n)系统设计能力理解计算机组成原理与操作系统机制构建高可用分布式系统&#xff08;如CAP定理&#xff09;二、适应技术演进…...

从滤波到故障诊断:手把手教你用MATLAB实现信号互相关分析的实际项目

从振动信号到故障定位&#xff1a;MATLAB互相关分析的工业实战指南 车间里那台大型离心泵的异常振动已经持续两周了。王工程师带着加速度传感器采集了三组不同位置的振动信号&#xff0c;屏幕上跳动的波形看起来杂乱无章。"到底是轴承磨损还是叶轮不平衡&#xff1f;"…...

5个高效步骤:直链技术让网盘用户实现下载速度跃升

5个高效步骤&#xff1a;直链技术让网盘用户实现下载速度跃升 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…...

利用 Worker Threads 优化 Vite 构建性能的实战

背景在我们的前端工程化实践中&#xff0c;随着项目规模的扩大&#xff0c;构建效率问题逐渐凸显。特别是在生产环境构建流程中&#xff0c;为了保护源码逻辑&#xff0c;我们通常会引入 JavaScript 混淆工具&#xff08;如 javascript-obfuscator&#xff09;。这一步虽然必要…...

SecGPT-14B完整指南:从镜像拉取、服务启动、参数调优到故障排查

SecGPT-14B完整指南&#xff1a;从镜像拉取、服务启动、参数调优到故障排查 1. SecGPT-14B简介 SecGPT-14B是一款专注于网络安全领域的文本生成模型&#xff0c;基于Qwen2ForCausalLM架构开发&#xff0c;拥有140亿参数规模。该模型专为安全专业人员设计&#xff0c;能够提供…...

自动驾驶车辆横向轨迹跟踪:基于NN与ANFIS优化MPC的探索

轨迹跟踪算法-基于神经网络NN或自适应神经模糊系统ANFIS优化模型预测控制MPC 的自动驾驶车辆横向轨迹跟踪 包含&#xff1a; 1.参考文献&#xff1b; 2.基于神经网络NN的自适应参数&#xff08;Np、Nc、Q、R 等&#xff09;的离散 MPC对比模型和代码&#xff1b; 3.基于自适应神…...

Omni-Vision Sanctuary 在 Proteus 仿真中的应用:智能电路设计与调试助手

Omni-Vision Sanctuary 在 Proteus 仿真中的应用&#xff1a;智能电路设计与调试助手 1. 电子工程师的新助手 作为一名电子工程师&#xff0c;你是否经历过这样的场景&#xff1a;面对一个功能需求&#xff0c;花了大量时间查阅资料却找不到合适的电路方案&#xff1b;仿真波…...