如何使用ServerSocket的方法accept()制作Socket对象?



完成I/O streamsConcurrency后,我决定学习Socket programming。到目前为止,我制作了一个简单的服务器客户端。但我有一个小问题,关于理解Socket对象是如何实际生成的。希望有人能给我一个简单的解释,因为我是新手。

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

Socket s = new Socket(StringIP, intPort);

但我也遇到了一件让我困惑的事情,那就是使用ServerSocket的类中的accept()

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

Doc表示,在建立连接后会返回新的Socket。很公平。但是它怎么能知道客户端的端口和IP呢?这是否意味着变量socket拥有关于客户端的所有数据(即其IP和端口(?如果是这样的话,如果我没有像第一个例子中那样手动将其放入构造函数,它怎么能知道呢?有人能告诉我我错过了什么吗?这样我就可以继续前进了?

但是它怎么能知道客户端的端口和IP?

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

如果你真的需要确切地了解这是如何发生的,那么在OpenJDK的源代码(可以免费下载(中,一切都会很清楚。但你需要能够阅读和搜索C和C++代码才能弄清楚。

最新更新