Частичная проблема с сообщением при использовании Java Nio - PullRequest
1 голос
/ 25 мая 2011

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

n = socket.read(rbuf);  
if(n==0) || (n==-1) 
   break;

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

Я использую несколько процессов, запущенных на одной машине. Каждый процесс использует сокет nio. Это возможный фактор, чтобы вызвать частичные сообщения?

Ответы [ 2 ]

3 голосов
/ 25 мая 2011

0 является допустимым возвращаемым значением для чтения, которое не указывает на конец канала. -1 указывает на конец канала. Так что, если вы закончите чтение, когда будет возвращено 0, вы получите частичные сообщения.

1 голос
/ 26 мая 2011

Я бы предложил использовать Netty , который построен на основе классов Java NIO, но дает вам (на мой взгляд) гораздо более удобный API, чем классы Java JDK NIO.

Чтобы решить вашу проблему, вы должны использовать ReplayingDecoder , и Netty будет просто и снова вызывать ваш потоковый (ChannelBuffer) декодер, пока у вас не будет достаточно данных, чтобы понять это.

...