go - 服务器或客户端如何知道连接是否断开?

标签 go streaming grpc

我不知道grpc streaming的内部工作。我有一个场景,其中有服务器端流,并且如果我从网络中删除客户端(通过拉出网络电缆,可以说),则不会出现任何错误,也不会出现客户端或服务器端的错误。

有人可以帮忙吗?

如果我杀死服务器,客户端就会知道。如果我杀死客户端,服务器就会知道。但是并没有发现断开连接。

我有兴趣知道为什么它不起作用以及在服务器或客户端被杀死的情况下它如何起作用。是否发送了一些heartbeat消息以检查连接性或如何完成连接?我的意思是,如果我每30秒发送一次数据,它如何工作?

最佳答案

如果中间网络路径暂时消失,则Internet将无法工作。
空闲的网络连接应该能够容忍临时的网络路径消失。

当双方断开连接时,看到服务器/客户端连接中断的原因是由于主动断开了与应用层(网络层7)之间的连接。
断开物理电缆,仅切断physical network layer,其效果不一定会向上级联,尤其是在空闲连接的情况下。

如果您的应用程序规范坚持一定程度的“ liveness ”(每30秒说一次事件,甚至是心跳),则可以确保服务器始终向gRPC流发送甚至NOP(心跳)。在这种情况下,服务器将在30秒内经历网络中断(甚至更糟)。

同样,如果您担心客户端可能正在等待无法再建立的连接,则如果记录(甚至是脉动信号)没有异常,则可以在客户端使用计时器循环的go-routine来取消连接上下文。在最近30秒内收到。

关于go - 服务器或客户端如何知道连接是否断开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59876968/

相关文章:

grpc - gRPC 客户端连接超时是否可以独立于重新连接退避设置进行设置?

file - "./..."是否表示所有子文件夹?

string - 如何在 Go 中解析毫秒以来的时间戳字符串?

amazon-web-services - 我应该如何将 Amazon RDS 集成到 Flutter 中?任何本地 Dart 支持包?

c# - 如何创建proto文件来获取字节数组?

ios - 在设备上构建时找不到<Accelerate/Accelerate.h>

json - Golang 从 api.nal.usda.gov/ndb 解码 JSON

templates - Golang 模板 : for construction

html - 带预处理的流式 MP3

android - android中流媒体视频文件的自定义搜索栏