我正在学习使用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才能连接到网站?
感谢
答案 0 :(得分:5)
这是本地套接字端口号。它通常由系统分配。
在客户端:客户端知道机器的主机名 服务器正在运行的服务器以及服务器所在的端口号 听着。要发出连接请求,客户端会尝试 与服务器的机器和端口上的服务器会合。该 客户端还需要向服务器标识自己,以便绑定到服务器 在此连接期间将使用的本地端口号。 这是 通常由系统分配。
至于第二个问题:
我认为当您查找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
尝试,socket descriptor
查看所有打开的套接字描述符
您的应用程序进程ID在哪里