2012-01-20 4 views
0

Есть ли способ обнаружить EOF при чтении из сокета TCP, пока соединение сокета остается открытым?Java Server - TCP Socket обнаруживает EOF без закрытия соединения сокета

Большинство примеров, которые я видел что-то вдоль линий:

int n=0; 
While((n = read.inStream(data)) != -1){ 
    destType.write(data, 0, n); 
} 

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

Так есть способ сделать это или получить некоторую информацию о возможной альтернативе?

ответ

1

Нет - если соединение остается открытым, поток не достиг своего конца. Идея потока сообщения EOF , а затем с большим количеством данных позже идет вразрез с принципом потока.

Если вы хотите отправить несколько сообщений через поток TCP, самым простым способом является префиксом каждое сообщение с его длиной:

HEADER BODY 
HEADER BODY 
HEADER BODY 

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

+0

Или используйте индикаторы начального сообщения/конечного сообщения. –

+0

@ShaneWealti: Хотя это возможно, он становится намного более интенсивным для клиентов - вам нужно анализировать данные по мере их чтения и разрабатывать стратегию экранирования, если данные естественно включают в себя индикатор «конечного сообщения». –

+0

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

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

  • Нет связанных вопросов^_^