我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Go怎么实现WebSockets

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Go怎么实现WebSockets

这篇文章主要介绍了Go怎么实现WebSockets的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go怎么实现WebSockets文章都会有所收获,下面我们一起来看看吧。

什么是 WebSockets

简而言之,WebSocket是一种 Web 技术,可以通过持久的单个套接字连接实现客户端和服务器之间的双向,全双工通信。WebSocket 是为 Web 应用程序开发人员提供基本上是一个接近原始的TCP通信层。

WebSocket 连接以 HTTP 请求/响应握手启动。如果此初始握手成功,则客户端和服务器已同意使用为 HTTP 请求作为 WebSocket 连接建立的现有 TCP / IP 连接。只要需要一旦 WebSocket 连接服务了它的目的,它可以通过关闭握手终止,客户端和服务器都可以启动。

Go怎么实现WebSockets

WebSockets 标志着 Web 开发的转折点。直到 WebSockets 的出现,实时网络难以实现和慢于我们习惯于现在;它是通过使用像 Ajax 和 Comet (长)轮询的技术提供的技术,这些轮询没有真正优化用于实时应用。

WebSocket 技术具有广泛的适用性。您可以在不同的目的中使用它,例如后端服务之间的流数据,或者通过长期的全双工连接连接前端。简而言之,WebSockets 是架构事件驱动的系统和构建实时应用程序和服务的绝佳选择,在那里它必须随时随地提供数据所必需的数据。

我们可以将 WebSocket 用例大致分为两个不同的类别:

  • 实时更新。通信是单向的,服务器将低延迟(通常是频繁的)更新流式传输到客户端。想想现场体育更新、警报、实时仪表板或位置跟踪,仅举几个用例

  • 双向通信。客户端和服务器都发送和接收消息。示例包括聊天,虚拟事件和虚拟教室(最后两个通常涉及轮询,测验和 Q&AS )等功能。WebSocket 还可用于支撑多用户同步协作功能,例如同时编辑同一文档的多个人员

网络套接字与 WebSockets

网络套接字,或简称为套接字,用作在同一台计算机或同一网络上不同计算机上运行的应用程序之间交换数据的内部端点。

套接字是基于 Unix 和 Windows 的操作系统的关键部分,它们使开发人员更容易创建支持网络的软件。应用程序开发人员可以在他们的程序中包含套接字,而不是从头开始构建网络连接。由于网络套接字用于多种网络协议(HTTP、FTP 等),因此可以同时使用多个套接字。

套接字是由套接字的应用程序编程接口 (API) 定义的一组函数调用创建和使用的。

有几种类型的网络套接字:

  • 数据报套接字(SOCK_DGRAM),也称为无连接套接字,使用用户数据报协议 (UDP)。数据报套接字支持双向消息流并保留记录边界。

  • 流式套接字(SOCK_STREAM),也称为面向连接的套接字,使用传输控制协议 (TCP)、流控制传输协议 (SCTP) 或数据报拥塞控制协议 (DCCP)。这些套接字提供双向、可靠、有序且不重复的数据流,没有记录边界。

  • 原始套接字(raw IP sockets) 通常在路由器和其他网络设备中可用。这些套接字通常是面向数据报的,尽管它们的确切特性取决于协议提供的接口。大多数应用程序不使用原始套接字。提供它们是为了支持新通信协议的开发,并提供对现有协议更深奥的设施的访问。

套接字通信

每个网络套接字由地址标识,地址是传输协议、IP 地址和端口号的三元组。

主机之间的通信主要有两种协议:TCP 和 UDP。让我们看看您的应用程序如何连接到 TCP 和 UDP 套接字。

  • 连接到 TCP 套接字

为了建立 TCP 连接,Go 客户端使用 net 包中的 DialTCP 函数。 DialTCP 返回一个 TCPConn 对象。建立连接后,客户端和服务器开始交换数据:客户端通过 TCPConn 对象向服务器发送请求,服务器解析请求并发送响应,TCPConn 对象接收服务器的响应。

Go怎么实现WebSockets

此连接保持有效,直到客户端或服务器关闭它。创建连接的函数如下:

