Java套接字 - 本地端口

时间:2012-11-21 23:50:42

标签: java sockets

我正在学习使用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才能连接到网站?


感谢

2 个答案:

答案 0 :(得分:5)

这是本地套接字端口号。它通常由系统分配。

请参阅What is a Socket?

  

在客户端:客户端知道机器的主机名   服务器正在运行的服务器以及服务器所在的端口号   听着。要发出连接请求,客户端会尝试   与服务器的机器和端口上的服务器会合。该   客户端还需要向服务器标识自己,以便绑定到服务器   在此连接期间将使用的本地端口号。 这是   通常由系统分配。

至于第二个问题:

我认为当您查找www.nba.com(我的不同)时,您的DNS服务器会获得此IP地址。问题可能是此地址的HTTP服务器为多个虚拟主机提供服务和/或它关心您的浏览器发送的Host标头。在您的情况下,它是IP地址而不是www.nba.com

答案 1 :(得分:0)

select c.customer_name, p.product_name, coalesce(sum(ii.quantity), 0) as quantity from invoice i join customer c on c.id = i.customer_id join invoice_item ii on ii.invoice_id = i.id join product p on ii.product_id = p.id group by c.customer_name, p.product_name union all select c.customer_name, null, 0 from customer c where not exists (select 1 from invoice i where i.customer_id = c.id) union all select null, p.product_name, 0 from product p where not exists (select 1 from invoice_item ii where ii.product_id = p.id); 只是套接字描述符(或编号很高的端口)

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

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

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

所以回答您的主要问题

  • local port只是local port
  • 理想情况下,如果没有虚拟化并且您拥有硬件,则应该能够。通过ip连接到它。但是通常情况并非如此,大量的NAT(网络地址转换)可能会阻止这种情况

尝试,socket descriptor查看所有打开的套接字描述符
您的应用程序进程ID在哪里