Sta*_*Two 7 java udp network-programming ip-address packet
这是问题所在,它非常简单(理解......):
我家里有2台电脑,它们都有相同的公共IP地址(例如1.2.3.4).
我在咖啡馆(不同的网络)有一台电脑,所以它有一个不同的公共IP地址.
我想从咖啡馆的电脑发送一条消息(例如"hi")到我家里的一台电脑.
我正在使用Java,为发送者考虑以下非常简单的程序(为了简单起见,我为了简单处理了异常处理):
在主要我做:
sendPacket("hi");
Run Code Online (Sandbox Code Playgroud)
我有
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
}
Run Code Online (Sandbox Code Playgroud)
如果我的监听器(接收器)在家中的两台计算机上运行(两者都具有相同的公共IP地址1.2.3.4),我如何指定我打算将此消息发送到哪一个?
MrF*_*ion 15
如果两台家用计算机具有相同的公共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
Run Code Online (Sandbox Code Playgroud)
现在,让我们假设您需要计算机A监听TCP端口9000(端口主要可以是TCP或UDP),您可以将公共端口9000直接转发到计算机A的9000端口:
Forward TCP/UDP on public port 9000 to private port 9000 on 192.168.0.2
Run Code Online (Sandbox Code Playgroud)
要向计算机A发送消息,只需将其发送给1.2.3.4:9000.但是,如果另一台PC也只听端口9000呢?您也不能分配公共端口,9000因为它是由计算机A进行的.您可以这样做:
Forward TCP/UDP on public port 9001 to private port 9000 on 192.168.0.3
Run Code Online (Sandbox Code Playgroud)
这样,计算机B仍然在端口上接收消息9000,但是它们需要通过因特网发送到1.2.3.4:9001.当数据包进入(并离开!)您的家庭网络时,路由器的NAT会自动转换端口.
最后,发送方需要调整目标端口,以便与NAT后面的不同计算机"通话".
希望这是有道理的.
通常,这些NAT 防火墙会将流量端口转发回原始计算机。
因此,如果您有一台机器在 port 上向咖啡店机器发送流量5000,另一台机器在 port 上向咖啡店机器发送流量5001,则路由器将跟踪哪个端口用于哪个客户端。因此,当您从port发回数据包时,5000它将转到第一台机器,而当您从port发回数据包时5001,它将转到第二台机器。
不幸的是,您在咖啡店的机器可能也位于 NAT 防火墙后面,并且您的家用机器也可能无法直接寻址它。
如果您可以在良好的网络上托管服务器,那么两个对等方都可以联系该服务器,并通过它中继所有流量。这不是一个坏选择,但它的扩展性不好。(对于三台机器来说,这没什么大不了的。对于三百万台机器来说,这很重要。)
您可以研究其他选项来尝试穿越 NAT 防火墙,例如UPnP,但这些机制通常需要某种方式让客户端在工作之前协商会话。
| 归档时间: |
|
| 查看次数: |
8556 次 |
| 最近记录: |