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) { } } }
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.
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.
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 (.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With