2011-09-21 2 views
2

Я посылаю ASCII через сокет так:Java Оправа Задержка продолжала

outputStreamWriter(s + (char) 13); 
outputStreamWriter.flush(); 

в поле, может быть от 10 до 30 секундной задержки между Flush() и данных, посылаемых по сети (проверяется с помощью wirehark).

Для того, чтобы проверить подключение к сокету Я использую это:

public final boolean isConnected() { 
    try { 
    socket.sendUrgentData(32); 
    return true; 
    } catch (IOException e) { 
    return false; 
    } 

Когда я избавляюсь от sendUrgentData и просто возвращает истину в IsConnected(), задержка уходит.

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

Любые идеи? Спасибо, Andrew

ответ

0

Вы можете попробовать отключить нагло (Socket.setTcpNoDelay()), однако эта задержка обычно составляет от 40 до 200 мс в зависимости от ОС. Я никогда не видел что-то, что вызывает мульти-секундную задержку с (за исключением полной GC, который несомненно, является причиной здесь)

+0

Извините, я должен был упомянуть, я установил TcpNoDelay (true), и задержка все еще там. – andrewmara

3

Я посылаю ASCII через сокет, как это:

outputStreamWriter(s + (char) 13); 

Нет вы нет. Этот код даже не компилируется.

Для того, чтобы проверить подключение к сокету Я использую это

Бесполезно. Это не проверяет соединение сокета. Он просто отправляет некоторый результат. Он подвержен тем же проблемам, что и просто запись на выход: буфер отправки сокета, повторы, таймауты, буфер приема сокета приемника и окно приема. Он не говорит вам, хорошо ли соединение. Ничто не может, кроме простого написания соединения и поиска IOExceptions, что, безусловно, не произойдет при первой записи после отключения.

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

+0

+1: AFAIK, единственный способ узнать другой конец - получить ваши данные, чтобы другой конец отправил обратно данные, которые указывают на это. –

+0

Приемник обрабатывает пространство хорошо, и моя функция isConnected() работает хорошо (за исключением того, что вы каким-то образом задерживаете задержку). – andrewmara

+0

Извините за небольшие фрагменты кода, но я в секретной домене и могу только повторять несекретный код. – andrewmara

Смежные вопросы