java - 如何在Java中使用套接字输入/输出流捕获 "event"?

标签 java multithreading sockets asynchronous

是否可以通过 Activity 与客户沟通?我的意思是:

我已连接客户端、InputStreamReaderPrintWriter

in = new BufferedReader(new InputStreamReader(
                        client.getInputStream()));
out = new PrintWriter(client.getOutputStream(), true);

当我使用in.readLine()时,服务器等待传入数据。但我有这样的情况:

  1. 客户端未发送任何数据
  2. 连接仍然有效
  3. 我需要向客户端发送一些数据(但 in.readLine() 仍在挂起进程)并等待响应

问题是: 处理异步传入数据的最佳方法是什么?我的意思是“事件”之类的东西。我应该创建一个用于读取的线程和另一个用于写入的线程吗?如果我可以在一个线程中完成它,您能给一个代码示例吗? 是否可以中止等待in.readLine()

最佳答案

Java 通过 java.nio 包 ( see here ) 提供非阻塞 I/O。但是 Java 的“nio” channel 不能与 java.io 中的流进行互操作。因此,如果您想使用 nio,则必须从监听器开始使用 nio 构建您的服务器。

如果您坚持使用现有的 java.io 流,那么您要么必须使用每个客户端线程模型;要么使用每个客户端线程模型。或者您需要设计一个系统,让单个线程(或线程池)通过重复循环、轮询 instream.available() 来管理一堆客户端。找出哪些数据已准备好处理。当然,在后一种情况下,您希望避免忙循环,因此 Thread.sleep 的一些适当使用可能也是有序的。

关于java - 如何在Java中使用套接字输入/输出流捕获 "event"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13598261/

相关文章:

multithreading - 如何显示并行线程中的进度

C 在特定 IP 上打开套接字

c - MQTT 连接特定接口(interface),如 eth0/wlan0

Java String DateTime 到 toEpochMilli - 不同区域

java - 较短的等于方法与较长的等于方法相同吗?

c# - Backgroundworker 不会在 DoWork 方法中执行 extern dll 函数

linux - 持有TCP连接的大规模websocket系统的设计

Java程序挂起

java - 正则表达式和换行符

objective-c - 如何循环遍历 iPad 应用程序中的所有事件线程