Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当网络上的所有计算机都具有相同的公共IP地址时,如何向特定计算机发送UDP数据包?_Java_Network Programming_Udp_Ip Address_Packet - Fatal编程技术网

Java 当网络上的所有计算机都具有相同的公共IP地址时,如何向特定计算机发送UDP数据包?

Java 当网络上的所有计算机都具有相同的公共IP地址时,如何向特定计算机发送UDP数据包?,java,network-programming,udp,ip-address,packet,Java,Network Programming,Udp,Ip Address,Packet,问题就在这里,很简单(要理解…): 我家里有两台电脑,它们都有相同的公共IP地址(例如1.2.3.4) 我有一台电脑在咖啡馆(不同的网络),所以它有一个不同的公共IP地址 我想从咖啡馆的电脑向家里的电脑发送一条信息(例如“嗨”) 在使用Java时,请考虑以下针对发送方的非常简单的程序(为了简单起见,我去掉了异常处理): 我主要是: sendPacket("hi"); 我有 void sendPacket(String message){ DatagramSocket myServerS

问题就在这里,很简单(要理解…):

我家里有两台电脑,它们都有相同的公共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),如何指定要将此消息发送给哪台计算机?

通常,这些计算机会将流量转发回原始计算机

因此,如果一台机器在端口
5000
上向咖啡店机器发送流量,另一台机器在端口
5001
上向咖啡店机器发送流量,路由器将跟踪哪个端口用于哪个客户端。因此,当您从端口
5000
发回数据包时,它将转到第一台机器,而当您从端口
5001
发回数据包时,它将转到第二台机器

不幸的是,你在咖啡店的电脑可能也在NAT防火墙后面,而你的家用电脑也可能无法直接寻址

如果您可以在一个良好的网络上托管一台服务器,那么两个对等方都可以联系该服务器,并通过它中继所有流量。这是一个不错的选择,但它不能很好地扩展。(对于三台机器来说,这没什么大不了的。对于三百万台机器来说,这很重要。)


您可以研究其他选项来尝试,例如,但这些机制通常要求客户端以某种方式协商会话,然后才能工作。

如果您的两台家庭计算机具有相同的公共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
。但如果另一台计算机也只侦听端口
9000
,该怎么办?您也无法分配公共端口
9000
,因为它是由计算机a占用的。您可以这样做:

Forward TCP/UDP on public port 9001 to private port 9000 on 192.168.0.3
这样,计算机B仍然在端口
9000
上接收消息,但它们需要通过Internet发送到
1.2.3.4:9001
。当数据包进入(或离开)家庭网络时,路由器的NAT会自动转换端口

最后,发送方需要调整目标端口,以便与NAT后面的不同机器进行“对话”


希望这是有意义的。

请理解:您家中的两台计算机都没有该公共ip地址。您的家庭路由器有该公共地址。您的家庭路由器为您的两台计算机提供了一个专用ip地址。您可能可以使用路由器上的“端口转发”功能来帮助您。请参阅“NAT”有关这方面的更多背景知识,请访问维基百科。