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

Posted

技术标签:

【中文标题】在java中使用非阻塞I/O发送消息(NIO API)【英文标题】:Sending message using non-blocking I/O in java(NIO API) 【发布时间】:2014-09-27 08:44:26 【问题描述】:

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

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

【问题讨论】:

你真的不应该直接使用 NIO,它是一个非常底层的 API。改用 Netty。 什么是 Netty?在哪里可以找到关于它的描述? 当然是在 Google 搜索上。它是一个基于 NIO 的库,可为您提供更简洁的 API 来编写代码。 【参考方案1】:

你需要在write()之前flip(),然后在compact()之后。

NB 在read() 返回-1 时循环并没有意义。看在上帝的份上,这意味着对等方已断开连接。

【讨论】:

感谢您的回复。您的指南帮助了我,它工作正常。 @Downvoter 恭喜。另一个正确且被接受的答案被否决

以上是关于在java中使用非阻塞I/O发送消息(NIO API)的主要内容,如果未能解决你的问题,请参考以下文章

网络I/o编程模型7 Nio实现聊天室

JAVA NIO(死磕1)

java网络通信:异步非阻塞I/O (NIO)

Java中I/O技术如何在系统设计?

非阻塞UDP I / O与阻止Java中的UDP I / O.

NIO浅谈