0

I am making a very simple app in which I send a text string from java program on my PC and I am trying to receive same string from my android app in emulator.

This is my activity(server):

    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);
    }
}

Here is my PC client java code:

  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();
    }       
   }

However the app does not receive anything, but ot throws an exception on onReceive() function in android app....

Does any one knows why?

nickhar
  • 19,981
  • 12
  • 60
  • 73
Mr_Hmp
  • 2,474
  • 2
  • 35
  • 53
  • What's the exception you received onReceive? – Edison Sep 25 '12 at 15:29
  • 09-25 20:06:13.697: D/UDP(915): S: Receiving 1 sec... 09-25 20:06:13.707: E/UDP(915): S: Error 09-25 20:06:13.707: E/UDP(915): android.os.NetworkOnMainThreadException – Mr_Hmp Sep 25 '12 at 15:33

2 Answers2

0

You get android.os.NetworkOnMainThreadException because you are running network methods on your main thread, this will make your app not responsive. Try putting it into a separate thread or...in this case, perhaps a Service that your Activity can bind to. (See How to fix android.os.NetworkOnMainThreadException? for an example)

IF (NOT RECOMMENDED) you only need to test your UDP service, you can set your API requirement to 7 or below OR disable the network on main thread policy, you will not receive a exception. However, your app will be highly unresponsive.

Community
  • 1
  • 1
Edison
  • 5,961
  • 4
  • 23
  • 39
0

Try this POC. it sends and listens for the packets. split the listener into another thread

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();

    }
}

}
Vishnudev K
  • 2,874
  • 3
  • 27
  • 42