青少年编程与数学 02-003 Go语言网络编程 21课题、Go语言WebSocket编程

青少年编程与数学 02-003 Go语言网络编程 21课题、Go语言WebSocket编程

  • 课题摘要:
  • 一、WebSocket
      • WebSocket的主要特点包括:
      • WebSocket的工作原理:
      • WebSocket的应用场景:
  • 二、WebSocket编程
      • 1. 安装`gorilla/websocket`库
      • 2. 创建WebSocket服务器
      • 3. 创建WebSocket客户端
      • 4. 处理WebSocket消息
      • 5. 安全性
      • 6. 错误处理
      • 7. 心跳机制
      • 8. 连接管理
  • 三、综合应用
      • 步骤 1: 安装`gorilla/websocket`库
      • 步骤 2: 创建WebSocket服务器
      • 步骤 3: 创建客户端
      • 步骤 4: 运行服务器和客户端

本课题介绍了WebSocket协议及其在Go语言中的应用。WebSocket是一种网络通信协议,支持全双工通信和持久连接,适用于实时数据交换。主要特点包括全双工通信、持久连接、小头部开销、基于TCP和适用于实时应用。工作原理涉及握手、连接建立、数据传输和连接关闭。应用场景包括聊天应用、在线游戏、实时通知、协作工具和监控系统等。

课题摘要:

本课题介绍了WebSocket协议及其在Go语言中的应用。WebSocket是一种网络通信协议,支持全双工通信和持久连接,适用于实时数据交换。主要特点包括全双工通信、持久连接、小头部开销、基于TCP和适用于实时应用。工作原理涉及握手、连接建立、数据传输和连接关闭。应用场景包括聊天应用、在线游戏、实时通知、协作工具和监控系统等。

在Go语言中,可以使用gorilla/websocket库实现WebSocket编程。步骤包括安装库、创建WebSocket服务器和客户端、处理消息、安全性考虑、错误处理、心跳机制和连接管理。示例代码展示了如何创建WebSocket服务器和客户端,以及如何实现一个简单的WebSocket聊天室应用,允许多个客户端连接并广播消息。

通过使用gorilla/websocket库,可以在Go语言中构建需要实时通信的Web应用,如聊天应用和实时游戏。


一、WebSocket

WebSocket是一种网络通信协议,提供了在单个TCP连接上进行全双工通信的能力。它是HTML5规范的一部分,设计用来替代轮询和长轮询等传统HTTP通信方式,以实现更高效的实时数据交换。

WebSocket的主要特点包括:

  1. 全双工通信:WebSocket允许服务器和客户端之间进行双向实时通信,无需客户端不断发送请求来获取数据。

  2. 持久连接:一旦WebSocket连接建立,它会保持开放状态,直到客户端或服务器决定关闭连接。

  3. 头部开销小:与HTTP请求相比,WebSocket通信的消息头部开销较小,这使得它适合传输频繁和大量的数据。

  4. 基于TCP:WebSocket建立在TCP协议之上,确保了数据传输的可靠性。

  5. 适用于实时应用:WebSocket非常适合需要实时数据传输的应用,如在线游戏、实时聊天应用、股票行情更新等。

WebSocket的工作原理:

  1. 握手:客户端通过发送一个带有Upgrade头部的特殊HTTP请求来发起WebSocket连接。如果服务器同意升级连接,则响应相同的Upgrade头部,完成握手过程。

  2. 连接建立:握手成功后,客户端和服务器之间的连接被升级为WebSocket连接,双方可以开始发送数据。

  3. 数据传输:连接建立后,客户端和服务器可以发送和接收数据帧。WebSocket协议定义了数据帧的格式,支持文本和二进制数据。

  4. 连接关闭:任何一方都可以发送一个关闭帧来关闭WebSocket连接。双方在发送完所有待处理的消息后,将关闭TCP连接。

WebSocket的应用场景:

  • 聊天应用:在线聊天和消息应用,如WhatsApp、Facebook Messenger。
  • 在线游戏:多人在线游戏,需要实时交换玩家位置和状态。
  • 实时通知:股票交易平台、新闻网站等需要实时更新数据的应用。
  • 协作工具:在线文档编辑、白板应用等需要多方实时协作的工具。
  • 监控系统:实时监控系统,如服务器状态监控、安全监控等。

WebSocket协议通过提供全双工通信机制,使得服务器可以主动向客户端推送数据,极大地丰富了Web应用的交互性。

二、WebSocket编程

