Как установить тайм-аут при подключении к клиентскому сокету? - PullRequest
33 голосов
/ 12 апреля 2011

Я пытаюсь установить время ожидания соединения на клиентском сокете в Java.Я установил время ожидания подключения по умолчанию на 2000, то есть:

this.socket.connect(this.socketAdd, timeOut);

Это я пытаюсь в веб-приложении.Когда пользователь делает запрос, я передаю значения серверу сокетов, но если я не получаю ответ в течение 5 секунд, сокет должен отключиться.Но в моем случае весь запрос снова отправляется.Может ли кто-нибудь сказать мне, где я иду не так?

Я хочу разорвать соединение сокета, если я не получаю ответ в течение 5 секунд.Как я могу установить это?Любой пример кода поможет.

Ответы [ 3 ]

40 голосов
/ 27 января 2012

Вы даже можете попробовать:

Socket client=new Socket();   
client.connect(new InetSocketAddress(hostip,port_num),connection_time_out); 
25 голосов
/ 06 июня 2013

Чтобы собрать все вместе:

Socket socket = new Socket();
// This limits the time allowed to establish a connection in the case
// that the connection is refused or server doesn't exist.
socket.connect(new InetSocketAddress(host, port), timeout);
// This stops the request from dragging on after connection succeeds.
socket.setSoTimeout(timeout);
18 голосов
/ 12 апреля 2011

То, что вы показываете, является тайм-аутом для соединения, это будет тайм-аут, если оно не может подключиться в течение определенного времени.

Ваш вопрос подразумевает, что вы хотите установить тайм-аут, если вы уже подключены и отправили запрос, вы хотите установить тайм-аут, если в течение определенного времени не будет ответа.

Предполагая, что вы имеете в виду последнее, вам нужно тайм-аут socket.read(), что можно сделать, установив SO_TIMEOUT с помощью метода Socket.setSoTimeout (int timeout) . Это вызовет исключение, если чтение займет больше указанного количества миллисекунд. Например:

this.socket.setSoTimeout(timeOut);

Альтернативным методом является чтение в потоке, а затем ожидание в потоке с таймаутом и закрытие сокета, если он истек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...