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%。 从近期密布发布的策略报告来看…...
大语言模型在天猫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(javascript xml) 就是JavaScript和XML结合的一种格式,是JavaScript的语法扩展,只要把HTML代码写在JS中,就为JSX。用于动态构建用户界面的Javascript库,发送请求获取数据…...
DVWA-Cross Site Request Forgery (CSRF)
大部分网站都会要求用户登录后,使用相应的权限在网页中进行操作,比如发邮件、购物或者转账等都是基于特定用户权限的操作。浏览器会短期或长期地记住用户的登录信息,但是,如果这个登录信息被恶意利用呢?就有可能发生CSRF CSRF的英文全称为Cross Site Request Forgery,中文…...
浅谈安科瑞可编程电测仪表在老挝某项目的应用
摘要:本文介绍了安科瑞多功能电能表在老挝某项目的应用。AMC系列交流多功能仪表是一款专门为电力系统、工矿企业、公用事业和智能建筑用于电力监控而设计的智能电表。 Abstract:This article introduces the application of the multi-function energy …...
Java项目源码合集
以下只是源码合集的一部分,源码均已本地正常调试运行,如需请与我联系。 序号项目名称演示地址1springbootvue药店销售管理系统https://pan.baidu.com/s/1n-Vk5Pr5z7s3IcN3WsCkdg?pwdve6z 2基于ssm协同过滤技术的旅游景点购票系统https://pan.baidu.com…...
Python学习笔记--生成器
四、生成器 1、为什么需要生成器 通过上面的学习,可以知道列表生成式,我们可以直接创建一个列表。 但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含 1000 万个元素的列表,不仅占用很大的存储…...
【Python学习】—Python基础语法(五)
【Python学习】—Python基础语法(五) 一、循环的嵌套使用 二、九九乘法表 #外层循环表示行数 for i in range(1,10):#内层循环表示每一行的数据for j in range(1,i1):#输出每一行的内容print(f"{i} * {j} {i * j} \t",end"") #外层…...
【js】JavaScript清除所有(多个)定时器的方法:
文章目录 一、停止单个定时器二、暂停与恢复定时器三、使用Promise来管理定时器四、使用ES6特性管理定时器五、案例(定时获取页面列表数据) 一、停止单个定时器 #在某些情况下,我们可能只需要停止单个定时器。 #在JavaScript中,我…...
java实现周易64卦并返回对应的卦象(含百度百科链接)
《易经》是中华民族传统思想文化中自然哲学与人文实践的理论根源,是古代汉民族思想、智慧的结晶,被誉为“大道之源”,是古代帝王之学,政治家、军事家、商家的必修之术。 《易经》含盖万有,纲纪群伦,是中华…...
# 算法与程序的灵魂
文章目录 前言算法与程序的关系例子1:冒泡排序例子2:斐波那契数列算法优化与进阶总结 前言 大家好我是艾老虎尤,算法与程序是计算机科学中两个非常重要的概念。算法是解决问题的方法和步骤,而程序是算法的具体实现。在计算机科学…...
2023-10-21 美团2024秋招后端开发岗笔试题
1 考察dfs和拓扑排序 1.1 题目描述(如果拓扑排序不清楚可以去做一下lc 207. 课程表) 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…...
汽车托运是怎样收费
汽车托运是如何收费的呢?一般来说,汽车托运的费用是会随着每公里来增加,目前的托运的每公里费用在1.2-1.8元之间,托运的距离越远那么它的托运单价费用就会越低,如果你运气好找到一家在搞活动的汽车托运公司,那么你就算…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
