【问题标题】:TCP Java Socket custom timeouts not working only on dockerTCP Java Socket 自定义超时不适用于 docker
【发布时间】:2019-06-29 08:41:25
【问题描述】:

这段代码在我的机器上完美运行,但在 Docker 中不行,我没有找到任何关于它的文档。

    clientSocket = new Socket();

    SocketAddress sockaddr = new InetSocketAddress(propertyFile.getProperty("tcp.pod.ip"),
            Integer.parseInt(propertyFile.getProperty("tcp.pod.port")));

    clientSocket.connect(sockaddr, 150);

    clientSocket.setTcpNoDelay(true);

在docker中不起作用的部分是clientSocket connect timeout(第二个参数),它采用默认超时而不是我传递给他的那个。其他一切都完美无缺。

【问题讨论】:

  • 请添加您的 Dockerfile 的内容。你使用 EXPOSE 指令了吗?
  • 这个套接字在你的主机上运行,​​你想从你的容器连接到它吗?
  • 定义'不起作用'。
  • 是吗?默认超时比如什么?
  • '再也见不到'与'采用默认超时'相矛盾,大约一分钟。

标签: java docker sockets tcp docker-compose


【解决方案1】:

我们已经测试了几个月,但遥测只是从我们的操作系统通过两个访问点访问原型,所以如果由于原型死亡而没有收到 ack,我会看到它(我们使用它来查看是否有沟通)

使用 docker 在 OS 和 docker 引擎之间有一个代理,因此您将看到始终存在连接,因为 acks 总是从容器到达 OS 套接字。

在应用层实现keep alive的解决方案(你不能在协议层这样做)。

这篇文章解释得更好:Finding out if a message over tcp was delivered

【讨论】:

    猜你喜欢
    • 2021-02-28
    • 2013-09-11
    • 2012-10-16
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    相关资源
    最近更新 更多