Java Android UDP仅在家庭网络中工作

Java Android UDP仅在家庭网络中工作,java,android,sockets,udp,Java,Android,Sockets,Udp,我有UDP服务器和客户端,我的代码在家里工作,有内部IP,比如192.168.0.X。如果我把我的代码放在带有外部IP的在线服务器中,X.X.X.X服务器接收和发送,但Android只能发送和不接收。有什么问题 Android发送代码: Android接收代码: 服务器代码: 为什么它不在外部工作,却在本地工作? 你必须理解纳帕特。 即使在家用电脑上运行Web服务器也不起作用。 当您使用浏览器浏览时,您是在主动地使用其IP@和端口向服务器发送GET。NATPAT路由器后面的本地IP@在互联网上不

我有UDP服务器和客户端,我的代码在家里工作,有内部IP,比如192.168.0.X。如果我把我的代码放在带有外部IP的在线服务器中,X.X.X.X服务器接收和发送,但Android只能发送和不接收。有什么问题

Android发送代码:

Android接收代码:

服务器代码:


为什么它不在外部工作,却在本地工作? 你必须理解纳帕特。 即使在家用电脑上运行Web服务器也不起作用。 当您使用浏览器浏览时,您是在主动地使用其IP@和端口向服务器发送GET。NATPAT路由器后面的本地IP@在互联网上不是唯一的,它只在路由器后面是唯一的。因此,您电脑的本地ip@无法用于与服务器通话。因此,您的路由器将根据您的本地ip@和本地端口以及他自己分配的端口构建一个内部表,然后他将您的请求转发给您想要与之通信的Web服务器,但使用您的公共ip@和分配的端口。当服务器回复时,他将回复您的公共ip@和分配的端口。您的NATPAT路由器看到回复,知道它是分配端口上的回复,它在其内部表中查找,并转发到其在查找表中记住的本地ip@和本地端口

如果在NAT PAT路由器后面托管服务器,则无法将任何传入消息发送到Web服务器,因为该表为空

这就是你的android在1600端口监听的问题。他从未在那个端口和ip上发送过任何东西,所以你的路由器不知道它是为谁发送的

它在本地工作,因为所有的本地ip@都被使用,而启用DHCP的路由器已经分配给了您的设备。而且,您的ISP向您提供的公共IP@永远不需要任何翻译

请阅读以下内容:

这是: 下面是一个例子。假设ISP公共IP地址为3.12.62.154。目标是运行在标准协议TCP端口80和web端口上运行的公共可访问web服务器。本地网络专用子网为10.0.0.0/24,其中服务器IP地址为10.0.0.10。对于公共访问,10.0.0.10将被分配到TCP端口80上的3.12.62.154

当Internet上的用户尝试连接到公共web服务器时,这些用户连接到3.12.62.154 IP地址,而不是10.0.0.10 IP地址。原因是在Internet上,web服务器被视为3.12.62.154 IP地址。10.0.0.10 IP地址仅在本地局域网内可见

从这里开始:


如果您不理解这些,请停止尝试,开始阅读。

您是否已在路由器配置中转发UDP端口1500?由于Android设备和服务器都在监听数据,因此必须将其转发给Android设备和服务器。假设两者都通过PC客户端连接到一个接入点,连接正常,所以这不是路由器问题,而是安卓系统问题,我想你是说运行在不同PC上的两个PC客户端可以使用发布的代码正常通信吗?@Nicklas完全正确,如果我在PC上测试安卓代码,代码正常,我可以接收,有了Android,就没有了。我不知道是否有不同的方法可以获得它,Java是相同的,所以我不知道如何修复套接字是双向的。你的android应该使用相同的套接字发送和接收,否则你的NATPAT路由器将不允许数据包从服务器进入。我想你没有抓住要点,我从服务器到自己家的通信没有问题。如果我在PC中使用该代码,则该代码可以工作,并且我可以从/到服务器发送和接收代码。如果我使用Android内部的代码,接收功能将永远不会收到任何类型的消息。你没有抓住要点。您清楚地说:“Android只能发送,不能接收。”您的Android正在1600端口上监听,但从未在该端口上发送过任何内容。因此,它将永远不会从您的本地网络之外接收任何内容。这与您的问题基本相同。您不能让服务器在NAT-PAT路由器(即您的本地路由器或调制解调器)后面运行!我不再理解了;你说的是沟通,所以你所做的是解释沟通是如何工作的,但我没有沟通问题。如果我在Eclipse中复制并粘贴android代码,并在我的PC中运行该代码,它就可以正常工作。如果你说的是问题所在,为什么我的电脑和我的在线服务器之间的通信正常?如果客户端代码在同一个网络中是相同的,那么在PC和Android中应该都可以,但它只在PC中工作如果你没有通信问题,那么你有什么问题?你说“Android只能发送,不能接收。问题是什么?这是帕特造成的沟通问题。它无法在端口1600上接收,因为它从未在该端口上发送任何内容。我要告诉你多少次,你什么时候开始听。
byte[] sendData = new byte[1024];
    try {
        DatagramSocket serverSocket = new DatagramSocket(1500);
        InetAddress IP = InetAddress.getByName("My server IP");
        String invia = "I am Android";
        sendData = invia.getBytes();
        DatagramPacket send = new DatagramPacket(sendData, sendData.length, IP, 1500);
        serverSocket.send(send);
    }
 byte[] receiveData = new byte[1024];
    try {
        DatagramSocket serverSocket = new DatagramSocket(1600);
        while (true) {
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            serverSocket.receive(receivePacket);
            String sentence = new String( receivePacket.getData());
            Log.i("FROM SERVER:", "" + sentence);
        }
    } catch (Exception e) {
    }
   DatagramSocket serverSocket = new DatagramSocket(1500);
        byte[] receiveData = new byte[1024];
        byte[] sendData = new byte[1024];
        while(true)
           {
            /** receive **/
              DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
              serverSocket.receive(receivePacket);
              String sentence = new String( receivePacket.getData());
              System.out.println("RECEIVED: " + sentence);


            /** send **/
              InetAddress IPAddress = receivePacket.getAddress();
              int port = receivePacket.getPort();
              sentence = "I am PC";
              sendData = sentence.getBytes();
              DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 1600);
              serverSocket.send(sendPacket);
           }