【问题标题】:How can Socket object be made with ServerSocket's method accept()?如何用ServerSocket的方法accept()制作Socket对象?
【发布时间】:2020-10-31 02:51:51
【问题描述】:

在完成I/O streamsConcurrency之后,我决定学习Socket programming。到目前为止,我做了一个简单的Server-Client。但我对理解 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,你会怎么做?
  • @HovercraftFullOfEels 没错,这条评论让我大开眼界。但是从技术上讲,当 Socket 以这种方式制作时,它确实有它的 IP 地址和端口,不是吗?
  • 套接字用于纯粹和简单的通信。如果需要共享信息,则直接通过套接字传递需要共享的信息

标签: java sockets serversocket


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多