go - Gorilla Websocket 中的 WriteMessage 和 ReadMessage 是如何工作的?
问题描述
我正在使用Gorilla Websocket,并对 WriteMessage 和 ReadMessage 函数的工作方式感到好奇。
WriteMessage 函数是否将字节数据同步发送到客户端?或者 ReadMessage 是否主动从服务器获取数据(根据文档,我们需要创建一个事件循环来调用 ReadMessage 函数)。
如果服务器一直调用WriteMessage,但是没有人读取消息(客户端通过事件循环调用ReadMessage函数)会发生什么,是数据丢失了,还是一直保存到下一个读取请求到来?谢谢你。
解决方案
WriteMessage 函数是否将字节数据同步发送到客户端?
WriteMessage 将数据写入底层网络连接。
操作系统网络连接维护一个数据缓冲区以传输到对等方。当对等方确认对等方接收到数据时,从缓冲区中删除数据。
将所有应用程序数据添加到缓冲区后,写入操作系统网络连接返回。写可以阻塞等待缓冲区中的空间。
应用程序写入调用几乎总是在对等方接收到数据之前返回。对 WriteMessage 的成功调用确实意味着对等应用程序读取了数据。
或者 ReadMessage 是否主动从服务器获取数据(根据文档,我们需要创建一个事件循环来调用 ReadMessage 函数)。
ReadMessage 在底层网络连接上调用 read。
操作系统缓冲从对等方接收到的一些数据量。
读取正在运行的网络连接块,直到缓冲区中有数据可用。
如果服务器一直调用 WriteMessage,但没有人阅读该消息,会发生什么情况。
WriteMessage 最终会阻塞等待操作系统传输缓冲区中的空间。
使用写入期限来防止永远阻塞死的或卡住的对等点。
数据是丢失了,还是一直保存到下一个读取请求到来?
数据保存在操作系统的发送和接收缓冲区中。
当传输缓冲区已满时,应用程序写入 websocket 连接块。
仅当对等应用程序在对等应用程序读取数据之前终止时,数据才会丢失。
推荐阅读
- sql-server - 从字符串中删除前导字符
- linux - 如何在 bash 脚本中使用 find 命令检查目录大小
- visual-studio-code - 更改 ctrl+ko(新项目)目录
- java - 如何在 Launch4j 创建的 .exe 文件中打包 JavaFX?
- javascript - 修复 Redux 有效负载正在控制台中登录减速器,但在模式中说无法读取 null 的属性?
- excel - 用户表单应该只返回过滤的行
- angular - Angular 7 调用服务,承诺在调用另一个函数的组件内调用函数
- spring-webflux - 我怎样才能 bodyToMono 两次?
- python - 遍历 json 对象,然后将结果添加到数组中
- python - 如何修复 VSCODE 中的自动完成问题?