Повторное использование сокета при копировании больших объемов данных - PullRequest
0 голосов
/ 18 августа 2011

В настоящее время я отправляю большие объемы данных через сокет Java и использую библиотеку Apache Commons IOUtils для копирования с использованием метода copyLarge для отправки / получения данных.Проблема в том, что copyLarge читает, пока входной поток не вернет -1.Я скопировал фрагмент ниже

while (-1 != (n = input.read(buffer))) {
   output.write(buffer, 0, n);
   count += n;
}

Этот метод будет блокировать, пока сокет не будет закрыт, но проблема в том, что я хочу повторно использовать сокет для дополнительных больших данных.Альтернативы, которые я вижу, состоят в том, чтобы либо заново открыть новый сокет для каждой передаваемой информации, либо написать собственный метод чтения, который ищет маркер конца потока (то есть символ новой строки).

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

1 Ответ

3 голосов
/ 18 августа 2011

Знаете ли вы, сколько данных у вас есть, прежде чем отправить их? Если это так, я бы в основном префикс длины сообщения.

Это намного проще в обработке, чем использование маркера конца потока и необходимости беспокоиться о экранировании, перечитывании и т. Д.

Но да, вам нужно будет сделать что-то , потому что TCP / IP является потоковым протоколом. Если у вас нет какого-либо показателя конца данных каким-то образом , вы никогда не узнаете, могут ли еще быть какие-то реальные данные в ближайшее время.

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