代码之家  ›  专栏  ›  技术社区  ›  Lasitha Yapa Programmer

不使用线程的Java socket服务器

  •  1
  • Lasitha Yapa Programmer  · 技术社区  · 8 年前

    我正在开发一个应用程序,它应该非常轻,并且使用最少的线程数。
    我需要在应用程序中为心跳监视器提供一个套接字服务器。

    ServerSocket listener= new ServerSocket(port);
    while (true) {
       Socket socket = listener.accept();
    
       Runnable thread = new HBClient(this, socket);
       thread.run();
    }
    

    这里的问题是,我必须为每个客户端使用一个线程。
    有没有一种不用线程就能做到这一点的方法?可能是一种事件驱动的方法来识别客户端何时连接,或者是一种非阻塞方法来接受客户端。(我已经检查了java.nio,但似乎没有线程也不能使用它)

    2 回复  |  直到 8 年前
        1
  •  3
  •   Kayaman    8 年前

    使用NIO(对于新IO,而不是非阻塞IO),您可以使用 Selector 在单个线程上处理多个通道,而在基本IO中,一个线程负责一个任务(接受连接或在连接上进行通信)。

    基本前提是您拥有资源,单个选择器将“旋转”,并选择其中一个来处理任何需要执行的操作(连接、读取、写入)。完成后,将选择另一个资源,依此类推。当然,除非确实有事情要做,否则不会选择资源,频道会用 SelectionKey 指示可以执行哪些操作的标志。

    然而,使用非阻塞IO需要很多 harder to program 比基本IO更重要,如果您没有处理大量资源,也不会有太大的[改进]( NIO Performance Improvement compared to traditional IO in Java )要么。即使您确实想使用NIO,建议您除非出于学习目的使用NIO,否则使用现有的框架,如Netty,这将使您更容易专注于程序的功能,而不是让NIO正常工作的复杂性。

    如果你 做 想花时间和NIO在一起,有很多问题可以讨论 Java NIO Server

        2
  •  0
  •   Emre Acar    8 年前

    不需要。即使您尝试实现事件驱动的方法,也应该有人监听套接字来抛出事件。因此,用一个线程基本上不可能做到这一点。

    但是,您可以在通知连接的客户端时中断无限循环。你不会接受新客户,但你将处于单一线程中。

    推荐文章