我正在编写一个服务器/客户端程序,客户端将文本消息发送到服务器。我使用了非阻塞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();
在运行时,当客户端向服务器发送消息时,将显示空格字符或一条消息。
您需要在flip()之前write()和compact()之后。
flip()
write()
compact()
注意在read()返回-1时循环并没有任何意义。为了天堂,这意味着同伴断开连接。
read()