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

Golang中WebSocket和WSS的支持

引言

WebSocket是一种在单个TCP连接上进行全双工通信的协议,它为实时通信提供了一种简单而强大的方式。而WSS(WebSocket Secure)是一种通过加密的方式使用WebSocket的协议,可以在安全的传输层上进行通信。本文将探讨Golang中WebSocket和WSS的支持,介绍如何使用Golang构建WebSocket服务器和客户端,并提供一些实用的示例。

Golang中的WebSocket

Golang是一种简洁、高效的编程语言,提供了强大的并发性能和丰富的网络编程支持。在Golang中,可以使用官方提供的net/http包和github.com/gorilla/websocket包来实现WebSocket的功能。

构建WebSocket服务器

要构建一个WebSocket服务器,首先需要导入github.com/gorilla/websocket包,并注册一个处理WebSocket请求的处理程序。下面是一个简单的示例,演示了如何使用Golang构建一个WebSocket服务器:

package mainimport ("fmt""log""net/http""github.com/gorilla/websocket"
)var upgrader = websocket.Upgrader{ReadBufferSize:  1024,WriteBufferSize: 1024,
}func WebSocketHandler(w http.ResponseWriter, r *http.Request) {conn, err := upgrader.Upgrade(w, r, nil)if err != nil {log.Println("Failed to upgrade to WebSocket:", err)return}defer conn.Close()for {// 读取客户端发送的消息_, message, err := conn.ReadMessage()if err != nil {log.Println("Failed to read message:", err)break}fmt.Println("Received message:", string(message))// 向客户端发送消息err = conn.WriteMessage(websocket.TextMessage, []byte("Hello, client!"))if err != nil {log.Println("Failed to write message:", err)break}}
}func main() {http.HandleFunc("/websocket", WebSocketHandler)log.Println("WebSocket server is running on :8080")http.ListenAndServe(":8080", nil)
}

在上面的代码中,我们首先导入github.com/gorilla/websocket包,并定义了一个upgrader对象。然后,我们实现了一个WebSocketHandler函数,用于处理WebSocket请求。在该函数中,我们使用upgrader.Upgrade方法将HTTP连接升级为WebSocket连接,并通过conn.ReadMessage方法读取客户端发送的消息,并使用conn.WriteMessage方法向客户端发送消息。最后,我们使用http.HandleFunc函数将WebSocketHandler函数注册为处理WebSocket请求的处理程序,并使用http.ListenAndServe函数启动WebSocket服务器。

构建WebSocket客户端

要构建一个WebSocket客户端,我们可以使用github.com/gorilla/websocket包提供的Dial函数来建立与WebSocket服务器的连接。下面是一个简单的示例,演示了如何使用Golang构建一个WebSocket客户端:

package mainimport ("fmt""log""net/url""github.com/gorilla/websocket"
)func main() {u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/websocket"}conn, _, err := websocket.DefaultDialer.Dial(u.String(), nil)if err != nil {log.Println("Failed to connect to WebSocket server:", err)return}defer conn.Close()// 向服务器发送消息err = conn.WriteMessage(websocket.TextMessage, []byte("Hello, server!"))if err != nil {log.Println("Failed to write message:", err)return}// 读取服务器发送的消息_, message, err := conn.ReadMessage()if err != nil {log.Println("Failed to read message:", err)return}fmt.Println("Received message:", string(message))
}

在上面的代码中,我们首先导入github.com/gorilla/websocket包,并使用websocket.DefaultDialer.Dial方法建立与WebSocket服务器的连接。然后,我们使用conn.WriteMessage方法向服务器发送消息,并使用conn.ReadMessage方法读取服务器发送的消息。最后,我们将接收到的消息打印出来。

Golang中的WSS

生成自签名证书

要在Golang中使用WSS,首先需要生成一个自签名证书。可以使用OpenSSL工具来生成自签名证书。下面是一个简单的示例,演示了如何生成自签名证书:

$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout key.pem -out cert.pem

在上面的命令中,我们使用openssl req命令生成一个自签名证书,并将私钥保存到key.pem文件中,将公钥保存到cert.pem文件中。在实际使用中,你可能需要根据自己的需求来生成证书。

使用WSS的WebSocket服务器和客户端

要在Golang中使用WSS,我们只需要在HTTP服务器和客户端中使用TLS配置即可。下面是一个简单的示例,演示了如何在Golang中构建一个使用WSS的WebSocket服务器和客户端:

package mainimport ("fmt""log""net/http""github.com/gorilla/websocket"
)var upgrader = websocket.Upgrader{ReadBufferSize:  1024,WriteBufferSize: 1024,
}func WebSocketHandler(w http.ResponseWriter, r *http.Request) {conn, err := upgrader.Upgrade(w, r, nil)if err != nil {log.Println("Failed to upgrade to WebSocket:", err)return}defer conn.Close()for {_, message, err := conn.ReadMessage()if err != nil {log.Println("Failed to read message:", err)break}fmt.Println("Received message:", string(message))err = conn.WriteMessage(websocket.TextMessage, []byte("Hello, client!"))if err != nil {log.Println("Failed to write message:", err)break}}
}func main() {http.HandleFunc("/websocket", WebSocketHandler)log.Println("WebSocket server is running on :8080")err := http.ListenAndServeTLS(":8080", "cert.pem", "key.pem", nil)if err != nil {log.Fatal("Failed to start WebSocket server:", err)}
}

在上面的代码中,我们首先导入github.com/gorilla/websocket包,并定义了一个upgrader对象。然后,我们实现了一个WebSocketHandler函数,用于处理WebSocket请求。最后,我们使用http.ListenAndServeTLS函数启动一个使用WSS的WebSocket服务器,并提供证书文件cert.pem和私钥文件key.pem

对于WebSocket客户端,只需要在建立连接时使用DialTLS方法,并提供证书的URL即可。下面是一个简单的示例:

package mainimport ("fmt""log""net/url""github.com/gorilla/websocket"
)func main() {u := url.URL{Scheme: "wss", Host: "localhost:8080", Path: "/websocket"}conn, _, err := websocket.DefaultDialer.Dial(u.String(), nil)if err != nil {log.Println("Failed to connect to WebSocket server:", err)return}defer conn.Close()err = conn.WriteMessage(websocket.TextMessage, []byte("Hello, server!"))if err != nil {log.Println("Failed to write message:", err)return}_, message, err := conn.ReadMessage()if err != nil {log.Println("Failed to read message:", err)return}fmt.Println("Received message:", string(message))
}

在上面的代码中,我们首先导入github.com/gorilla/websocket包,并使用websocket.DefaultDialer.Dial方法建立一个使用WSS的WebSocket连接。

安全性的考虑

在使用Golang构建WebSocket和WSS的过程中,保证数据的安全性是至关重要的。以下是几个在实现WebSocket和WSS时应考虑的安全性问题。

1. SSL/TLS加密

WSS协议通过在HTTP协议基础上添加SSL/TLS加密层来确保数据的安全传输。在Golang中,可以使用http.ListenAndServeTLS函数来启动一个使用WSS的WebSocket服务器,通过提供证书和私钥来实现加密传输。

2. 跨站脚本攻击(XSS)防护

跨站脚本攻击(XSS)是一种常见的网络攻击方式,攻击者通过在网页中插入恶意脚本来窃取用户的敏感信息或进行其他恶意行为。为了保护WebSocket应用程序免受XSS攻击,可以采取以下措施:

  • 输入验证和过滤:确保所有用户输入的数据都进行验证和过滤,防止恶意脚本的注入。
  • 安全的内容解析:使用安全的方式解析和渲染用户提供的内容,如使用HTML转义来防止注入攻击。

3. 跨站请求伪造(CSRF)防护

跨站请求伪造(CSRF)是一种攻击方式,攻击者通过伪造合法用户的请求,以此来执行非法操作。为了防止WebSocket应用程序受到CSRF攻击,可以采取以下措施:

  • 添加CSRF令牌:在每个请求中添加CSRF令牌,并在服务器端验证令牌的有效性。
  • 限制可连接的域和源:通过在服务器端限制连接的域和源,可以防止恶意站点建立WebSocket连接。

综上所述,为了确保WebSocket和WSS的安全性,除了使用SSL/TLS加密外,还应考虑防护XSS和CSRF攻击。通过采取适当的安全措施和实施最佳实践,我们可以提高WebSocket和WSS应用程序的安全性。

总结

本文介绍了Golang中WebSocket和WSS的支持。我们首先了解了WebSocket和WSS的基本概念和特点,然后演示了如何使用Golang构建WebSocket服务器和客户端,并使用自签名证书实现WSS的功能。通过实际的代码示例,我们展示了Golang中WebSocket和WSS的强大功能和简洁易用的特点。希望本文对你理解和使用Golang中WebSocket和WSS提供了一些帮助!

相关文章:

Golang中WebSocket和WSS的支持

引言 WebSocket是一种在单个TCP连接上进行全双工通信的协议,它为实时通信提供了一种简单而强大的方式。而WSS(WebSocket Secure)是一种通过加密的方式使用WebSocket的协议,可以在安全的传输层上进行通信。本文将探讨Golang中WebS…...

亚马逊云科技re:Invent大会,助力安全构建规模化生成式AI应用

2023亚马逊云科技re:Invent全球大会进入第三天,亚马逊云科技数据和人工智能副总裁Swami Sivasubramanian博士在周三的主题演讲中,为大家带来了关于亚马逊云科技生成式AI的最新能力、面向生成式AI时代的数据战略以及借助生成式AI应用提高生产效率的精彩分…...

价差后的几种方向,澳福如何操作才能盈利

在价差出现时,澳福认为会出现以下几种方向。 昂贵资产的贬值和便宜资产的平行升值。昂贵的资产贬值,而便宜的资产保持不变。昂贵资产的贬值和便宜资产的平行贬值,但昂贵资产的贬值速度更快,超过便宜资产。更贵的一对的进一步升值和…...

【Java】类和对象之超级详细的总结!!!

文章目录 前言1. 什么是面向对象?1.2面向过程和面向对象 2.类的定义和使用2.1什么是类?2.2类的定义格式2.3类的实例化2.3.1什么是实例化2.3.2类和对象的说明 3.this引用3.1为什么会有this3.2this的含义与性质3.3this的特性 4.构造方法4.1构造方法的概念4…...

机器学习的复习笔记3-回归的细谈

一、回归的细分 机器学习中的回归问题是一种用于预测连续型输出变量的任务。回归问题的类型和特点如下: 线性回归(Linear Regression):线性回归是回归问题中最简单的一种方法。它假设自变量与因变量之间存在线性关系&#xff0c…...

Git常用命令#切换分支

要在 Git 中切换分支,你可以使用 git checkout 命令。 a.创建新分支并切换到该分支 如果你想要创建一个新分支并立即切换到该分支,可以使用以下命令: git checkout -b 新分支名这会创建一个名为 新分支名 的新分支,并将你的工作目…...

【qml入门教程系列】:qml property使用介绍

作者:令狐掌门 技术交流QQ群:675120140 博客地址:https://mingshiqiang.blog.csdn.net/ 文章目录 属性的定义property基本用法属性变更事件通知属性绑定属性别名只读属性默认属性 default property访问和修改属性方式1:使用setProperty方法方式2:使用QQmlContext设置属性自定…...

pbootcms建站

pbootcms建站 一、下载pbootcms二、安装1、进入宝塔面在网站栏,新建站点,将该址里面文件全部清再将下载的pbootcms上传至该地址。 三、修改关联数据库1、在根目录下/config打开database.php照如下修改这里我使用mysqli数据库。修改并使用自已创建的数据库…...

Spring的事务传播行为

文章目录 说一下Spring的事务传播行为 今天来和大家聊聊spring中使用的事务传播行为, 说一下Spring的事务传播行为 spring事务的传播行为说的是,当多个事务同时存在的时候,spring如何处理这些事务的行为。 ① PROPAGATION_REQUIRED&#xf…...

04_网络编程

网络编程 什么是网络编程 可以让设备中的程序与网络上其他设备中的程序进行数据交互(实现网络通信的) java.net.* 包下提供了网络编程的解决方案 通信的基本架构 CS 架构(Client 客户端 / Server 服务端)BS 架构(…...

【五分钟】熟练使用numpy.cumsum()函数(干货!!!)

引言 numpy.cumsum()函数用于计算输入数组的累积和。当输入是多维数组时,numpy.cumsum()函数可以沿着指定轴计算累积和。 计算一维数组的累计和 代码如下: # 计算一维数组的累计和 tmp_array np.ones((4,), dtypenp.uint8) # [1, 1, 1, 1] print(&…...

由11月27日滴滴崩溃到近两个月国内互联网产品接二连三崩溃引发的感想

文章目录 知乎文分析微信聊天截图微信公众号 滴滴技术 发文k8s 官方文档滴滴官方微博账号 近两个月国内互联网产品“崩溃”事件2023-10-23 语雀崩溃2023-11-12 阿里云崩溃2023-11-27 滴滴崩溃2023-12-03 腾讯视频崩溃总结 我的感想 知乎文分析 最近连续加班,打车较…...

Python按要求从多个txt文本中提取指定数据

基本想法 遍历文件夹并从中找到文件名称符合我们需求的多个.txt格式文本文件,并从每一个文本文件中,找到我们需要的指定数据,最后得到所有文本文件中我们需要的数据的集合 举例 如现有名为file一个文件夹,里面含有大量的.txt格…...

DFT新手教程:VASP中ISIF取值设置

新手初学VASP计算时首先接触到的就是结构优化的计算任务。 在结构优化中,INCAR中的关键参数包括 IBRION ,NSW,ISIF,EDIFF和EDIFFG 各个参数均可在vaspwiki查到可设置的参数以及该参数所具有的设置的含义。 https://www.vasp.at/…...

pytest自动化框架之allure测试报告的用例描述设置

allure测试报告的用例描述相关方法;如下图 allure标记用例级别severity 在做自动化测试的过程中,测试用例越来越多的时候,如果执行一轮测试发现了几个测试不通过,我们也希望能快速统计出缺陷的等级。 pytest结合allure框架可以对…...

在编程中遇到的问题总结

IDEA空包粘黏问题 创建好目录以后会发现idea自动将空包合并在一起了,而且点击设置里面也没有Compact Middle Package Compact Middle Package如果不在设置的主面板上,则点击Tree Appearance,会发现Compact Middle Package在Tree Appearance里…...

【数据库设计和SQL基础语法】--SQL语言概述--SQL的基本结构和语法规则(二)

一、数据控制语言(DCL) 1.1 授权(GRANT) 数据控制语言(DCL)是SQL的一个子集,用于控制数据库中的数据访问和权限。GRANT语句是DCL中的一种,用于向用户或角色授予特定的数据库操作权…...

easyexcel多级表头导出各级设置样式(继承HorizontalCellStyleStrategy实现)

easyexcel多级表头导出各级设置样式(继承HorizontalCellStyleStrategy实现) package com.example.wxmessage.entity;import com.alibaba.excel.metadata.data.WriteCellData; import com.alibaba.excel.write.handler.context.CellWriteHandlerContext;…...

QMLfor python pyside6

QML QML是一种用于创建用户界面的声明性语言,它是Qt生态系统中的一部分。QML使用JavaScript语言和其独特的语法来定义用户界面组件,使得开发人员可以轻松地创建现代化、漂亮而又响应迅速的应用程序。 QML是基于QtQuick技术构建的,QtQuick是…...

几何教学工具 Sketchpad几何画板 mac软件特色

Sketchpad几何画板 for Mac是一款适用于macOS系统的几何教学工具,用户可以在其画板上进行各种几何图形的绘制、演示,帮助教师了解学生的思路和对概念的掌握程度。此外,Sketchpad更深层次的功能则是可以用来进行几何交流、研究和讨论&#xff…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​,覆盖应用全生命周期测试需求,主要提供五大核心能力: ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

pam_env.so模块配置解析

在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求&#xff…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率&#xff0c…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...