当前位置: 首页 > 面试题库 >

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

锺离韬
2023-03-14
问题内容

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

注意在read()返回-1时循环并没有任何意义。为了天堂,这意味着同伴断开连接。



 类似资料:
  • 问题内容: 非阻塞TCP / IP S和在NIO帮我处理与小数目的线程许多TCP / IP连接。但是UDP 呢?(我必须承认我对UDP不太熟悉。) 即使UDP发送操作未在阻止模式下运行,它似乎也不会阻止。确实存在因拥堵或类似原因导致阻塞的情况吗?我真的很好奇,是否存在这样的情况以及生产环境中可能存在的情况。 如果实际上并没有阻塞,并且我不打算使用已连接并仅绑定到一个端口,那么使用非阻塞模式和and

  • 现在我们知道如何在一个指定I/O调度器上来调度一个任务,我们可以修改storeBitmap()函数并再次检查StrictMode的不合规做法。为了这个例子,我们可以在新的blockingStoreBitmap()函数中重排代码。 private static void blockingStoreBitmap(Context context, Bitmap bitmap, String filena

  • 实时的web特性通常需要为每个用户一个大部分时间都处于空闲的长连接. 在传统的同步web服务器中,这意味着需要给每个用户分配一个专用的线程,这样的开销是十分巨大的. 为了减小对于并发连接需要的开销,Tornado使用了一种单线程事件循环的方式. 这意味着所有应用程序代码都应该是异步和非阻塞的,因为在同一时刻只有一个操作是有效的. 异步和非阻塞这两个属于联系十分紧密而且通常交换使用,但是它们并不完全

  • 但是,这种体系结构只使用单个线程。在多进程环境中(例如4核cpu),NIO架构会浪费其他核。有没有一种设计方法,我可以使用NIO架构来利用所有的内核? NIO2(基于前体模式)就是这样一种选择。但其底层体系结构与原始的NIO非常不同。

  • 问题内容: 在服务器端Javascript引擎的上下文中,什么是非阻塞I / O或异步I / O?我认为这是相对于Java服务器端实现的优势。 问题答案: 同步执行通常是指按顺序执行的代码。异步执行是指未按照代码中出现的顺序运行的执行。在以下示例中,同步操作导致警报按顺序触发。在异步操作中,虽然似乎执行第二次,但不是。 同步:1,2,3 异步:1,3,2 阻塞与非阻塞 阻塞是指阻塞进一步执行直到该

  • 我有一个spring-webflux API,它在服务层需要从使用JDBC的现有存储库中读取。 在对这个主题进行了一些阅读之后,我希望将阻塞数据库调用的执行与我的非阻塞异步代码的其余部分分开。 我定义了一个专用的jdbcScheduler: 2)假设我想利用得到的mono,例如调用带有userIdMono结果的API,它将在哪个调度器上执行?是专门为jdbc调用创建的调度器,还是reactor通常