2

有没有可能通过事件与客户沟通?我是说:

我已经连接了客户端,InputStreamReader并且PrintWriter

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

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

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

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

4

2 回答 2

1

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

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

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

确保您也熟悉 Java 并发编程

于 2012-11-28T05:25:41.477 回答
1

Java 通过包提供非阻塞 i/o java.nio参见此处)。但是 Java 的“nio”通道不与来自java.io. 所以,如果你想使用 nio,你必须从监听器开始用 nio 构建你的服务器。

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

于 2012-11-28T05:39:47.613 回答