如何抓住;事件“;使用Java中的套接字输入/输出流?

如何抓住;事件“;使用Java中的套接字输入/输出流?,java,multithreading,sockets,asynchronous,Java,Multithreading,Sockets,Asynchronous,是否有可能通过事件与客户沟通?我的意思是: 我已连接客户端,InputStreamReader和PrintWriter in = new BufferedReader(new InputStreamReader( client.getInputStream())); out = new PrintWriter(client.getOutputStream(), true); 当我在.readLine()中使用时,服务器等待传入数据。但我有这样的情

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

我已连接客户端,
InputStreamReader
PrintWriter

in = new BufferedReader(new InputStreamReader(
                        client.getInputStream()));
out = new PrintWriter(client.getOutputStream(), true);
当我在.readLine()中使用
时,
服务器等待传入数据。但我有这样的情况:

  • 客户端没有发送任何数据
  • 连接仍处于活动状态
  • 我需要向客户端发送一些数据(但.readLine()中的
    in
    仍处于挂起过程),并等待响应
  • 问题是: 处理异步传入数据的最佳方法是什么?我的意思是“事件”。我应该创建读线程和写线程吗?如果我能在一个线程中完成,你能给出一个代码示例吗?
    是否可以中止在.readLine()中等待

    在我看来,如果希望程序异步运行,最好使用单独的线程来执行套接字IO。看一看

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

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


    确保您还熟悉Java并发编程

    Java通过
    Java.nio
    包()提供非阻塞i/o。但是Java的“nio”通道不与来自
    Java.io
    的流进行交互操作。因此,如果您想使用nio,您必须从侦听器开始使用nio构建服务器


    如果您一直使用现有的
    java.io
    流,那么您要么必须使用每个客户机模型的线程;或者,您需要设计一个系统,让单个线程(或线程池)通过重复循环来管理一组客户机,轮询以确定哪些客户机具有准备好处理的数据。当然,在后一种情况下,您希望避免繁忙的循环,因此适当使用Thread.sleep也很有必要。

    您可以通过检查
    BuferredReader\ready
    来检查是否有任何数据可用。这个方法可以预测
    读取
    是否会阻塞。很好,但在这种情况下,我无法通过
    避免活动等待,而(true)
    @sheldonCooper的Scanner和BufferedReader是相同的(除了等待变量类型(int等)?我会尝试将读写器作为共享变量的线程;)谢谢,通过反复的拼凑和睡眠,这将是最简单的方法。另一方面。。。对于1000个客户机,如果有1000个线程使用250ms循环,那么性能如何?@Tomasz每个客户机将有一个线程,在这种情况下,线程将阻止
    读取操作,并且根本没有循环/轮询;或者,在轮询循环中会有一个单线程监视大量客户机,并可能在有数据准备好处理时将活动客户机交给一个小线程池。在任何情况下,都不会有1000个线程循环或轮询任何内容。