ServerSocket的accept()方法如何创建Socket对象?

How can Socket object be made with ServerSocket's method accept()?

学完I/O streamsConcurrency我决定学习Socket programming。至此我做了一个简单的Server-Client。但是我有一个关于如何理解 Socket 对象实际上是如何制作的 的小问题。希望有人能简单解释一下,因为我是新手。

我遵循的基本规则是通过提供 IP 地址端口号 来制作 Socket。所以我会做类似的事情:

Socket s = new Socket(StringIP, intPort);

但我也遇到了让我困惑的事情,那就是使用 ServerSocket 的 class.

中的 accept()
ServerSocket myServer = new ServerSocket(portNum);
Socket socket = myServer.accept();

文档说 returns 建立连接后的新套接字。很公平。但是它怎么知道客户端的端口和IP呢?这是否意味着变量 socket 包含有关客户端的所有数据(意味着其 IP 和端口)?如果是这样,如果我没有像第一个示例中那样手动将其放入构造函数,它怎么知道呢?有人可以告诉我我错过了什么,以便我继续前进吗?

But how can it know the client's port and IP?

客户端端口和IP在网络数据包中。操作系统获取并记录此信息,并通过系统调用的结果(粗略地说)将其传递给 Java。这一切都是在 JVM 本机代码中完成的。 (当然还有 OS 内核。)

如果您真的需要确切地了解这是如何发生的,OpenJDK 源代码(可免费下载)中将一清二楚。但是您需要能够阅读和搜索 C 和 C++ 代码才能弄明白。