这里的问题,这是非常简单(明白。):
我有2台电脑在家里,它们都具有相同的公共IP地址(如1.2.3.4)。
我曾在某咖啡的地方(不同的网络)1台计算机,以便它有不同的公网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或网络地址转换 (严格来说,它的端口地址转换或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
直接到计算机A的9000
端口:
Forward TCP/UDP on public port 9000 to private port 9000 on 192.168.0.2
若要将消息发送到计算机A,只是把它发送到1.2.3.4:9000
。 但是,如果其他PC仅侦听端口9000
吗? 您也无法分配公共端口9000
,因为它采取的是计算机答:你可以这样做:
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后面不同的机器。
希望这是有道理的。
通常,这些NAT防火墙将端口的流量转发回始发计算机为您服务。
所以,如果你有一台机器发送流量到你的咖啡店计算机上的端口5000
,另一个将流量发送到咖啡店计算机上的端口5001
,路由器将跟踪哪些端口是为哪些客户。 因此,当你发送的数据包从港口回来5000
,它会去头机,当你发送的数据包从港口回来5001
,它会去到第二台机器。
不幸的是,你的机器在咖啡店大概也是一个NAT防火墙后面,和你家的机器可能无法直接解决这个问题,无论是。
如果你能良好的网络上的主机服务器,那么这两个同龄人可以联系服务器和中继所有流量通过它 。 这不是一个坏的选择,但它不能很好地扩展。 (对于三台机器,这没什么大不了的。三年万台,这是相当重要的。)
您可以探讨其他的选择,试图穿越NAT防火墙,如UPnP的 ,但这些机制通常需要某种方式为客户前来洽谈会议,他们将工作之前。
文章来源: How to send a UDP packet to a specific computer when all the computer on the network have the same public IP address? [closed]