Golang 搭建 WebSocket 应用(一) - 初识 gorilla/websocket

这篇具有很好参考价值的文章主要介绍了Golang 搭建 WebSocket 应用(一) - 初识 gorilla/websocket。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在本系列文章中,将会使用在 Go 中一个用得比较多的 WebSocket 实现 gorilla/websocket。

背景知识 - HTTP 与 WebSocket 的关系

本文会涉及到一些原理讲解,其中比较关键的一个是 HTTP 与 WebSocket 的联系与区别,了解这个可以帮助我们更好地使用 WebSocket

如果我们此前已经使用过 WebSocket,比如在 nginx 配置过 WebSocket,我们就会发现:

  1. 有个类似 upgrade 的关键字。这个关键字体现了 HTTP 与 WebSocket 的本质区别。
  2. 在 nginx 里配置,意味着 WebSocket 本质上也是通过 HTTP 协议来工作的。

我们知道,HTTP 的请求会在请求结束之后断开 TCP 连接,但 WebSocket 不一样,它在建立连接之后会一直维持着连接状态,
这样客户端与服务端就可以一直维持通信状态了。

WebSocket 建立连接的过程

在 WebSocket 协议中,初始的握手阶段使用标准的 HTTP 请求和响应:

  1. 客户端先发送一个 HTTP 请求,请求升级到 WebSocket 协议。
  2. 服务器在收到这个请求后,如果同意升级到 WebSocket,就会返回一个状态码为 101 的 HTTP 响应,指示升级成功,然后不会断开 TCP 连接。

这个过程涉及到的 HTTP 头部字段是 UpgradeConnection,具体而言,HTTP 请求头部可能包含类似以下的字段:

请求:

GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade

响应:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade

也就是说,我们所看到的 Upgrade 实际上是把一个 HTTP 连接升级为了 WebSocket 连接,这个连接可以实现双向的通信。

这使得它非常适合实时通信的应用,例如聊天应用、在线游戏等。

gorilla/websocket 中的基本概念

WebSocket 连接 - Conn

在 gorilla/websocket 中使用 Conn 来表示一个 WebSocket 连接,它主要有如下作用:

  • 发送消息给客户端:Write* 方法,如 WriteJSON 发送 JSON 类型消息,又或者 WriteMessage 可以发送普通的文本消息。
  • 接收客户端发送的消息:Read* 方法,如 ReadJSONReadMessage
  • 其他功能:关闭连接、获取客户端 IP 地址等

消息

在 gorilla/websocket 中,消息被分为以下几种:

  • 数据消息:
    • TextMessage 文本消息:文本消息被解析为 UTF-8 编码的文本。需要应用程序来确保文本消息是有效的 UTF-8 编码文本。
    • BinaryMessage 二进制消息:二进制消息的解析留给应用程序。
  • 控制消息:可以调用 Conn 中的 WriteControlWriteMessageNextWriter 方法,将控制消息发送给对方。
    • CloseMessage 关闭连接的消息
    • PingMessage ping 消息
    • PongMessage pong 消息

注意:应用程序需要先读取连接中的消息才能处理从对等方发送的 closepingpong 消息。如果应用程序对来自对等方的消息不感兴趣,
则应用程序应启动一个 goroutine 来读取和丢弃来自对等方的消息。

并发

虽然 Golang 中有 goroutine 可以支持我们做并发操作,但是在 gorilla/websocket 中,
一个 WebSocket 连接只支持一个并发 reader 和一个并发 writer

我们的应用程序应该确保不超过一个 goroutine 同时调用写入方法(WriteMessageWriteJSON)或者读取方法(ReadMessageReadJSON)。

CloseWriteControl 方法可以与其他所有方法同时调用。

安全性

我们知道,在一般的 web 应用中,经常需要处理跨域的问题,同样的,在 gorilla/websocket 中也需要做一定的配置。

我们可以在 Upgrader 中的 CheckOrigin 字段中指定函数的 Origin 检查策略,如果 CheckOrigin 函数返回 false,则 Upgrader 方法将拒绝建立 WebSocket 连接,如果允许所有来源的连接,我们可以直接返回 true 即可。

var upgrader = websocket.Upgrader{
	ReadBufferSize:  1024,
	WriteBufferSize: 1024,
	CheckOrigin: func(r *http.Request) bool {
		return true
	},
}

缓冲

缓冲在 io 类操作中是一个很常见的术语,在 gorilla/websocket 中我们可以通过上面那段代码的
ReadBufferSizeWriteBufferSize 来指定连接的缓冲大小,以减少读取或写入消息时的系统调用次数。

默认大小为 4096,建议限制为最大预期消息的大小,大于最大消息最大大小的缓冲区不会带来任何好处。

Hello World

最后,让我们通过一个简单的 Hello World 程序来结束本文:

main.go

package main

import (
	"github.com/gorilla/websocket"
	"log"
	"net/http"
)

var upgrader = websocket.Upgrader{
	ReadBufferSize:  1024,
	WriteBufferSize: 1024,
	CheckOrigin: func(r *http.Request) bool {
		return true
	},
}

