Java Socket - 本地端口

11

我正在学习使用Java进行套接字编程。 我使用以下语句连接到一个网站:

s = new Socket("www.nba.com", 80);

当我调试应用程序并查看s的内容时,我看到:

Socket[addr=www.nba.com/2.21.246.97,port=80,localport=7846]

1)我想知道本地端口7846是从哪里来的,它确切代表什么。

2)如果网站的IP地址是2.21.246.97,为什么在浏览器地址栏中只输入2.21.246.97就无法连接到该网站?


谢谢。


1
我相信它是您的机器端口连接到主机。 - Eng.Fouad
2个回答

8
这是一个本地套接字端口号,通常由系统分配。
请参阅什么是套接字?
客户端:客户端知道服务器正在运行的机器的主机名和服务器正在侦听的端口号。为了发起连接请求,客户端尝试在服务器的机器和端口上与服务器会合。客户端还需要向服务器标识自身,因此它绑定到将在此连接期间使用的本地端口号。这通常由系统分配。 至于第二个问题:
我假设这个IP地址是你通过DNS服务器查找“www.nba.com”得到的(我的不同)。问题可能是该地址的HTTP服务器提供多个虚拟主机和/或关心浏览器发送的“Host”标题。在您的情况下,它是IP地址而不是“www.nba.com”。

1
我可以自己分配本地端口吗? - A.B.
2
@HasanTahsin 是的。你应该使用这个构造函数 - ShyJ
谢谢。第二个问题呢?如果你回答了,请把你的答案附加到你之前的“答案”中,这样我就可以将其标记为已回答(即接受你的答案)。 - A.B.
@HasanTahsin 你可以分配你的本地主机,但你不应该这样做。 - user207421
构造函数的Java8链接已更新 https://docs.oracle.com/javase/8/docs/api/java/net/Socket.html#Socket-java.net.InetAddress-int-java.net.InetAddress-int- - kebs

0

local port 就是一个套接字描述符(或者是一个非常高的端口号)

每当一个进程进行 API 调用时,请求通过内核创建一个套接字描述符,以便绑定(和标识)这个特定请求的响应。任何出站调用都会导致创建一个套接字,当响应到达 NIC(网络接口),然后到达内核时,内核会找出此响应的目标应用程序。

这是通过检查具有一对一映射到运行进程(pid)的端口来完成的。然后它检查附加在响应元数据中的套接字描述符值(在创建连接时传递此值),并将响应流发送到套接字缓冲区。

然后 CPU 唤醒进程以收集响应。

所以回答你的主要问题,

  • local port 就是一个 套接字描述符
  • 理想情况下,如果没有虚拟化并且您拥有硬件,则应该能够通过 IP 连接到它。但通常情况下不是这样的,会有很多 NAT(网络地址转换)可能会阻止这种情况发生。

尝试使用ls -li /proc/<pid>/fd/命令查看所有打开的套接字描述符
其中<pid>是您的应用程序进程ID


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接