在Go语言中,可以使用gorilla/websocket库来实现WebSocket编程,这是一个非常流行且功能丰富的库。以下是使用gorilla/websocket库进行WebSocket编程的详细步骤和示例代码。

1. 安装gorilla/websocket

首先,你需要安装gorilla/websocket库:

go get -u github.com/gorilla/websocket

2. 创建WebSocket服务器

创建一个WebSocket服务器,监听客户端的连接请求,并处理消息。

package mainimport ("fmt""net/http""github.com/gorilla/websocket"
)var upgrader = websocket.Upgrader{CheckOrigin: func(r *http.Request) bool {return true // 允许所有跨域请求},
}// echo 处理WebSocket请求
func echo(w http.ResponseWriter, r *http.Request) {// 升级HTTP连接到WebSocket协议c, err := upgrader.Upgrade(w, r, nil)if err != nil {panic(err)}defer c.Close()for {// 读取新消息mt, message, err := c.ReadMessage()if err != nil {break // 出错或客户端关闭连接}fmt.Printf("recv: %s\n", message)// 回复客户端err = c.WriteMessage(mt, message)if err != nil {break // 出错或客户端关闭连接}}
}func main() {http.HandleFunc("/echo", echo)http.ListenAndServe(":8080", nil)
}

3. 创建WebSocket客户端

创建一个WebSocket客户端,连接到服务器并发送/接收消息。

package mainimport ("flag""log""os""github.com/gorilla/websocket"
)var addr = flag.String("addr", "localhost:8080", "http service address")func main() {flag.Parse()log.SetFlags(0)origin := "http://" + *addrconn, _, err := websocket.DefaultDialer.Dial("ws://"+*addr+"/echo", nil)if err != nil {log.Fatal("dial:", err)}defer conn.Close()conn.WriteMessage(websocket.TextMessage, []byte("hello"))_, message, err := conn.ReadMessage()if err != nil {log.Fatal("read:", err)}fmt.Printf("recv: %s\n", message)
}

4. 处理WebSocket消息

在服务器端,你可以定义不同的函数来处理不同类型的消息或执行不同的业务逻辑。

5. 安全性

  • TLS/SSL:在生产环境中,应该使用TLS/SSL来加密WebSocket连接。
  • Origin检查:在upgrader.CheckOrigin中实现适当的跨域策略,以防止CSRF攻击。

6. 错误处理

适当处理WebSocket连接过程中可能出现的错误,包括连接失败、消息读写错误等。

7. 心跳机制

实现心跳机制,定期发送ping/pong控制帧,以保持连接活跃并检测连接是否仍然有效。

8. 连接管理

在高并发场景下,管理多个WebSocket连接,可能需要使用连接池或其他并发控制机制。

通过以上步骤,你可以使用gorilla/websocket库在Go语言中实现WebSocket服务器和客户端。这使得你可以构建需要实时通信功能的Web应用,如聊天应用、实时游戏等。

三、综合应用

下面是一个使用Go语言和gorilla/websocket库实现的简单WebSocket聊天室应用的示例。这个应用将允许多个客户端连接到服务器,并广播消息给所有连接的客户端。

步骤 1: 安装gorilla/websocket

首先,你需要安装gorilla/websocket库:

go get -u github.com/gorilla/websocket

步骤 2: 创建WebSocket服务器

创建一个WebSocket服务器,监听客户端的连接请求,并处理消息。

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 // 允许所有跨域请求},
}var clients = make(map[*websocket.Conn]bool)// broadcast 将消息发送给所有连接的客户端
func broadcast(message string) {for client := range clients {err := client.WriteMessage(websocket.TextMessage, []byte(message))if err != nil {log.Println("error broadcasting message:", err)delete(clients, client)client.Close()}}
}// handleConnections 处理WebSocket连接
func handleConnections(w http.ResponseWriter, r *http.Request) {// 升级HTTP连接到WebSocket协议ws, err := upgrader.Upgrade(w, r, nil)if err != nil {log.Println(err)return}defer ws.Close()clients[ws] = truedefer delete(clients, ws)for {// 读取新消息_, message, err := ws.ReadMessage()if err != nil {log.Println("error reading message:", err)break}log.Printf("recv: %s", message)// 广播消息给其他客户端broadcast(string(message))}
}func main() {http.HandleFunc("/ws", handleConnections)log.Println("Chat server started on :8080")http.ListenAndServe(":8080", nil)
}

步骤 3: 创建客户端

