Javascript 套接字远程端口代表什么?

Javascript 套接字远程端口代表什么?,javascript,node.js,sockets,http,tcp,Javascript,Node.js,Sockets,Http,Tcp,http client.js: const http = require('http'); http.get ( { port : 9001, host : 'localhost' }, (res) => { //... } ); const net = require('net'); let server = new net.Server(); server.listen(9001, 'loc

http client.js

const http = require('http');

http.get
(
    {
        port : 9001,
        host : 'localhost'
    },
    (res) =>
    {
        //...
    }
);
const net = require('net');

let server = new net.Server();

server.listen(9001, 'localhost', (err) =>
{
    console.log('Started listening', server.address());
});

server.on('connection', (sock) =>
{
    console.log(`Connected ${sock.remoteAddress}:${sock.remotePort}`);
});
tcp server.js

const http = require('http');

http.get
(
    {
        port : 9001,
        host : 'localhost'
    },
    (res) =>
    {
        //...
    }
);
const net = require('net');

let server = new net.Server();

server.listen(9001, 'localhost', (err) =>
{
    console.log('Started listening', server.address());
});

server.on('connection', (sock) =>
{
    console.log(`Connected ${sock.remoteAddress}:${sock.remotePort}`);
});
我运行
node tc server.js
,然后当我运行
node http client.js
时,我会看到如下输出:

Started listening { address: '127.0.0.1', family: 'IPv4', port: 9001 }
Connected 127.0.0.1:59506
我关闭
http client.js
并再次运行
节点http client.js
。我明白了:
Connected 127.0.0.1:59508

我关闭服务器并再次运行,然后再次运行客户端,我看到
Connected 127.0.0.1:59510


因此,
socket.remotePort
一直在增加。我不明白的是,为什么端口号会出现这些数字,我希望端口号会出现
9001
,因为http请求就是在这里发送的,并且成功地到达了侦听tcp服务器。

tcp会话的双方都必须有地址和端口。例如,客户端也使用端口。您的
console.log
告诉您的是,客户端使用其端口59506连接到您的端口9001。当您的服务器向客户机发送数据包时,它会使用客户机的地址和端口号对其进行寻址,因此客户机上网络堆栈的TCP层知道将数据包发送到哪个进程。(更多信息。)您可以看到,这一数字的增加只是客户机系统如何为连接分配可用端口的副产品


您通常不需要关心客户端的端口。

如果http客户端正在与底层tcp客户端对话,以便通过端口
59506
发送tcp消息,那么在tcp端口
9001
上侦听的
tcp服务器.js
是如何接收消息的,tcp服务器不需要监听端口
59506
?@RobertC.Holland:不,每一方都使用自己的端口,并且端口不必匹配(它们通常不匹配)。考虑Web服务器也被用作Web客户端的常见情况(也许响应请求而从另一站点中刮取信息)。如果它使用端口80为客户端提供HTTP服务,那么当客户端连接到另一台服务器时,它显然不会使用端口80。(或者,如果您在运行web服务器的机器上运行web浏览器,则更明显的是,端口80不能用于两个进程…)选择不同端口的原因现在已澄清,谢谢。我仍然不明白如何-如果客户端通过不同的端口发送,它仍然能够到达指定端口上的侦听服务器。@RobertC.Holland::-)假设我们有服务器s,客户端C.s在IP 1.2.3.4端口9001上侦听。C(在IP 9.10.11.12上)使用C的端口59506连接到S的端口9001,并且作为该连接设置的一部分,告诉S它正在使用的端口。当C向S发送数据包时,它将其发送到1.2.3.4:9001。当S向C发送数据包时,它将其发送到9.10.11.12:59506。双方都非常高兴,他们每个人都有一个唯一的地址+端口来发送数据以进行连接。这个分解非常有用。我现在明白了。非常感谢您花时间解释!