2014-09-27 3 views
0

Я пишу программу сервера/клиента, которую клиенты отправляют текстовое сообщение на сервер. Я использовал неблокирующий ввод-вывод (NIO API), но сообщения на сервере не показывать correctly.this мой код на сервере:Отправка сообщения с использованием неблокирующего ввода-вывода в Java (NIO API)

private JTextArea displayArea; 
private int numBytes; 
private ByteBuffer buffer; 
/*... 
some code is here 
...*/ 
displayArea = new JTextArea(); 
add(new JScrollPane(displayArea), BorderLayout.CENTER); 
setSize(400, 500); 
setVisible(true); 
/*... 
some code is here 
...*/ 
buffer = ByteBuffer.allocate(20); 
buffer.clear(); 
displayArea.append("reading data..."); 
do{ 
    numBytes = socketChannel.read(buffer); 
}while(numBytes == -1); 
displayArea.append("\nData read."); 
buffer.flip(); 
int usedBytes = buffer.position(); 
byte[] bufferArray = buffer.array(); 
String message = new String(bufferArray, 0, usedBytes); 
displayArea.append("\n"+message); 

И это часть кода клиента:

byte[] byteData = message.getBytes(); 
buffer.put(byteData); 
socketChannel.write(buffer); 
buffer.clear(); 

в период выполнения, когда клиент посылает сообщение на сервер, пространство символы или фрагмент сообщения.

+0

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

+0

Что такое Netty? И где я могу найти описание об этом? – Youtaab

+0

В Google Поиске, конечно. Это основанная на NIO библиотека, которая дает вам гораздо более чистый API для кодирования. –

ответ

0

Перед записью() и compact() вам нужно перевернуть().

NB Цикл при чтении() возвращает -1, не имеет смысла. Это означает, что сверстник отключен, ради всего святого.

+0

Спасибо за ваш ответ. Ваше руководство помогло мне, и оно работает правильно. – Youtaab

+0

@Downvoter Поздравляем. Еще один правильный и принятый ответ проголосовал – EJP

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