客户端可以使用JavaScript创建,连接到服务器并发送/接收消息。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>WebSocket Chat Room</title><style>#messages { list-style-type: none; margin: 0; padding: 0; }#messages li { padding: 8px; margin-bottom: 2px; background-color: #f3f3f3; }</style>
</head>
<body><ul id="messages"></ul><form id="form"><input id="input" autocomplete="off" /><button>Send</button></form><script>const form = document.getElementById('form');const input = document.getElementById('input');const messages = document.getElementById('messages');// 创建WebSocket连接const ws = new WebSocket('ws://localhost:8080/ws');ws.onmessage = function(event) {const message = event.data;const item = document.createElement('li');item.textContent = message;messages.appendChild(item);window.scrollTo(0, document.body.scrollHeight);};form.onsubmit = function() {const message = input.value;ws.send(message);input.value = '';return false;};</script>
</body>
</html>

步骤 4: 运行服务器和客户端

  1. 运行服务器:在终端中运行Go服务器代码。
  2. 运行客户端:在浏览器中打开index.html文件,你将看到一个简单的聊天室界面,可以发送消息给其他客户端。

这个简单的WebSocket聊天室应用展示了Go语言WebSocket编程的基本用法和广播机制。可以根据需要添加更多的功能和优化。

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

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

相关文章

vscode 快捷键生成代码

1. &#xff01;Tab/回车键 便捷生成html初始结构代码&#xff08;注意&#xff01;是英文字符&#xff09; 2. Alt B 快捷默认浏览器打开 3. Ctrl / 增加注释 4. 光标放到该行即可&#xff0c;直接ctrlC&#xff0c;ctrlv&#xff0c;即可在下面复制一行 5. 选中要修改的标签…

前端接入Paymax支付请求

材料指南 开发者平台 &#xff1a;配置开发必备信息&#xff08;appid&#xff0c;商户号&#xff0c;公钥私钥&#xff09;,此处与请求参数appId、merchantNo有关。 PayerMax Apis&#xff1a;各支付接口信息,本文以收银台支付API为请求展开,请求url为orderAndPay,测试环境基…

Jmeter的后置处理器(二)

5--JSR223 PostProcessor 功能特点 自定义后处理逻辑&#xff1a;使用脚本语言编写自定义的后处理逻辑。支持多种脚本语言&#xff1a;支持 Groovy、JavaScript、BeanShell 等脚本语言。动态参数传递&#xff1a;将提取的数据存储为变量&#xff0c;供后续请求使用。灵活性高…

CSS遮罩:mask

CSS属性 mask 允许使用者通过遮罩或者裁切特定区域的图片的方式来隐藏一个元素的部分或者全部可见区域。 // 一般用位图图片做遮罩 mask: url(~/assets/images/mask.png); mask-size: 100% 100%;// 使用 SVG 图形中的形状来做遮罩 mask: url(~/assets/images/mask.svg#star);…

Zmap+python脚本+burp实现自动化Fuzzing测试

声明 学习视频来自 B 站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 ✍&#x1f3fb;作者简介&#xff1a;致…

15. Python中的os.path模块/路径操作相关

这个专栏记录我学习/科研过程中遇到的一些小问题以及解决方案&#xff0c;一些问题可能比较蠢请见谅。自用&#xff0c;仅供参考。 ------------------------------------------------------------------------------------ Python中的os.path模块详解&#xff08;包括一些常…

鸿蒙实战:页面跳转传参

文章目录 1. 实战概述2. 实现步骤2.1 创建鸿蒙项目2.2 编写首页代码2.3 新建第二个页面 3. 测试效果4. 实战总结 1. 实战概述 本次实战&#xff0c;学习如何在HarmonyOS应用中实现页面间参数传递。首先创建项目&#xff0c;编写首页代码&#xff0c;实现按钮跳转至第二个页面并…

NLP论文速读(EMNLP 2024)|动态奖励与提示优化来帮助语言模型的进行自我对齐

论文速读|Dynamic Rewarding with Prompt Optimization Enables Tuning-free Self-Alignment of Language Models 论文信息&#xff1a; 简介: 本文讨论的背景是大型语言模型&#xff08;LLMs&#xff09;的自我对齐问题。传统的LLMs对齐方法依赖于昂贵的训练和人类偏好注释&am…

Label-studio-ml-backend 和YOLOV8 YOLO11自动化标注,目标检测,实例分割,图像分类,关键点估计,视频跟踪

这里写目录标题 1.目标检测 Detection2.实例分割 segment3.图像分类 classify4.关键点估计 Keypoint detection5.视频帧检测 video detect6.视频帧分类 video classify7.旋转目标检测 obb detect8.替换yolo11模型 给我点个赞吧&#xff0c;谢谢了附录coco80类名称 笔记本 华为m…

