首页 > 解决方案 > Gorilla Websocket 中的 WriteMessage 和 ReadMessage 是如何工作的?

问题描述

我正在使用Gorilla Websocket,并对 WriteMessage 和 ReadMessage 函数的工作方式感到好奇。

WriteMessage 函数是否将字节数据同步发送到客户端?或者 ReadMessage 是否主动从服务器获取数据(根据文档,我们需要创建一个事件循环来调用 ReadMessage 函数)。

如果服务器一直调用WriteMessage,但是没有人读取消息(客户端通过事件循环调用ReadMessage函数)会发生什么,是数据丢失了,还是一直保存到下一个读取请求到来?谢谢你。

标签: gogorilla

解决方案


WriteMessage 函数是否将字节数据同步发送到客户端?

WriteMessage 将数据写入底层网络连接。

操作系统网络连接维护一个数据缓冲区以传输到对等方。当对等方确认对等方接收到数据时,从缓冲区中删除数据。

将所有应用程序数据添加到缓冲区后,写入操作系统网络连接返回。写可以阻塞等待缓冲区中的空间。

应用程序写入调用几乎总是在对等方接收到数据之前返回。对 WriteMessage 的成功调用确实意味着对等应用程序读取了数据。

或者 ReadMessage 是否主动从服务器获取数据(根据文档,我们需要创建一个事件循环来调用 ReadMessage 函数)。

ReadMessage 在底层网络连接上调用 read。

操作系统缓冲从对等方接收到的一些数据量。

读取正在运行的网络连接块,直到缓冲区中有数据可用。

如果服务器一直调用 WriteMessage,但没有人阅读该消息,会发生什么情况。

WriteMessage 最终会阻塞等待操作系统传输缓冲区中的空间。

使用写入期限来防止永远阻塞死的或卡住的对等点。

数据是丢失了,还是一直保存到下一个读取请求到来?

数据保存在操作系统的发送和接收缓冲区中。

当传输缓冲区已满时,应用程序写入 websocket 连接块。

仅当对等应用程序在对等应用程序读取数据之前终止时,数据才会丢失。


推荐阅读