【问题标题】:Internal Implementation of ServerSocket.accept() method?ServerSocket.accept() 方法的内部实现?
【发布时间】:2014-11-13 17:05:15
【问题描述】:

每个人都知道 Java 中的套接字编程。我们编写如下代码:

 ServerSocket serverSocket = new ServerSocket(1234);
 Socket server = serverSocket.accept();

我们知道我们创建了 serverSocket 对象,接下来我们编写serverSocket.accept(); 代码来接收客户端请求。我们知道serverSocket.accept(); 等到新请求到来。

但我的问题是:serverSocket.accept(); 方法在内部做什么?可能在 while 循环中运行?服务器如何识别任何新的请求来服务? serverSocket.accept(); 方法的内部实现是什么?有人对此有想法吗?

【问题讨论】:

  • 你可以进入那个方法里面看看。您也可以逐行使用调试器。
  • 为什么这也被标记为 c#?我猜“内部”功能取决于操作系统,如果不是系统架构的话。
  • 因为我使用 C# 和 Java。在与其功能相关的主要情况下,两者都是相同的。

标签: java c# operating-system serversocket


【解决方案1】:

你可以自己找这个。

public Socket accept() throws IOException {
    if (isClosed())
        throw new SocketException("Socket is closed");
    if (!isBound())
        throw new SocketException("Socket is not bound yet");
    Socket s = new Socket((SocketImpl) null);
    implAccept(s);
    return s;
}

accept() 是如何工作的?

【讨论】:

  • 我知道上面的代码在 ServerSocket 类中可用。我的问题是内部如何运作?我正在寻找深入的答案
【解决方案2】:

在 Linux 上,ServerSocket.accept() 最终(在本机代码中)执行accept 系统调用(请参阅man 2 accept),它会阻塞等待合适的传入连接。

Java 代码或本机代码中没有while 循环。我不知道 Linux 内核内部会发生什么,但此时这不再是 Java 问题。


这可能适用于 Windows 上的 Java,以及 C# 或您愿意考虑的任何其他编程语言。

【讨论】:

    猜你喜欢
    • 2013-11-08
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多