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);".
Author by
Ameer Humza
Updated on July 09, 2022Comments
-
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 about 10 yearsI think you mean that the "receiver" should bind to the port that the "sender" sends to.