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.mzph.cn/news/799102.shtml

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

相关文章

uniapp使用vuex

1、uniapp中使用vuex_uniapp使用vuex-CSDN博客 2、uniapp中使用vuex(store)模块的例子 - 简书 (jianshu.com) 3、vuex介绍及使用指南(面向实战)_vuex 实战应用-CSDN博客

工程中实践的微服务设计模式

大家好,我是 方圆。最近在读《微服务架构设计模式》,开始的时候我非常的好奇,因为在我印象中,设计模式是常说的那23种设计模式,而微服务的设计模式又是什么呢?这个问题也留给大家,在文末我会附上…

opencv图像处理技术(阈值处理与图像平滑)

进行图像处理时,常常需要对图像进行预处理以提取所需的信息或改善图像质量。阈值处理和图像平滑是两种常见的预处理技术。 阈值处理 阈值处理是一种图像分割技术,其基本思想是将图像中的像素值与一个或多个预先设定的阈值进行比较,根据比较…

PCL 线段到三角形的距离(3D)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里沿用之前直线到三角形的距离计算思路: 1、首先,我们可以判断直线与三角形是否相交,相交则距离为0,这里可以参考之前的博客:PCL 计算一条射线与一个三角形的交点。 2、如果直线与三角形未相交,则只需要判断…

【人工智能】猫狗识别

猫狗识别 实验背景 数据集介绍 我们使用CIFAR10数据集。CIFAR10数据集包含60,000张32x32的彩色图片,10个类别,每个类包含6,000张。其中50,000张图片作为训练集,10000张作为验证集。这次我们只对其中的猫和狗两类进行预测。 图 1 CIFAR10 数据…

Windows11配置VUE开发环境

目录 一、按照nodejs二、命令安装npm cache clean --forcenpm install -g vue/clinpm install npm -gnpm install webpacknpm install vue-cli -g与npm install -g vue/cli区别npm install -g cnpm --registryhttps://registry.npm.taobao.orgnpm i yarn -g --verbosenpm i -g …

网络与并发编程(一)

并发编程介绍_串行_并行_并发的区别 串行、并行与并发的区别 串行(serial):一个CPU上,按顺序完成多个任务并行(parallelism):指的是任务数小于等于cpu核数,即任务真的是一起执行的并发(concurrency):一个CPU采用时间…

IDEA 导出jar无法执行 错误: 找不到或无法加载主类

1、首先配置正确Project Struct 保证需要引用的jar包库添加到Libraries里,尽管添加到Modules里依然可以测试运行或调试,但导出的jar包会遇到问题。 2、导出jar,方式选择如下 选择”From modules with dependencies" 然后去掉以上“Extr…

手机如何在线制作gif?轻松一键在线操作

现在大家都喜欢使用手机来拍摄记录有趣的事物,但是时间长了手机里的视频越来越多导致手机存储空间不够了,这些视频又不想删除时应该怎么办呢?这个很简单,下面就给大家分享一款不用下载手机就能操作的视频转gif网站-GIF中文网&…

【贪玩巴斯】Mac的M芯片(M1/2...)下载homebrew方法(24年最新且已验证可行)

1. 按照目前广为流传的方法(M1会出现一些问题): 终端输入: /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 使用国内镜像下载。 2. 输入后按照要求步骤执行即可&#xff…

k8s单节点部署,容器运行时使用containerd

环境 系统 : entOS Linux release 7.9.2009 (CoreIP:192.168.44.177 硬件要求:控制平面最少需要 2c2g 安装前环境准备 如果是集群部署还需要配置时间同步 关闭防火墙 systemctl disable firewalld关闭selinux setenforce 0sed -i s/SELI…

KADB锁冲突查看及解决

构造锁冲突 分布开启两个终端,一个终端执行: begin; update data_table set addrtest where id89; 另外一个终端执行: alter table data_table add test varchar(20); 观察锁冲突情况 test# select pid,waiting,waiting_reason,query from p…

sql注入-MySQL

01. 常用符号、函数、语句 1.1. 常用符号 1.1.1. 注释符 注释符说明#(%23)单行注释 在URL中#表示锚点,也就是hash路由,带上#不会请求后端路由,而是刷新前端路由,所以测试一般用URL编码后的%23– – - -+单行注释 注意–后还有一个空格;其中+号会被URL解码为空格/**/多行…

Python学习从0开始——009类

Python学习从0开始——009类 一、类3.1最简形式3.2Class 对象3.3实例对象3.4实例变量 二、继承2.1最简形式2.2多重继承 三、私有变量四、杂项 一、类 3.1最简形式 class ClassName:<statement-1>...<statement-N>3.2Class 对象 #包含三种属性引用 class MyClass…

前后端接口写法(传输数据)

目录 前言1. 零散数据2. 函数体3. 总结 前言 对于后端常用的两个注解&#xff1a;详细分析Java中的RequestParam和RequestBody 以下文章主要用于笔记总结&#xff0c;后续可翻看 1. 零散数据 前端数据 export const doWeekPlan (ids,selectedPeriod) > {return reques…

Vue - 你知道Vue组件中的data为什么是一个函数吗

难度级别:中高级及以上 提问概率:80% 在Vue项目中,App.vue下的每个子组件都会生成一个单独的Vue实例对象,但这些子对象都是通过通过vue.extend方法创建而来的,也就是说我们平时在项目中所定义的Vue组件,都有一个相同的父类对象。这样也就…

JS-PC/MOBILE技巧--PC

一、PC 端网页特效 1、元素偏移量 offset 系列 offset 概述 offset 就是偏移量&#xff0c;使用 offset 系列相关属性可以动态的得到该元素的位置&#xff08;偏移&#xff09;、大小等。 获取元素距离带有定位父元素的位置获取元素自身的大小&#xff08;宽度高度&#xff0…

2024-04-07 问AI: 在深度学习中,预训练是什么?

文心一言 在深度学习中&#xff0c;预训练&#xff08;Pre-training&#xff09;是一种模型训练的技术&#xff0c;主要目的是利用大量无标签或已标签的数据来初始化模型的参数&#xff0c;从而为后续的任务提供一个好的起点。这种技术可以帮助模型学习到数据的通用表示&#…

前端入门(认识HTML,CSS,JavaScript三件套)

目录 前言 HTML&#xff08;构建&#xff09; CSS&#xff08;设计&#xff09; JavaScript&#xff08;互动&#xff09; 总结 相关书籍推荐 前言 前端&#xff08;Frontend&#xff09;指的是与用户直接交互的部分&#xff0c;也称为客户端。在网站或者应用程序中&…

特别详细的Spring Cloud 系列教程1:服务注册中心Eureka的启动

Eureka已经被Spring Cloud继承在其子项目spring-cloud-netflix中&#xff0c;搭建Eureka Server的方式还是非常简单的。只需要通过一个独立的maven工程即可搭建Eureka Server。 我们引入spring cloud的依赖和eureka的依赖。 <dependencyManagement><!-- spring clo…