2010-05-12 108 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