ServerSocket的accept()方法如何创建Socket对象?
How can Socket object be made with ServerSocket's method accept()?
学完I/O streams
和Concurrency
我决定学习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++ 代码才能弄明白。
学完I/O streams
和Concurrency
我决定学习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++ 代码才能弄明白。