使用java中的非阻塞I / O发送消息(NIO API)

时间:2014-09-27 08:44:26

标签: java network-programming nio bytebuffer

我正在编写客户端向服务器发送文本消息的服务器/客户端程序。我使用了非阻塞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();

在客户端向服务器发送消息的运行时,显示空格字符或一条消息。

1 个答案:

答案 0 :(得分:0)

你需要在write()之前翻转(),然后在之后使用compact()。

NB在read()返回-1时循环开始没有意义。这意味着同伴因为天堂的缘故而断绝了。