是否有可能通过活动与客户沟通?我的意思是:
我已关联客户端InputStreamReader
和PrintWriter
in = new BufferedReader(new InputStreamReader(
client.getInputStream()));
out = new PrintWriter(client.getOutputStream(), true);
当我使用in.readLine()
服务器等待传入数据时。但我有这种情况:
in.readLine()
仍处于暂停状态)并等待回复问题是:
处理异步传入数据的最佳方法是什么?我的意思是“事件”。我应该创建读取线程和另一个写入线程吗?如果我可以在一个线程中完成它,你能举个例子吗?
是否可以中止等待in.readLine()
?
答案 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的某些适当使用可能也是有序的。