Этот код работает с ОС по умолчанию отлично на моей машине, но с не в докере, и я не нашел никакой документации по этому поводу.
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);
Часть, которая не работает в докере, — это clientSocket время ожидания подключения (второй параметр), он использует тайм-аут по умолчанию вместо того, который я ему передаю. Все остальное работает идеально.
Этот сокет работает на вашем хосте, и вы хотите подключиться к нему из своего контейнера?
Добавлены Dockerfile и docker-compose-yml
Дайте определение «не работает».
Он использует тайм-аут по умолчанию вместо тайм-аута, который я передаю в функции
Имеет ли это? Тайм-аут по умолчанию, например, что?
Я оставил его работать более 30 секунд и до сих пор не распознал тайм-аут (и отключил прототип). Без докера ровно столько времени, сколько я прохожу в функции 150 мс или что-то в этом роде.
Я нашел это в другом посте: «Количество повторных попыток и интервал между ними определяются реализацией TCP/IP в ОС, а Java не позволяет ни узнать, каковы эти значения, ни изменить их».
Вы не ответили на мой вопрос. Какое время ожидания по умолчанию у вас было? И какое значение имеет количество повторных попыток?
Я знаю, что без докера это работает, а с докером нет, и поведение такое же, как если бы я поставил очень длинное значение во втором параметре функции socker.connect. Точное время не замерял, отключал через 30 секунд при разных тестах. Я постараюсь предоставить сегодня днем или завтра точное время, оставив его все время, необходимое для работы, и два короткометражных видео.
Например, если поставить 9000 мс. Если я отключаю плату, я вижу отключение через 9 секунд, если я ставлю 150 мс, я вижу отключение почти сразу, но в докере я его никогда не вижу. Выхожу из теста через 30 секунд, думаю проблема с розеткой
Все остальное работает как в докере, так и без него. Я думал, что это может быть из-за разных реализаций или из-за того, что этот образ докера не является целым Linux из-за конфликтов.
«Никогда не видеть это снова» противоречит «требуется тайм-аут по умолчанию», который составляет около минуты.
Да, вы правы @user207421. Я хочу знать, почему это занимает время по умолчанию, или что происходит, и как я могу это решить.




Мы тестировали в течение нескольких месяцев, но телеметрия была только от нашей ОС через две точки доступа к прототипам, поэтому, если подтверждение не будет получено из-за того, что прототип умер, я увижу это (мы использовали это, чтобы увидеть, была ли связь)
С докером между ОС и механизмом докера есть прокси-сервер, поэтому вы всегда будете видеть, что есть соединение, потому что acks всегда поступает из контейнера в сокет ОС.
Решение для реализации поддержки на уровне приложения (вы не можете сделать это на уровне протокола).
Этот пост объясняет это лучше: Узнать, было ли доставлено сообщение по tcp
Пожалуйста, добавьте содержимое вашего Dockerfile. Вы использовали инструкцию EXPOSE?