2014-09-27 41 views
0

我正在編寫客戶端向服務器發送文本消息的服務器/客戶端程序。我使用了非阻塞I/O(NIO API)服務器不顯示correctly.this上是我的代碼在服務器上:使用Java中的非阻塞I/O發送消息(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。 – 2014-09-27 08:48:27

+0

Netty是什麼?在哪裏可以找到關於它的描述? – Youtaab 2014-09-27 09:08:50

+0

當然,在Google搜索中。這是一個基於NIO的庫,它提供了一個更清晰的API來編碼。 – 2014-09-27 09:12:43

回答

0

你需要在write()和compact()之後翻轉()。

注意:read()返回-1時循環並不合理。這意味着爲了上帝的緣故,同行脫節了。

+0

感謝您的回覆。您的指南幫助了我,並且它正常工作。 – Youtaab 2014-09-27 18:55:08

+0

@Downvoter恭喜。另一個正確和被接受的答案被投下來 – EJP 2014-09-28 22:31:02