2010-05-12 142 views
1

我的Android设备上实现了简单的udp服务器(sdk 1.5) 当我在电话上运行本地客户端时,它可以正常工作,并通过触发器发送到我的服务器。UDP服务器不接受来自外部的呼叫

但是当我尝试从外部服务器到我的手机的udp呼叫,它不工作。 已经确定外部服务器未被防火墙阻挡,并且正在将udp触发器发送到我的手机正在监听的正确端口。

我在手机上使用natstat,并检查手机是否真的在收听它的本地IP,并将端口设置为。

,这里是我的服务器代码(在设备上)

// server will listen to one client 
    try 
    { 
     Thread udpServerThread = new Thread() 
     { 

      @Override 
      public void run() 
      { 
       try 
       { 
       // Retrieve the ServerName 

          InetAddress serverAddr = InetAddress 
          .getByName("localhost"); 

        Log.d("UDP", "S: Connecting..."); 
        // Create new UDP-Socket 
        socket = new DatagramSocket(SERVERPORT,serverAddr); 






        byte[] buf = new byte[17]; 


        // * Prepare a UDP-Packet that can contain the data we 
        // * want to receive 

        DatagramPacket packet = new DatagramPacket(buf, 
          buf.length); 
        Log.d("UDP", "S: Receiving..."); 

       // wait to Receive the UDP-Packet 
        socket.receive(packet); 
        Log.d("UDP", "S: Received: '" 
          + new String(packet.getData()) + "'"); 


        acceptedMsg=new String(packet.getData()); 


        notifyService(acceptedMsg); 



        Log.d("UDP", "S: Done."); 
       } catch (Exception e) 
       { 
        Log.e("UDP", "S: Error", e); 
       } 


      } 

     }; 
     udpServerThread.start(); 

    } 

    catch (Exception E) 
    { 
    Log.e("r",E.getMessage()) ; 
    } 

所以正如我所说的,当我尝试将其与本地客户端(单独的线程),它发送UDP数据触发它工作正常,但是当在发送UDP之后,我将这个客户端实现并放到外部的真实服务器上, ,手机不响应它。

有什么想法吗?

谢谢,

ray。

回答

1

我猜想,当你拨打InetAddress.getByName("localhost")时,你会得到环回地址(127.0.0.1)。

你真正想要做的是有一个绑定到INADDR_ANY套接字,你可以明显通过创建DatagramSocket像这样实现:

socket = new DatagramSocket(SERVERPORT); 
+0

的感谢!它的工作,但仍不能明白你的意思是由INADDR_ANY? – rayman 2010-05-12 13:50:45

+0

INADDR_ANY是IPv4通配符地址,将套接字绑定到INADDR_ANY相当于绑定到所有系统的地址。 – Hasturkun 2010-05-12 14:18:09