2 回答
TA贡献1845条经验 获得超8个赞
WriteMessage 函数是否同步将字节数据发送到客户端?
WriteMessage 将数据写入基础网络连接。
操作系统网络连接维护要传输到对等体的数据缓冲区。当对等方确认对等体接收到数据时,将从缓冲区中删除数据。
写入操作系统网络连接将在所有应用程序数据添加到缓冲区后返回。写入可能会阻止等待缓冲区中的空间。
几乎总是在对等体接收数据之前返回应用程序写入调用。成功调用 WriteMessage 确实意味着对等应用程序读取数据。
或者 ReadMessage 是否主动从服务器获取数据(根据文档,我们需要创建一个事件循环来调用 ReadMessage 函数)。
读取消息调用在基础网络连接上读取。
操作系统缓冲从对等体接收的一定量数据。
读取操作网络连接块,直到缓冲区中有数据可用。
如果服务器继续调用 WriteMessage,但没有人阅读该消息,会发生什么情况。
WriteMessage 最终将阻止在操作系统传输缓冲区中等待空间。
使用写入截止时间来防止在死亡或卡住的对等体上永久阻塞。
数据是丢失了,还是一直保留到下一个读取请求出现?
数据保存在操作系统的传输和接收缓冲区中。
当传输缓冲区已满时,应用程序写入 websocket 连接块。
仅当对等应用程序在对等应用程序读取数据之前终止时,数据才会丢失。
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
- 2 回答
- 0 关注
- 225 浏览
添加回答
举报