Go 实现 WebSockets和什么是 WebSockets

目录
  • 前言
  • 什么是 WebSockets
  • 网络套接字与 WebSockets
  • 套接字通信
  • 总结

前言

日常工作中,在不刷新页面的情况下发送消息并获得即时响应是我们认为理所当然的事情。但在过去,启用实时功能对开发人员来说是一个真正的挑战。开发者社区从 HTTP 长轮询和 AJAX 走过了漫长的道路,终于找到了构建真正实时应用程序的解决方案。

这个解决方案以 WebSockets 的形式出现,它可以在用户的浏览器和服务器之间打开一个交互式会话。 WebSockets 允许浏览器向服务器发送消息并接收事件驱动的响应,而无需轮询服务器以获取回复。

目前,WebSockets 是构建实时应用程序的第一大解决方案:在线游戏、即时通讯、跟踪应用程序等。

本文将解释 WebSockets 的运作方式,然后使用 Go 语言构建一个简单的 WebSocket 应用程序。

什么是 WebSockets

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

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

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 对象接收服务器的响应。

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

客户端代码:

// init
tcpAddr, 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 message
var buf [{buffSize}]byte
_, err := conn.Read(buf[0:])
if err != nil {
// handle error
}

服务端代码:

// init
tcpAddr, 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 connection
conn, err := listener.Accept()
if err != nil {
// handle error
}

// send message
if _, err := conn.Write({message}); err != nil {
// handle error
}
// receive message
buf := make([]byte, 512)
n, err := conn.Read(buf[0:])
if err != nil {
// handle error
}
  • 连接到 UDP 套接字

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

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

客户端:

// init
raddr, err := net.ResolveUDPAddr("udp", address)
if err != nil {
// handle error
}

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

服务端:

// init
udpAddr, err := net.ResolveUDPAddr(resolver, serverAddr)
if err != nil {
// handle error
}

conn, err := net.ListenUDP("udp", udpAddr)
if err != nil {
// handle error
}
.......
// send message
buffer := make([]byte, maxBufferSize)
n, addr, err := conn.ReadFromUDP(buffer)
if err != nil {
// handle error
}
.......
// receive message
buffer := 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) 协议需要哪些统一的资源标识符方案。

这是客户端请求的样子:

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

这是服务器响应:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

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

  • 轻量级报头减少了数据传输开销。
  • 单个 Web 客户端只需要一个 TCP 连接。
  • WebSocket 服务器可以将数据推送到 Web 客户端。

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

