2012-09-25 75 views
0

我正在製作一個非常簡單的應用程序,我從我的PC上的Java程序發送一個文本字符串,我試圖從我的Android應用程序在模擬器中接收相同的字符串。如何通過UDP客戶端接收文本字符串

這是我的活動(服​​務器):

super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_appstart); 
    tv = (TextView) findViewById(R.id.textView1); 
    try { 
     DatagramSocket clientsocket = new DatagramSocket(9876); 
     byte[] receivedata = new byte[1024]; 
     DatagramPacket recv_packet = new     DatagramPacket(receivedata, receivedata.length); 
     Log.d("UDP", "S: Receiving 1 sec..."); 
     clientsocket.receive(recv_packet); 
     String rec_str = new String(recv_packet.getData()); 
     tv.setText(rec_str); 
     Log.d(" Received String ", rec_str); 
     InetAddress ipaddress = recv_packet.getAddress(); 
     int port = recv_packet.getPort(); 
     Log.d("IPAddress : ", ipaddress.toString()); 
     Log.d(" Port : ", Integer.toString(port));         clientsocket.close(); 
    } catch (Exception e) { 
     Log.e("UDP", "S: Error", e); 
    } 
} 

這裏是我的PC客戶端的Java代碼:

public static void main(String args[]) throws Exception 
    { 
      while(true) 
    {   
    BufferedReader inFromUser = new BufferedReader(new  InputStreamReader(System.in)); 
      DatagramSocket clientSocket = new DatagramSocket(); 
      InetAddress IPAddress = InetAddress.getByName("127.0.0.1"); 
    System.out.println(IPAddress.getHostName()); 
      byte[] sendData = new byte[1024]; 
      byte[] receiveData = new byte[1024]; 
      String sentence = inFromUser.readLine(); 
      sendData = sentence.getBytes(); 
      DatagramPacket sendPacket = new DatagramPacket(sendData,sendData.length,IPAddress,9876); 
      clientSocket.send(sendPacket); 
    System.out.println(sendPacket.getPort()); 
      clientSocket.close(); 
    }  
    } 

但是應用程序沒有收到任何東西,但OT拋出異常的onReceive()功能在Android應用程序....

有沒有人知道爲什麼?

+0

您收到的onReceive異常情況如何? – Edison

+0

09-25 20:06:13.697:D/UDP(915):S:接收1秒... 09-25 20:06:13.707:E/UDP(915):S:錯誤 09-25 20 :06:13.707:E/UDP(915):android.os.NetworkOnMainThreadException –

回答

0

您得到android.os.NetworkOnMainThreadException,因爲您在主線程上運行網絡方法,這會使您的應用程序無法響應。嘗試將其放入單獨的線程中...或者在這種情況下,可能是您的活動可以綁定到的服務。 (例如How to fix android.os.NetworkOnMainThreadException?

如果您不需要測試您的UDP服務,您可以將您的API要求設置爲7或以下,或者在主線程策略中禁用網絡,您將不會收到例外。但是,您的應用會非常無響應。

+0

謝謝愛迪生它真的幫助:) –

0

試試這個POC。它發送並監聽數據包。 將收聽者分割爲另一個線程

package a.first; 

import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 
import java.net.SocketException; 


public class Serv { 

/** 
* @param args 
* @throws IOException 
*/ 
public static void main(String[] args) throws IOException { 

     Listner listner = new Listner(); 
     Thread thread = new Thread(listner); 
     thread.start(); 


     String messageStr = "Hello msg1"; 
     int server_port = 2425; 
     DatagramSocket s = new DatagramSocket(); 
     InetAddress local = InetAddress.getByName("172.20.88.223"); 
     int msg_length = messageStr.length(); 
     byte[] message = messageStr.getBytes(); 
     DatagramPacket p = new DatagramPacket(message, msg_length, local, 
       server_port); 
     System.out.println("about to send msg1"); 
     s.send(p); 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      Thread.currentThread().interrupt(); 
      e.printStackTrace(); 
     } 
     messageStr = "Hello msg2"; 
     msg_length = messageStr.length(); 
     message = messageStr.getBytes(); 
     p = new DatagramPacket(message, msg_length, local, 
       server_port); 
     System.out.println("about to send msg2"); 
     s.send(p); 
} 


} 
    class Listner implements Runnable 
    { 
      @Override 
      public void run() { 
     String text = null; 
     while(true){ 
      text = null;  
     int server_port = 2425; 
     byte[] message = new byte[1500]; 
     DatagramPacket p = new DatagramPacket(message, message.length); 
     DatagramSocket s = null; 
     try{ 
      s = new DatagramSocket(server_port); 
     }catch (SocketException e) { 
      e.printStackTrace(); 
      System.out.println("Socket excep"); 
     } 
     try { 
     s.receive(p); 
     }catch (IOException e) { 
      e.printStackTrace(); 
       System.out.println("IO EXcept"); 
      } 
     text = new String(message, 0, p.getLength()); 
     System.out.println("message = "+text); 
     s.close(); 

    } 
} 

} 
相關問題