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

我正在与Gorilla Websocket合作,并对WriteMessage和ReadMessage功能的工作原理感到好奇。

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

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


幕布斯7119047
浏览 232回答 2
2回答

精慕HU

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

RISEBY

您可以在此处找到该函数的源代码:https://github.com/gorilla/websocket/blob/c3dd95aea9779669bb3daafbd84ee0530c8ce1c1/conn.go#L751-L774看起来这是阻止/同步方法。根据跟踪 他们在这里创建作家:https://github.com/gorilla/websocket/blob/c3dd95aea9779669bb3daafbd84ee0530c8ce1c1/conn.go#L766w, err := c.NextWriter(messageType)然后他们写:dataif _, 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.SetReadDeadlineGorila 的超时文档:https://pkg.go.dev/github.com/gorilla/websocket#Conn.SetReadDeadline
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go