Search code examples
androidmultithreadingsocketsudpdatagram

udp connecting to device


here is my Code

package com.example.messenger;

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

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

@SuppressLint("NewApi")
public class MainActivity extends Activity implements View.OnClickListener {
    Button Send;
    EditText IPAdresse;
    EditText TEXT;
    TextView RXtext,tstep,rstep;
    private static final int TIMEOUT_MS = 1000;
    private static final int server_port = 13011;

    @SuppressLint({ "NewApi", "NewApi", "NewApi" })
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

        StrictMode.setThreadPolicy(policy); 

        IPAdresse = (EditText) findViewById(R.id.etIPAdresse);
        IPAdresse.setText("192.168.2.32");
        TEXT = (EditText) findViewById(R.id.etTEXT);
        Send = (Button) findViewById(R.id.bSendaa);
        RXtext = (TextView) findViewById(R.id.tvRXtext);
        tstep = (TextView) findViewById(R.id.tvTstep);
        rstep = (TextView) findViewById(R.id.tvRstep);
        Send.setOnClickListener(this);


        new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub

                String text;
                byte[] message = new byte[1500];
                DatagramSocket s;

                while(true){
                try {
                    s= new DatagramSocket(server_port);
                    rstep.setText("1");
                    s.setBroadcast(true);
                    rstep.setText("2");
                    s.setSoTimeout(TIMEOUT_MS);
                    rstep.setText("3");

                    while(true){
                        DatagramPacket p = new DatagramPacket(message, message.length);
                        rstep.setText("4");
                        //InetAddress test = InetAddress.getByName("192.168.1.101");
                        //rstep.setText("5");
                        //s.connect(test,12345);
                        //rstep.setText("6");
                        s.receive(p);
                        rstep.setText("xxx");
                        text = new String(message, 0, p.getLength());
                        RXtext.setText(text);
                    }
                } catch (SocketException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    rstep.setText("fail socket create");
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    rstep.setText("fail receive");
                }

                }
            }
        });
        }

public void onClick(View arg0) {
    // TODO Auto-generated method stub
    switch(arg0.getId()){
    case R.id.bSendaa:
        tstep.setText("1");
        String messageStr= TEXT.getText().toString();
        tstep.setText("2");

        DatagramSocket s;
        try {
            s = new DatagramSocket();
            tstep.setText("3");
            s.setBroadcast(true);
            tstep.setText("4");
            s.setSoTimeout(TIMEOUT_MS);
            tstep.setText("5");
            InetAddress local = InetAddress.getByName(IPAdresse.getText().toString());
            tstep.setText("6");
            int msg_length=messageStr.length();
            tstep.setText("7");
            byte[] message = messageStr.getBytes();
            tstep.setText("8");
            DatagramPacket p = new DatagramPacket(message, msg_length,local,server_port);
            tstep.setText("9");
            s.connect(local,server_port);
            tstep.setText("10");
            s.send(p);
            tstep.setText("sending complete");


        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            tstep.setText("sending failed");
        }
    }
}

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

My android phone's Ip is 192.168.2.32 , I saw it in wifi settings. So when I debug it row by row , I saw that my virtual device sent the packet , but I don't know why my phone can't get it. Can anybody help me? Thanks Regards


Solution

  • now it works , I didn't call start() function for thread , and I should change the UI from runOnUiThread , but it worked only from device to device, not from Virtual Device to Device, so here is the working code

    package com.example.messenger;
    
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketAddress;
    import java.net.SocketException;
    import java.net.UnknownHostException;
    
    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.StrictMode;
    import android.view.Menu;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    
    @SuppressLint("NewApi")
    public class MainActivity extends Activity implements View.OnClickListener {
        Button Send;
        EditText IPAdresse;
        EditText TEXT;
        TextView RXtext,tstep,rstep;
        private static final int TIMEOUT_MS = 10000;
        private static final int server_port = 13011;
        String mMessage;
    
        @SuppressLint({ "NewApi", "NewApi", "NewApi" })
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    
            StrictMode.setThreadPolicy(policy); 
    
            IPAdresse = (EditText) findViewById(R.id.etIPAdresse);
            IPAdresse.setText("192.168.2.32");
            TEXT = (EditText) findViewById(R.id.etTEXT);
            Send = (Button) findViewById(R.id.bSendaa);
            RXtext = (TextView) findViewById(R.id.tvRXtext);
            tstep = (TextView) findViewById(R.id.tvTstep);
            rstep = (TextView) findViewById(R.id.tvRstep);
            Send.setOnClickListener(this);
    
    
            new Thread(new Runnable() {
    
                @Override
                public void run() {
                    // TODO Auto-generated method stub
    
                    String text;
                    byte[] message = new byte[4];
                    DatagramSocket s;
    
                    try {
                        s= new DatagramSocket(server_port);
                        s.setSoTimeout(TIMEOUT_MS);
    
                        while(true){
                            try {
                                DatagramPacket p = new DatagramPacket(message, message.length);
                                s.receive(p);
    
                                mMessage = new String(message, 0, p.getLength());
                                runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        RXtext.setText(mMessage);
                                    }
                                });
                            }
                            catch(Exception e) {
                                e.printStackTrace();
                            }
    
                        }
                    } catch (SocketException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        //rstep.setText("fail socket create");
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        //rstep.setText("fail receive");
                    }
                }
    
            }).start();
        } 
    
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        switch(arg0.getId()){
        case R.id.bSendaa:
            String messageStr= TEXT.getText().toString();
    
            DatagramSocket s;
            try {
                s = new DatagramSocket();
                s.setBroadcast(true);
                s.setSoTimeout(TIMEOUT_MS);
                InetAddress local = InetAddress.getByName(IPAdresse.getText().toString());
                int msg_length=messageStr.length();
                byte[] message = messageStr.getBytes();
                DatagramPacket p = new DatagramPacket(message, msg_length,local,server_port);
                //s.connect(local,server_port);
                s.send(p);
                tstep.setText("sending complete");
    
    
            } catch (SocketException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                tstep.setText("sending failed");
            }
        }
    }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }
    }