2013-09-24 81 views
1

我想在Android中實現基本的數據報套接字。我開始在網絡上提供的樣本之一:Android數據報套接字不工作

String messageStr="Hello Android!"; 
int server_port = 54372; 
try { 
    DatagramSocket s = new DatagramSocket(); 
    InetAddress local = null; 
    local = InetAddress.getByName("192.168.100.127"); 
    int msg_length=messageStr.length(); 
    byte[] message = messageStr.getBytes(); 
    DatagramPacket p = new DatagramPacket(message, msg_length, local, server_port); 
    s.send(p); 
} catch (SocketException e) { 
    e.printStackTrace(); 
} catch (UnknownHostException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

我有使Internet的權限在AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET"/> 

當它擊中s.send(p)命令的程序死掉。

我錯過了什麼?它一定是明顯的。

+1

你應該張貼您的logcat消息時,它的模具「 – triggs

回答

1

您正在收到一個您未找到的錯誤:NetworkOnMainThreadException。 您應該在另一個線程或AsyncTask中執行所有聯網人員。

例如:

class MyThread extends Thread 
{ 
    @Override 
    public void run() 
    { 
     UDPSend(); 
    } 

    void UDPSend() 
    { 
     String messageStr = "Hello Android!"; 
     int server_port = 54372; 
     try 
     { 
      DatagramSocket s = new DatagramSocket(); 
      InetAddress local = null; 
      local = InetAddress.getByName("192.168.1.57"); 
      int msg_length = messageStr.length(); 
      byte[] message = messageStr.getBytes(); 
      DatagramPacket p = new DatagramPacket(message, msg_length, local, server_port); 
      s.send(p); 
      android.util.Log.w("UDP", "Works fine!"); 
     } 
     catch (SocketException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (UnknownHostException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (Exception e) 
     { 
      android.util.Log.w("UDP", "Catched here."); 
      e.printStackTrace(); 
     } 
    } 

} 

要在主線程執行線程:new MyThread().start();

UPDATE: 這是一個應用程序的一個真實的例子:

在的AsyncTask UDP接收器。我刪除了一些不相關的行。 我向你展示了doInBackgroud,它是接收UDP數據包的接口。

@Override 
protected Void doInBackground(Void... urls) 
{ 
    DatagramSocket socketUDP; 

    try 
    { 
     socketUDP = new DatagramSocket(5050); 
     socketUDP.setSoTimeout(5000); 

     // set it to true if you want to receive broadcast packets 
     socketUDP.setBroadcast(false); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
     return null; 
    } 

    byte[] buff = new byte[512]; 
    DatagramPacket packet = new DatagramPacket(buff, buff.length); 
    try 
    { 
     asyncTask_UDP_is_running=true; 
     // Keep running until application gets inactive 
     while (aplicationActive) 
     { 
      try 
      { 
       socketUDP.receive(packet); 
       android.util.Log.w("UDP", "got a packet"); 
      } 
      catch (java.net.SocketTimeoutException ex) 
      { 
       // timeout 
      } 
      catch (Exception e) 
      { 
       e.printStackTrace(); 
       return null; 
      } 
     } 
    } 
    finally 
    { 
     asyncTask_UDP_is_running=false; 
    } 
    return null; 
} 

}

+0

我已經這樣做,這種情況發生。我只包含了一些看似相關的代碼片段。 –

+0

@DanDickerson然後它應該工作,它爲我做。我只是將你的代碼複製到我的工作區中,將IP更改爲我的IP網絡,並在UI中運行它,它觸發了一個異常,我將它放在'Thread'中,並且工作正常。也許它是IP,嘗試使用環回IP「127.0.0.1」來查看它是否工作。 –

+0

我終於明白了你的建議。你現在能幫我讓聽衆工作嗎?我嘗試設置另一個類GetThread,它與您的示例類似,但似乎並未實際接收UDP消息。 –