sending and receiving UDP packet on datagram socket in android

21,491

Solution 1

In Android you're not allowed to execute Network operations on the UIThread (Main-Thread)

To Fix this: Copy your network-code to a new Thread and let it run.

Solution 2

The port numbers in the "new DatagramSocket(...)" calls look weird. The client should create an "unbound" socket - simply use "new DatagramSocket();". The sender should bind to the port that the client sends to, i.e. "new DatagramSocket(4444);".

Share:
21,491
Ameer Humza
Author by

Ameer Humza

Updated on July 09, 2022

Comments

  • Ameer Humza
    Ameer Humza almost 2 years

    I have two classes,one sender class and the other is the receiver class.Both of the sending and receiving apps stops after few seconds and close down. My sender class is :

        public class MainActivity extends Activity {
    InetAddress receiverAddress;
    DatagramSocket datagramSocket;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
    
        try {
            datagramSocket = new DatagramSocket(4444);
        } catch (SocketException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    
        byte[] buffer = "0123456789".getBytes();
        byte[] address="192.168.1.101".getBytes();
    
        try {
            receiverAddress = InetAddress.getByAddress(address);
        } catch (UnknownHostException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    
        DatagramPacket packet = new DatagramPacket(
                buffer, buffer.length, receiverAddress, 4444);
    
        try {
            datagramSocket.send(packet);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
    
    
    
    }
    

    My receiving or listening class is:

    public class MainActivity extends Activity {
    DatagramSocket datagramSocket;
    DatagramPacket packet;
    TextView tv1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        tv1=(TextView)findViewById(R.id.textView1);
         try {
            datagramSocket = new DatagramSocket(80);
        } catch (SocketException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    
        byte[] buffer = new byte[10];
         packet = new DatagramPacket(buffer, buffer.length);
    
        try {
            datagramSocket.receive(packet);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        byte[] buff = packet.getData();
    
    tv1.setText(buff.toString());
    
    }
    

    Thanks in advance for the help.

  • AlastairG
    AlastairG about 10 years
    I think you mean that the "receiver" should bind to the port that the "sender" sends to.