为了账号安全,请及时绑定邮箱和手机立即绑定

大猩猩Websocket中的WriteMessage和ReadMessage如何工作?

大猩猩Websocket中的WriteMessage和ReadMessage如何工作?

Go
幕布斯7119047 2022-08-01 15:13:39
我正在与Gorilla Websocket合作,并对WriteMessage和ReadMessage功能的工作原理感到好奇。WriteMessage 函数是否同步将字节数据发送到客户端?或者 ReadMessage 是否主动从服务器获取数据(根据文档,我们需要创建一个事件循环来调用 ReadMessage 函数)。如果服务器继续调用 WriteMessage,但没有人读取消息(客户端通过事件循环调用 ReadMessage 函数),数据是丢失了,还是一直保留到下一个读取请求,会发生什么情况?谢谢。
查看完整描述

2 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

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

WriteMessage 将数据写入基础网络连接。

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

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

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

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

读取消息调用在基础网络连接上读取。

操作系统缓冲从对等体接收的一定量数据。

读取操作网络连接块,直到缓冲区中有数据可用。

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

WriteMessage 最终将阻止在操作系统传输缓冲区中等待空间。

使用写入截止时间来防止在死亡或卡住的对等体上永久阻塞。

数据是丢失了,还是一直保留到下一个读取请求出现?

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

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

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


查看完整回答
反对 回复 2022-08-01
?
RISEBY

TA贡献1856条经验 获得超5个赞

您可以在此处找到该函数的源代码:https://github.com/gorilla/websocket/blob/c3dd95aea9779669bb3daafbd84ee0530c8ce1c1/conn.go#L751-L774


看起来这是阻止/同步方法。


根据跟踪 他们在这里创建作家:https://github.com/gorilla/websocket/blob/c3dd95aea9779669bb3daafbd84ee0530c8ce1c1/conn.go#L766


w, err := c.NextWriter(messageType)

然后他们写:data


if _, err = w.Write(data); err != nil {

    return err

}

这是阻塞,因为它们正在关闭该函数的最后一行中的连接,因此必须在此时完成写入。


这是返回到变量中的接口的行为。io.WriteCloserw


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


应设置写入/读取超时。

库不会重复为您发送数据。您需要在应用程序中实现此逻辑。

如果服务器启动并收到您的连接,(可能)它将读取您的消息(如果在执行数据之前未停止)。

如果您发送了消息并且服务器已死(未收到您的消息),则您的数据将丢失。

其他参考:

功能:https://github.com/gorilla/websocket/blob/c3dd95aea9779669bb3daafbd84ee0530c8ce1c1/conn.go#L650-L675w.Write

接口描述:https://golang.org/pkg/io/#WriteCloserio.WriteCloser

戈里拉·韦伯塞特超时:https://pkg.go.dev/github.com/gorilla/websocket#Conn.SetReadDeadline

Gorila 的超时文档:https://pkg.go.dev/github.com/gorilla/websocket#Conn.SetReadDeadline


查看完整回答
反对 回复 2022-08-01
  • 2 回答
  • 0 关注
  • 225 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信