Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Send and receive data on UDP Socket java android

Tags:

I am able to properly send my data through UDP socket , but when I receive data it keeps on waiting at receive command I don't know what is causing this. Please have a look at my code below.

I am able to properly receive data at server side from android device, but when I send data from server side to android device it doesn't receive. but when I send data from server to any other client e.g PC application it receive and displays data properly.

class Task implements Runnable {     @Override     public void run() {         try {             String messageStr = "feed";             int server_port = 8888;             InetAddress local = InetAddress.getByName("10.0.2.2");             int msg_length = messageStr.length();             byte[] message = messageStr.getBytes();               DatagramSocket s = new DatagramSocket();            //               DatagramPacket p = new DatagramPacket(message, msg_length, local, server_port);             s.send(p);//properly able to send data. i receive data to server              for (int i = 0; i <= 20; i++) {                 final int value = i;                 message = new byte[30000];                 p = new DatagramPacket(message,message.length );                 s.receive(p); //keeps on waiting here but i am sending data back from server, but it never receives                 final byte[] data =  p.getData();;                 try {                        Thread.sleep(1000);                 } catch (InterruptedException e) {                     e.printStackTrace();                 }                 handler.post(new Runnable() {                     @Override                     public void run() {                         progressBar.setProgress(value);                         imageView.setImageBitmap(BitmapFactory.decodeByteArray(data,0,data.length));                     }                 });             }         }         catch(Exception ex)         {          }     } } 
like image 829
user2539602 Avatar asked Oct 23 '13 11:10

user2539602


People also ask

Can UDP send and receive on same socket?

TCP vs UDP Once connected, a TCP socket can only send and receive to/from the remote machine. This means that you'll need one TCP socket for each client in your application. UDP is not connection-based, you can send and receive to/from anyone at any time with the same socket.

What is UDP socket in Java?

DatagramSockets are Java's mechanism for network communication via UDP instead of TCP. Java provides DatagramSocket to communicate over UDP instead of TCP. It is also built on top of IP. DatagramSockets can be used to both send and receive packets over the Internet.

What is Udp in android?

UDP (User Datagram Protocol) is anther commonly used protocol on the Internet. However, UDP is never used to send important data such as webpages, database information, etc; UDP is commonly used for streaming audio and video. Streaming media such as Windows Media audio files (.


1 Answers

Documentation in Eclipse:

Receives a packet from this socket and stores it in the argument pack. All fields of pack must be set according to the data received. If the received data is longer than the packet buffer size it is truncated. This method blocks until a packet is received or a timeout has expired.

The "s.receive(p);" command blocks the thread until it receices data or the timeout set with setSoTimeout(timeout) is over.

I have made 2 classes to make my communication happen. First UDP-Server:

import java.net.DatagramPacket; import java.net.DatagramSocket; import android.annotation.SuppressLint; import android.content.Intent; import android.os.AsyncTask; import android.os.Build;  public class UDP_Server  {     private AsyncTask<Void, Void, Void> async;     private boolean Server_aktiv = true;      @SuppressLint("NewApi")     public void runUdpServer()      {         async = new AsyncTask<Void, Void, Void>()          {             @Override             protected Void doInBackground(Void... params)             {                    byte[] lMsg = new byte[4096];                 DatagramPacket dp = new DatagramPacket(lMsg, lMsg.length);                 DatagramSocket ds = null;                  try                  {                     ds = new DatagramSocket(Main.SERVER_PORT);                      while(Server_aktiv)                     {                         ds.receive(dp);                          Intent i = new Intent();                         i.setAction(Main.MESSAGE_RECEIVED);                         i.putExtra(Main.MESSAGE_STRING, new String(lMsg, 0, dp.getLength()));                         Main.MainContext.getApplicationContext().sendBroadcast(i);                     }                 }                  catch (Exception e)                  {                     e.printStackTrace();                 }                  finally                  {                     if (ds != null)                      {                         ds.close();                     }                 }                  return null;             }         };          if (Build.VERSION.SDK_INT >= 11) async.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);         else async.execute();     }      public void stop_UDP_Server()     {         Server_aktiv = false;     } } 

I send the received data to an BroadcastReceiver and there you can do what ever you want to with the data.

And now my client to send the data. In this code I send a broadcast, but I think it will be no problem to change the code for sending to a direct IP or something.

import java.net.DatagramPacket; import java.net.DatagramSocket; import android.annotation.SuppressLint; import android.os.AsyncTask; import android.os.Build;  public class UDP_Client  {     private AsyncTask<Void, Void, Void> async_cient;     public String Message;      @SuppressLint("NewApi")     public void NachrichtSenden()     {         async_cient = new AsyncTask<Void, Void, Void>()          {             @Override             protected Void doInBackground(Void... params)             {                    DatagramSocket ds = null;                  try                  {                     ds = new DatagramSocket();                     DatagramPacket dp;                                               dp = new DatagramPacket(Message.getBytes(), Message.length(), Main.BroadcastAddress, Main.SERVER_PORT);                     ds.setBroadcast(true);                     ds.send(dp);                 }                  catch (Exception e)                  {                     e.printStackTrace();                 }                 finally                  {                     if (ds != null)                      {                            ds.close();                     }                 }                 return null;             }              protected void onPostExecute(Void result)              {                super.onPostExecute(result);             }         };          if (Build.VERSION.SDK_INT >= 11) async_cient.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);         else async_cient.execute();     } 

And here is how you instantiate the classes from your main class.

            //start UDP server         Server = new UDP_Server();         Server.runUdpServer();          //UDP Client erstellen         Client = new UDP_Client(); 

And here how to send a message with the client.

                                    //Set message                 Client.Message = "Your message";                                     //Send message                 Client.NachrichtSenden(); 

To stop the UDP_Server, just set Server.Server_aktiv to false.

To set the message above u can also write a "setMessage(String message)" methode or something like that.

like image 181
Tim Avatar answered Sep 24 '22 08:09

Tim