客户端代码:

// inittcpAddr, err := net.ResolveTCPAddr(resolver, serverAddr)if err != nil {// handle error}conn, err := net.DialTCP(network, nil, tcpAddr)if err != nil {// handle error}// send message_, err = conn.Write({message})if err != nil {// handle error}// receive messagevar buf [{buffSize}]byte_, err := conn.Read(buf[0:])if err != nil {// handle error}

服务端代码:

// inittcpAddr, err := net.ResolveTCPAddr(resolver, serverAddr)if err != nil {// handle error}listener, err := net.ListenTCP("tcp", tcpAddr)if err != nil {// handle error}// listen for an incoming connectionconn, err := listener.Accept()if err != nil {// handle error}// send messageif _, err := conn.Write({message}); err != nil {// handle error}// receive messagebuf := make([]byte, 512)n, err := conn.Read(buf[0:])if err != nil {// handle error}
  • 连接到 UDP 套接字

与 TCP 套接字相比,使用 UDP 套接字时,客户端只需向服务器发送数据报。没有 Accept 函数,因为服务器不需要接受连接,只是等待数据报到达。

Go怎么实现WebSockets

其他 TCP 函数有 UDP 对应函数;只需在上面的函数中将 TCP 替换为 UDP 即可。

客户端:

// initraddr, err := net.ResolveUDPAddr("udp", address)if err != nil {// handle error}conn, err := net.DialUDP("udp", nil, raddr)if err != nil {// handle error}.......// send messagebuffer := make([]byte, maxBufferSize)n, addr, err := conn.ReadFrom(buffer)if err != nil {// handle error}.......// receive messagebuffer := make([]byte, maxBufferSize)n, err = conn.WriteTo(buffer[:n], addr)if err != nil {// handle error}

服务端:

// initudpAddr, err := net.ResolveUDPAddr(resolver, serverAddr)if err != nil {// handle error}conn, err := net.ListenUDP("udp", udpAddr)if err != nil {// handle error}.......// send messagebuffer := make([]byte, maxBufferSize)n, addr, err := conn.ReadFromUDP(buffer)if err != nil {// handle error}.......// receive messagebuffer := make([]byte, maxBufferSize)n, err = conn.WriteToUDP(buffer[:n], addr)if err != nil {// handle error}

总结

WebSocket 通信包通过单个 TCP 连接提供全双工通信通道。这意味着客户端和服务器都可以在需要时同时发送数据而无需任何请求。

对于需要持续数据交换的服务,例如即时通讯、在线游戏和实时交易系统,WebSockets 是一个很好的解决方案。您可以在 Internet 工程任务组 (IETF)  RFC 6455 规范中找到有关 WebSocket 协议的完整信息。

WebSocket 连接由浏览器请求并由服务器响应,然后建立连接。这个过程通常称为握手。 WebSockets 中的特殊类型的标头只需要浏览器和服务器之间的一次握手即可建立一个在其生命周期内保持活动状态的连接。

WebSocket 协议使用端口 80 进行不安全连接,使用端口 443 进行安全连接。 WebSocket 规范确定 ws (WebSocket) 和 wss (WebSocket Secure) 协议需要哪些统一的资源标识符方案。

Go怎么实现WebSockets

这是客户端请求的样子:

GET /chat HTTP/1.1Host: server.example.comUpgrade: websocketConnection: UpgradeSec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==Sec-WebSocket-Protocol: chat, superchatSec-WebSocket-Version: 13Origin: http://example.com

这是服务器响应:

HTTP/1.1 101 Switching ProtocolsUpgrade: websocketConnection: UpgradeSec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=Sec-WebSocket-Protocol: chat

WebSockets 解决了开发实时 Web 应用程序的许多难题,并且与传统 HTTP 相比具有以下几个优点:

  • 轻量级报头减少了数据传输开销。

  • 单个 Web 客户端只需要一个 TCP 连接。

  • WebSocket 服务器可以将数据推送到 Web 客户端。

WebSocket 协议实现起来比较简单。它使用 HTTP 协议进行初始握手。成功握手后,建立连接,WebSocket 本质上使用原始 TCP 读取/写入数据。

