Gorilla Websocket中的WriteMessage和ReadMessage是如何工作的?

Gorilla Websocket中的WriteMessage和ReadMessage是如何工作的?,go,gorilla,Go,Gorilla,我与Gorilla Websocket一起工作,对WriteMessage和ReadMessage函数的工作方式很好奇 WriteMessage函数是否同步向客户端发送字节数据?或者ReadMessage是否主动从服务器获取数据(根据文档,我们需要创建一个事件循环来调用ReadMessage函数) 如果服务器一直调用WriteMessage,但没有人读取该消息(客户端通过事件循环调用ReadMessage函数),那么会发生什么情况?是数据丢失,还是一直保存到下一个读取请求到来?谢谢。您可以在此处

我与Gorilla Websocket一起工作,对WriteMessage和ReadMessage函数的工作方式很好奇

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


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

您可以在此处找到该函数的源代码:

看起来这是一种阻塞/同步方法

根据跟踪,他们在此处创建了writer:

然后他们正在写入
数据

if _, err = w.Write(data); err != nil {
    return err
}
这是阻塞,因为它们正在关闭该函数最后一行中的连接,所以此时必须进行写入

这是返回到
w
变量的
io.WriteCloser
接口的行为


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

  • 您应该设置写入/读取超时
  • 库没有重复为您发送数据。您需要在应用程序中实现此逻辑
  • 若服务器启动并接收到您的连接,(可能)它将读取您的消息(若在执行数据之前未停止)
  • 若您发送了邮件,但服务器已关闭(未收到您的邮件),则您的数据将丢失

附加参考:
  • w.Write
    功能:
  • io.WriteCloser
    接口说明:
  • Gorila Websocket超时:
  • Gorila的超时文档:

您可以在此处找到该函数的源代码:

看起来这是一种阻塞/同步方法

根据跟踪,他们在此处创建了writer:

然后他们正在写入
数据

if _, err = w.Write(data); err != nil {
    return err
}
这是阻塞,因为它们正在关闭该函数最后一行中的连接,所以此时必须进行写入

这是返回到
w
变量的
io.WriteCloser
接口的行为


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

  • 您应该设置写入/读取超时
  • 库没有重复为您发送数据。您需要在应用程序中实现此逻辑
  • 若服务器启动并接收到您的连接,(可能)它将读取您的消息(若在执行数据之前未停止)
  • 若您发送了邮件,但服务器已关闭(未收到您的邮件),则您的数据将丢失

附加参考:
  • w.Write
    功能:
  • io.WriteCloser
    接口说明:
  • Gorila Websocket超时:
  • Gorila的超时文档:
WriteMessage函数是否同步向客户端发送字节数据

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

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

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

几乎总是这样,应用程序写调用在对等方接收数据之前返回。成功调用WriteMessage并不意味着对等应用程序读取数据

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

ReadMessage在基础网络连接上调用read

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

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

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

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

在死机或死机的对等机上使用可防止永久阻塞

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

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

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

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

WriteMessage函数是否同步向客户端发送字节数据

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

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

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

几乎总是这样,应用程序写调用在对等方接收数据之前返回。成功调用WriteMessage并不意味着对等应用程序读取数据

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

ReadMessage调用re