Пользовательские таймауты TCP Java Socket не работают только в докере - PullRequest
0 голосов
/ 29 июня 2019

Этот код отлично работает на моей машине по умолчанию O.S, но не в 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 Тайм-аут соединения (второй параметр), вместо него используется тайм-аут по умолчанию вместо того, который я передаю ему. Все остальное работает отлично.

1 Ответ

0 голосов
/ 09 июля 2019

Мы тестировали несколько месяцев, но телеметрия проходила только от нашей ОС через две точки доступа к прототипам, поэтому, если подтверждение не получено из-за того, что прототип умер, я его увижу (мы использовали это, чтобы проверить, были ли связь)

В docker есть прокси между O.S и механизмом докера, поэтому вы всегда будете видеть, что соединение существует, потому что подтверждения всегда поступают из контейнера в O.S сокет.

Решение для реализации поддержки активности на прикладном уровне (вы не можете сделать это на уровне протокола).

Этот пост объясняет это лучше: Выяснение того, было ли доставлено сообщение через tcp

...