图像处理学习笔记-20241118

文章目录 霍夫变换基本原理霍夫变换的步骤使用 OpenCV 实现直线检测示例&#xff1a;标准霍夫变换 示例&#xff1a;概率霍夫变换参数解释霍夫变换检测圆 基于GAN的样本生成GAN的基本原理基于GAN的数据增广流程实现代码示例 同态滤波&#xff08;Homomorphic Filtering&#xf…

视频融合×室内定位×数字孪生

随着物联网技术的迅猛发展&#xff0c;室内定位与视频融合技术在各行各业中得到了广泛应用。不仅能够提供精确的位置信息&#xff0c;还能通过实时视频监控实现全方位数据的可视化。 与此同时&#xff0c;数字孪生等技术的兴起为智慧城市、智慧工厂等应用提供了强大支持&#…

当科技照进现实 机器人带着机器狗乘空轨

湖北日报讯&#xff08;记者魏铼、通讯员张璨龙&#xff09;11月14日&#xff0c;武汉东湖高新区空轨高新大道站&#xff0c;在光谷装上“智慧大脑”的人形机器人&#xff0c;乘空轨&#xff0c;看AI展&#xff0c;与小朋友在生态大走廊斗舞。 京天博特&#xff1a;光谷“智慧大…

freertos任务调度学习

首先创建任务&#xff0c;创建好任务后&#xff0c;开启任务调度器&#xff0c;任务才能执行 1.开启任务调度器 2.启动第一个任务 3.任务切换

蓝桥杯每日真题 - 第16天

题目&#xff1a;&#xff08;卡牌&#xff09; 题目描述&#xff08;13届 C&C B组C题&#xff09; 解题思路&#xff1a; 题目分析&#xff1a; 有 n 种卡牌&#xff0c;每种卡牌的现有数量为 a[i]&#xff0c;所需的最大数量为 b[i]&#xff0c;还有 m 张空白卡牌。 每…

MySQL系列之数据授权(privilege)

导览 前言Q&#xff1a;如何对MySQL数据库进行授权管理一、MySQL的“特权”1. 权限级别2. 权限清单 二、授权操作1. 查看权限2. 分配权限3. 回收权限 结语精彩回放 前言 看过博主上一篇的盆友&#xff0c;可以Get到一个知识点&#xff1a;数据授权&#xff08;eg&#xff1a;g…

C++为函数提供的型特性——缺省参数与函数重载

目录 一、缺省参数 二、函数重载 一、缺省参数 C为函数提供了一项新的特性——缺省参数。缺省参数指的是当前函数调用中省略了实参自动使用的一个值。这极大地提高了函数的灵活性 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值 。在调⽤该函数时&#xff0c;如果没有…

android 使用MediaPlayer实现音乐播放--权限请求

在Android应用中&#xff0c;获取本地音乐文件的权限是实现音乐扫描功能的关键步骤之一。随着Android版本的不断更新&#xff0c;从Android 6.0&#xff08;API级别23&#xff09;开始&#xff0c;应用需要动态请求权限&#xff0c;而到了android 13以上需要的权限又做了进一步…

go-zero(一) 介绍和使用

go-zero 介绍和使用 一、什么是 go-zero&#xff1f; go-zero 是一个基于 Go 语言的微服务框架&#xff0c;提供了高效、简单并易于扩展的 API 设计和开发模式。它主要目的是为开发者提供一种简单的方式来构建和管理云原生应用。 1.go-zero 的核心特性 高性能&#xff1a; g…

Orcad 输出有链接属性的PDF

安装adobe pdf安装Ghostscript修改C:\Cadence\SPB_16.6\tools\capture\tclscripts\capUtils\capPdfUtil.tcl ​ 设置默认打印机为 Adobe PDF ​ 将Ghostscript的路径修改正确 打开cadence Orcad &#xff0c;accessories->candece Tcl/Tk Utilities-> Utilities->PD…

.NET6 WebApi第1讲:VSCode开发.NET项目、区别.NET5框架【两个框架启动流程详解】

一、使用VSCode开发.NET项目 1、创建文件夹&#xff0c;使用VSCode打开 2、安装扩展工具 1>C# 2>安装NuGet包管理工具&#xff0c;外部dll包依靠它来加载 法1》&#xff1a;NuGet Gallery&#xff0c;注意要启动科学的工具 法2》NuGet Package Manager GUl&#xff0c…