到此这篇关于Go 实现 WebSockets和什么是 WebSockets的文章就介绍到这了,更多相关Go 实现 WebSockets内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解Django3中直接添加Websockets方式

    现在Django 3.0附带了对ASGI的支持,将Websockets添加到Django应用中不需要任何额外的依赖关系. 在本文中,您将学习如何通过扩展默认的ASGI应用程序来使用Django处理Websocket. 我们将介绍如何在示例ASGI应用程序中处理Websocket连接,发送和接收数据以及实现业务逻辑. 入门 首先,您需要在计算机上安装Python> = 3.6. Django 3.0仅与Python 3.6及更高版本兼容,因为它使用了async和await关键字. 完成Python

  • Go 实现 WebSockets和什么是 WebSockets

    目录 前言 什么是 WebSockets 网络套接字与 WebSockets 套接字通信 总结 前言 日常工作中,在不刷新页面的情况下发送消息并获得即时响应是我们认为理所当然的事情.但在过去,启用实时功能对开发人员来说是一个真正的挑战.开发者社区从 HTTP 长轮询和 AJAX 走过了漫长的道路,终于找到了构建真正实时应用程序的解决方案. 这个解决方案以 WebSockets 的形式出现,它可以在用户的浏览器和服务器之间打开一个交互式会话. WebSockets 允许浏览器向服务器发送消息并接收

  • 简介Nginx服务器的Websockets配置方法

    Nginx 1.3.13 已经发布了,该版本支持 Connection: upgrade 和 Upgrade 头,这就意味着支持WebSocket代理了.很多人都在等这个新特性以至于 "Nginx 支持 websockets 吗?" 成为了 freenode上的#nginx频道最常问的问题. 有了这种方式,让我们来看看Nginx的WebSocket实现. Nginx新添加的Websockets配置指令 文档中提到的配置如下:(译者注:原文中的链接其实不是文档的链接.现在nginx的官方

  • Go 实现 WebSockets之创建 WebSockets

    目录 前言 建立 HTTP 服务器 发起握手 WebSockets 的用例 总结 前言 上一篇文章Go 实现 WebSockets和什么是 WebSockets我们先介绍了什么是 WebSockets 协议.本篇文章将来介绍如何利用 Go 来实现一个 WebSockets.要基于 net/http 库编写一个简单的 WebSocket 响应服务器,我们需要: 建立握手 从客户端接收数据帧 向客户端发送数据帧 关闭握手 WebSockets 无需客户端事先请求即可从服务器传输数据,允许来回传递消息

  • JavaEE7+Websockets+GlassFish4打造聊天室

    在客户机和服务器之间建立单一的双向连接,这就意味着客户只需要发送一个请求到服务端,那么服务端则会进行处理,处理好后则将其返回给客户端,客户端则可以在等待这个时间继续去做其他工作,整个过程是异步的.在本系列教程中,将指导用户如何在JAVA EE 7的容器GlassFish 4中,使用JAVA EE 7中的全新的解析Json API(JSR-353),以及综合运用jQuery和Bootstrap.本文要求读者有一定的HTML 5 Websocket的基础原理知识. 效果图 我们先来看下在完成这个教程

  • 使用Nginx做WebSockets代理教程

    WebSocket 协议提供了一种创建支持客户端和服务端实时双向通信Web应用程序的方法.作为HTML5规范的一部分,WebSockets简化了开发Web实时通信程序的难度.目前主流的浏览器都支持WebSockets,包括火狐.IE.Chrome.Safari以及Opera等,而且,越来越多的服务器应用框架也开始支持WebSockets. 要在企业产品中使用WebSockets,为满足高性能和高可用性,需要多个WebSocket服务器.负载均衡层需要支持WebSocket协议.Nginx从1.3

  • springboot集成WebSockets广播消息(推荐)

    一 WebScoketS 简介 RFC 6455 即 webSockets 协议提供了一种标准化的方式去建立全双工,双方面交流的通道在客户端和服务端甚至单一的TCP连接中进行通信: webSockets 协议其跟HTTP的tcp协议不同,但是其设计目的是通过HTTP协议进行工作,可以使用40或者443端口和重新使用现有的防火墙规则: GET /spring-websocket-portfolio/portfolio HTTP/1.1 Host: localhost:8080 Upgrade: w

  • Visual Studio 2017 ASP.NET Core开发

    Visual Studio 2017 ASP.NET Core开发,Visual Studio 2017 已经内置ASP.NET Core 开发工具. 在选择.NET Core 功能安装以后就可以进行ASP.NET Core开发. 新的ASP.NET Core项目为csproj ,打开之前的xproj项目,会提示单向升级,确认以后,会自动帮你升级至csproj. 新建项目 VS 2017新建ASP.NET Core 项目: 确定以后 可选择ASP.NET Core 1.0 和ASP.NET Co

  • Asp.net SignalR支持的平台有哪些

    SignalR支持多种服务器和客户端配置.此外,每种传输方式都有自身的要求限制:如果某种传输方式不被系统支持,SignalR能够优雅地将故障转移到其他类型的传输方式. 系统要求 SignalR服务器组件可以被多种服务器配置所支持.本节介绍所支持的操作系统,.Net框架,IIS及其他组件. 支持的服务器操作系统 SignalR的服务器组件被以下服务器和客户端操作系统支持. Windows Server 2012 Windows Server 2008 R2 Windows 8 Windows 7

  • HTTPS混合内容解析附解决方法

    什么是HTTPS混合内容 我们可能会有这样的经验,当我们通过HTTPS访问一个网站的时候,突然有提示:"本页面包含有不安全的内容".这个时候会询问是否显示"不安全的内容",这个时候,就是遇到了有混合内容的页面了. HTTPS下的页面,几乎很少是采用单一连接,HTML标识.图片.JS脚本以及其他页面资源不仅是多个连接获取到,甚至可能是来自完全不同的服务器和网站.为了确保一个页面进行了正确的加密,所有的页面资源都通过HTTPS进去获取是必要的.但在实际情况中,全部资源都

随机推荐