【问题标题】:How to continuously listen on port with java.net.ServerSocket如何使用 java.net.ServerSocket 持续监听端口
【发布时间】:2018-03-19 05:13:11
【问题描述】:

我有一个 java.net.ServerSocket 用于监听连接。我正在使用它的accept() 方法来获取来自客户端的连接,然后适当地处理它们。我希望持续倾听客户的声音,并且永远无法与他们联系。目前我有类似这样的代码:

ServerSocket serverSocket = ...
while (shouldBeListening) {
    handleClient(serverSocket.accept());
}

handleClient 方法可能需要很短的时间(不到十分之一毫秒)。我担心在ServerSocket.accept() 方法返回和再次调用它之间,可能会错过连接请求。解决此问题的最佳方法是什么?

编辑: 我实现它的方式目前在handleClient 方法中创建了一个新线程,但即使这需要时间(特别是因为这是在Raspberry Pi 上运行的),我担心如果在@987654329 时请求连接@ 方法正在执行,那么它可能会被拒绝,因为 accept() 没有被运行。

【问题讨论】:

    标签: java network-programming serversocket


    【解决方案1】:

    类似的东西。

     ServerSocket listener = new ServerSocket(8001);
        try {
          while (true) {
             Socket socket = listener.accept();
    

    然后您可以将套接字引用传递给您拥有的处理程序类。使该类实现 Runnable。每次将套接字引用传递给处理程序类以同时处理请求时,创建一个新线程。 请参阅以下链接以获取解决方案。如果您需要完整的代码。告诉我。

    Runnable Sample by Jenkov

    ThreadPool Sample - Stackoverflow

    【讨论】:

    • 这不会有同样的问题吗?如果一个连接进来,并且从那里返回了accept方法,如果在JVM有机会第二次调用accept方法之前另一个连接进来了怎么办?即使我将所有主要工作卸载到另一个线程,我仍然必须创建和启动一个线程,这需要时间。在那段时间里,我可能错过了一次联系。
    • 有效问题。然后,您将不得不对客户端请求进行排队。或者使用消息服务来接受请求。
    • 好的,文章表明不可能总是接受连接。令我惊讶的是,没有办法始终监听连接,但我想我只需要确保客户端重试连接,以防 JVM 在接受方法之外。感谢您的帮助。
    • 不客气。如果你需要实现持续监听机制,你将不得不尝试不同的java技术。但是,如果客户端收到任何与连接相关的异常,最好重试。还要确保服务器处理重复的请求。
    猜你喜欢
    • 2012-03-20
    • 1970-01-01
    • 2013-07-06
    • 2021-12-16
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    相关资源
    最近更新 更多