【问题标题】:problems with calling server socket accept method with an infinite timeout无限超时调用服务器套接字接受方法的问题
【发布时间】:2012-03-07 14:39:26
【问题描述】:

我在我这边创建了一个服务器套接字。我不知道客户端何时连接到我。

在我的应用程序中调用 serverSocket.accept() 而不设置任何套接字超时将解决我在任何时间点接受客户端的问题。我在一个单独的线程中执行此操作,因此这不会阻塞我的应用程序的另一部分。

我担心的是,因为 accept() 一直阻塞,直到它收到来自客户端的调用,这不会消耗任何资源,可能就像我大约一周没有收到来自客户端程序的调用一样。

还有其他方式可以接受客户端连接吗?我没有关于客户端何时调用套接字连接的任何信息,除了它在某个时候调用。

【问题讨论】:

    标签: java multithreading sockets serversocket


    【解决方案1】:

    在不同的线程上调用accept 没有问题。该线程将在对accept 的调用中被阻塞,并且在入站连接之前不会被操作系统调度。实际上,如果您整周都没有获得连接,那么在此期间您的线程将不会在 CPU 上运行。

    因此,它不会消耗任何CPU资源,只消耗一点内存。

    【讨论】:

    • 或者我们希望如此 ;) 这取决于 JVM 实现,也可能取决于操作系统(用于调度)。我同意你的帖子都铎王朝。
    • 但是 JVM 怎么知道有一个入站连接,可能是在内部 JVM 中的一些其他线程应该不断地访问套接字以查看是否有任何入站连接可能会消耗资源
    • '但是 JVM 怎么知道有一个入站连接' - 因为 accept() 返回。 “可能在内部,JVM 中的其他一些线程应该不断地访问套接字以查看是否有任何入站连接”——而不是在我曾经使用过的任何操作系统上。调用accept() 的线程由来自运行TCP 堆栈的内核线程的信号准备好。反过来,内核线程由来自 NIC 驱动程序的信号准备好,因此最初是来自硬件中断。没有投票。就像@Tudor 所说的那样——如果没有任何尝试连接,什么都不会发生。
    猜你喜欢
    • 2023-03-09
    • 2015-11-14
    • 2021-08-30
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多