这就是问题,它非常简单(理解..):
我家里有 2 台电脑,它们都有相同的公共 IP 地址(例如 1.2.3.4)。
我在咖啡馆有一台计算机(不同的网络),因此它具有不同的公共 IP 地址。
我想从咖啡馆的计算机向我家里的一台计算机发送一条消息(例如“嗨”)。
我正在使用 Java,请为发送者考虑以下非常简单的程序(为了简单起见,我取消了异常处理):
我主要做的是:
sendPacket("hi");
我有
void sendPacket(String message){
DatagramSocket myServerSocket = new DatagramSocket(9000); // server socket
byte[] sendData = new byte[message.length()]; // build msg
sendData = message.getBytes();
InetSocketAddress destSocketAddr = new InetSocketAddress("1.2.3.4", 9000); // destination socket addr
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, destSocketAddr); // make packet
myServerSocket.send(sendPacket); // send packet
}
如果我的监听器(接收器)在家里的两台计算机上运行(两台计算机都具有相同的公共 IP 地址 1.2.3.4),我如何指定我打算将此消息发送给哪一台?
如果您的两台家用计算机具有相同的公共 IP 地址,则意味着这些计算机正在使用 NAT 或网络地址解读 http://en.wikipedia.org/wiki/Network_address_translation(严格来说,这是端口地址转换或 NAT 过载,但通常简称为 NAT)。
这意味着,为了启动从外部到 NAT 内任何计算机的连接,转发端口必须在您的路由器(通常是调制解调器)中进行设置,以便将公共家庭 IP 地址的特定端口映射到家中的特定私有 IP 地址。
假设您家里有计算机 A 和 B,如下所示:
Router / Modem
192.168.0.1
||
++=========++========++
|| ||
Computer A Computer B
192.168.0.2 192.168.0.3
现在,假设您需要计算机 A 侦听 TCP 端口9000
(端口主要可以是TCP或UDP),可以转发公共端口9000
直接连接到计算机A9000
port:
Forward TCP/UDP on public port 9000 to private port 9000 on 192.168.0.2
要将消息发送到计算机 A,只需将其发送到1.2.3.4:9000
。但是如果另一台电脑只监听端口怎么办9000
也?您也不能分配公共端口9000
因为它是由计算机 A 获取的。您可以这样做:
Forward TCP/UDP on public port 9001 to private port 9000 on 192.168.0.3
这样,计算机B仍然可以在端口上接收消息9000
,但它们需要通过互联网发送到1.2.3.4:9001
。当数据包进入(和离开!)您的家庭网络时,您的路由器的 NAT 会自动转换端口。
最后,发送者需要调整目标端口以便与 NAT 后面的不同机器“对话”。
希望这是有道理的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)