如何用Java中的套接字输入/输出流捕获“事件”?

时间:2012-11-28 05:12:24

标签: java multithreading sockets asynchronous

是否有可能通过活动与客户沟通?我的意思是:

我已关联客户端InputStreamReaderPrintWriter

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

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

  1. 客户端未发送任何数据
  2. 连接仍然存在
  3. 我需要向客户端发送一些数据(但in.readLine()仍处于暂停状态)并等待回复
  4. 问题是: 处理异步传入数据的最佳方法是什么?我的意思是“事件”。我应该创建读取线程和另一个写入线程吗?如果我可以在一个线程中完成它,你能举个例子吗? 是否可以中止等待in.readLine()

2 个答案:

答案 0 :(得分:1)

在我看来,如果您希望程序异步运行,那么有一个单独的线程来执行套接字IO是最好的。看看http://en.wikipedia.org/wiki/Observer_pattern

对于一个简单的应用程序,我要做的是创建一个单独的线程来监听传入的数据,并将“观察者”或“事件监听器”注册到该线程。当数据进入时,通知您的观察者,以便他们可以执行必要的操作。

当侦听器线程空闲等待数据时,主线程仍然可以正常进行。

确保您也熟悉Java并发编程

答案 1 :(得分:1)

Java通过java.nio包(see here)提供非阻塞i / o。但Java的“nio”频道不与来自java.io的流互通。因此,如果您想使用nio,则必须使用nio从侦听器构建服务器。

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