关于“Go怎么实现WebSockets”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Go怎么实现WebSockets”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Go怎么实现WebSockets

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Go怎么实现WebSockets

这篇文章主要介绍了Go怎么实现WebSockets的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go怎么实现WebSockets文章都会有所收获,下面我们一起来看看吧。什么是 WebSockets简而言之,We
2023-06-30

怎么使用laravel-websockets实现广播系统

本篇内容介绍了“怎么使用laravel-websockets实现广播系统”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!创建项目在 Apach
2023-07-04

如何使用 Gorilla Websockets 和 alexedwards/scs/v2 实现 http.Hijacker

php小编苹果今天为大家介绍一种使用Gorilla Websockets和alexedwards/scs/v2库来实现http.Hijacker的方法。这种方法可以帮助开发者在自己的应用程序中实现实时通信的功能,无论是聊天室还是实时更新等场
如何使用 Gorilla Websockets 和 alexedwards/scs/v2 实现 http.Hijacker
2024-02-10

如何在 Golang 中使用 WebSockets 实现文件上传?

在 golang 中使用 websockets 实现文件上传,需要引入 "github.com/gorilla/websocket" 包,设置 websocket 路由和处理函数。使用 gorrila websocket 库升级 http
如何在 Golang 中使用 WebSockets 实现文件上传?
2024-05-13

python中websockets与主线程传递参数的实现

Python中WebSockets与主线程传递参数可通过线程安全变量实现,如队列、事件信号和可重入锁。队列可用于传递数据,事件信号可用于发送信号触发操作,可重入锁可保护对共享数据的访问。使用这些方法可以安全且有效地实现WebSockets与主线程之间的参数传递。
python中websockets与主线程传递参数的实现
2024-04-02

go interface转struct怎么实现

在Go语言中,可以通过类型断言来将一个实现了某个接口的对象转换为该接口对应的结构体。具体步骤如下:首先,定义一个接口和一个结构体,如下所示:type MyInterface interface {GetData() string}type
2023-10-25

Go gRPC怎么实现Simple RPC

本篇内容介绍了“Go gRPC怎么实现Simple RPC”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言gRPC主要有4种请求和响应模式
2023-07-02

怎么用Go实现计时器

这篇文章主要介绍“怎么用Go实现计时器”,在日常操作中,相信很多人在怎么用Go实现计时器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Go实现计时器”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!引言
2023-06-30

怎么实现Go超时控制

这篇文章给大家分享的是有关怎么实现Go超时控制的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。为什么需要超时控制?请求时间过长,用户侧可能已经离开本页面了,服务端还在消耗资源处理,得到的结果没有意义过长时间的服务端
2023-06-14

Go库存扣减怎么实现

这篇文章主要介绍了Go库存扣减怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go库存扣减怎么实现文章都会有所收获,下面我们一起来看看吧。Go 库存扣减的几种实现方法这里使用了 grpc、proto、go
2023-06-26

go协程是怎么实现的

Go协程是通过Go语言的运行时(runtime)来实现的。当程序启动时,runtime会创建一个主线程(也称为主协程),然后在主线程上运行主函数。在Go语言中,通过关键字go可以创建一个新的协程(也称为子协程)。go关键字后面跟着一个函数调
2023-10-21

go怎么实现消息队列

在Go语言中,你可以使用第三方库来实现消息队列。目前比较常用的消息队列库有:1. RabbitMQ:RabbitMQ是一个开源的消息队列系统,使用AMQP协议来实现消息的传递。你可以使用Go语言的第三方库`github.com/stread
2023-08-31

Go代理模式怎么实现

Go语言中实现代理模式可以使用结构体和接口的方式。首先,定义一个接口,代理和被代理对象都必须实现这个接口。这里以一个简单的计算器为例:```gotype Calculator interface {Add(a, b int) intSubt
2023-08-08

Go协作与抢占怎么实现

这篇“Go协作与抢占怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go协作与抢占怎么实现”文章吧。1. 用户主动让出
2023-07-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录