2012-09-25 37 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(); 

    } 
} 

} 
相关问题