func handler(w http.ResponseWriter, r *http.Request) {
	conn, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		log.Fatal(err)
	}

	conn.WriteMessage(websocket.TextMessage, []byte("Hello, World!"))
	conn.Close()
}

func main() {
	http.HandleFunc("/ws", handler)
	http.ListenAndServe(":8181", nil)
}

执行 go run main.go 启动 WebSocket 服务端,然后,我们打开一个浏览器的控制台,
在里面执行下面的 JavaScript 代码:

let ws = new WebSocket('ws://127.0.0.1:8181/ws')

不出意外的话,我们可以在浏览器控制台的 Network -> WS 中看到由服务端发送的 Hello, World!文章来源地址https://www.toymoban.com/news/detail-811972.html

到了这里,关于Golang 搭建 WebSocket 应用(一) - 初识 gorilla/websocket的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • golang中快速用melody搭建轻量的websocket服务

    在Go中,可以使用 gin 和 melody 库来搭建一个轻量级的WebSocket服务。 gin 是一个流行的Web框架,而 melody 是一个用于处理WebSocket的库。以下是一个简单的示例代码,演示了如何使用 gin 和 melody 搭建WebSocket服务: 在上面的示例中,我们首先创建了一个 gin 的 Engine 实例,并创建了一

    2024年02月08日
    浏览(39)
  • go cannot find package “github.com/gorilla/websocket“解读

    在Go开发过程中,我们经常会依赖第三方库来简化开发工作。而使用 go get 命令安装这些库时,有时候我们可能会遇到类似于以下错误的情况: 这个错误意味着Go编译器无法找到名为\\\"github.com/gorilla/websocket\\\"的包。那么我们应该如何解决这个问题呢?下面提供了几种常见的解决方

    2024年01月24日
    浏览(91)
  • 3分钟使用 WebSocket 搭建属于自己的聊天室(WebSocket 原理、应用解析)

    在 WebSocket 出现之前,我们想实现实时通信、变更推送、服务端消息推送功能,我们一般的方案是使用 Ajax 短轮询、长轮询两种方式: 比如我们想实现一个服务端数据变更时,立即通知客户端功能,没有 WebSocket 之前我们可能会采用以下两种方案:短轮询或长轮询 上面两种方

    2024年02月03日
    浏览(133)
  • SpringBoot使用-基于Idea搭建WebSocket应用

    SpringBoot是所有基于Spring开发项目的起点,使得开发者能快速搭建 Spring 项目。在Idea集成工具环境下,通过使用SpringBoot,开发人员选用合适的Maven设置,能够方便地搭建WebSocket应用。 不同的Idea版本可能搭建方式略有出入,本文采用的Idea版本为 2018.3.5 (Ultimate Edition), 具体搭建

    2024年02月11日
    浏览(35)
  • golang Gin实现websocket

    golang使用 Gin实现 websocket,这里笔者重新搭建一个项目 项目名为 go-gin-websocket 在指定文件夹下,新建项目文件夹 go-gin-websocket 进入项目文件夹,打开cmd窗口,在项目(go-gin-websocket)文件夹路径下,执行初始化命令 go mod init go-gin-websocket 安装依赖 安装gin  安装websocket 在项

    2024年02月06日
    浏览(49)
  • Golang WebSocket 创建单独会话

    在互联网应用程序中,实时通信是一种非常重要的功能。WebSocket 是一种基于 TCP 的协议,它允许客户端和服务器之间进行双向通信。Golang 是一种高性能的编程语言,它提供了对 WebSocket 的原生支持,使得在 Golang 中创建 WebSocket 会话变得非常简单。本文将介绍如何使用 Golang 创

    2024年02月08日
    浏览(36)
  • Golang实现简单WebSocket服务

    我们每天接触到各类应用,如社交、在线文档、直播等,后端都需要使用WebSocket技术提供实时通信能力。本文介绍如何使用Golang实现实时后端WebSocket服务,首先使用Gin框架搭建http服务,然后使用 gorilla/websocket 库实现简单后端WebSocket服务,示例实现从0到1的过程,适合初学者快

    2024年02月16日
    浏览(44)
  • golang网络编程学习-websocket

    golang网络编程学习-websocket 网络编程主要的内容是: 1.TCP网络编程 2.http服务 3.rpc服务 4.websocket服务 1.1服务端,代码来自网络,仅限于学习研究   服务端截图   1.2客户端,代码来自网络,仅限于学习研究      客户端浏览器运行内容信息    

    2024年02月17日
    浏览(50)
  • golang语言websocket百万长链接

    是简单demo测试 cup 最理想的处理大概是每秒100万次,已经到了极限 减少网络小包的发送,小包大概几百字节,把同一秒中的推送的条数合并成一条,合并后 每秒推送的次数 等于 连接数 , 打包json

    2023年04月13日
    浏览(38)
  • golang中的websocket,使用wireshark抓包

    websocket 是一个长连接协议,全双工通信,主要应用在及时通信:实时聊天,游戏,在线文档等等。 简单示例 客户端 服务端 运行 go run server.go 访问 http://xxx.xxx.xxx.xxx:8080/ 请求头 响应头 websocket 是在 http 的基础上改造而成的,首先客户端改造成上面的请求头,服务端先要构建

    2024年02月09日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包