Enviar y recibir datos en UDP Socket java android

Soy capaz de enviar correctamente mis datos a través de socket UDP, pero cuando recibo datos que sigue esperando en recibir el comando no sé lo que está causando esto Por favor, eche un vistazo a mi código de abajo

Puedo recibir correctamente datos en el lado del servidor del dispositivo androide, pero cuando envío datos del lado del servidor al dispositivo androide él no recibe. Pero cuando envío datos desde el servidor a cualquier otro cliente, por ejemplo, aplicación de PC que recibe y muestra los datos rpoperly

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) { } } } 

    Documentación en Eclipse:

    Recibe un paquete de este socket y lo almacena en el paquete de argumentos. Todos los campos del paquete se deben ajustar según los datos recibidos. Si los datos recibidos son más largos que el tamaño del búfer de paquetes, se trunca. Este método se bloquea hasta que se recibe un paquete o se ha expirado un tiempo de espera.

    El s.receive(p); " s.receive(p); " bloquea el subproceso hasta que se recibe los datos o el tiempo de espera establecido con setSoTimeout (timeout) ha terminado.

    He hecho 2 clases para hacer que mi comunicación suceda. Primer servidor UDP:

     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; } } 

    Envío los datos recibidos a un BroadcastReceiver y allí usted puede hacer lo que usted desea con los datos.

    Y ahora mi cliente para enviar los datos. En este código enviar una emisión, pero creo que no será ningún problema para cambiar el código para enviar a una dirección IP directa o algo así.

     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(); } 

    Y aquí es cómo instanciar las clases de su clase principal.

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

    Y aquí cómo enviar un mensaje con el cliente.

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

    Para detener el UDP_Server, simplemente establezca Server.Server_aktiv como false.

    Para establecer el mensaje anterior u también puede escribir un método "setMessage (String message)" o algo así.

    Espero que esto te ayude =). Y por último, lo siento por mi mal inglés. :RE

    Aquí, en este post usted encontrará el código detallado para establecer socket entre dispositivos o entre dos aplicaciones en el mismo móvil.

    Tienes que crear dos aplicaciones para probar el código a continuación.

    En el archivo de manifiesto de la aplicación, añada el permiso a continuación

     <uses-permission android:name="android.permission.INTERNET" /> 

    1er código de aplicación: UDP Client Socket

    Activity_main.xml

     <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TableRow android:id="@+id/tr_send_message" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:layout_marginTop="11dp"> <EditText android:id="@+id/edt_send_message" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginRight="10dp" android:layout_marginLeft="10dp" android:hint="Enter message" android:inputType="text" /> <Button android:id="@+id/btn_send" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="10dp" android:text="Send" /> </TableRow> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_below="@+id/tr_send_message" android:layout_marginTop="25dp" android:id="@+id/scrollView2"> <TextView android:id="@+id/tv_reply_from_server" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" /> </ScrollView> </RelativeLayout> 

    UDPClientSocketActivity.java

     import android.os.Bundle; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /** * Created by Girish Bhalerao on 5/4/2017. */ public class UDPClientSocketActivity extends AppCompatActivity implements View.OnClickListener { private TextView mTextViewReplyFromServer; private EditText mEditTextSendMessage; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button buttonSend = (Button) findViewById(R.id.btn_send); mEditTextSendMessage = (EditText) findViewById(R.id.edt_send_message); mTextViewReplyFromServer = (TextView) findViewById(R.id.tv_reply_from_server); buttonSend.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_send: sendMessage(mEditTextSendMessage.getText().toString()); break; } } private void sendMessage(final String message) { final Handler handler = new Handler(); Thread thread = new Thread(new Runnable() { String stringData; @Override public void run() { DatagramSocket ds = null; try { ds = new DatagramSocket(); // IP Address below is the IP address of that Device where server socket is opened. InetAddress serverAddr = InetAddress.getByName("xxx.xxx.xxx.xxx"); DatagramPacket dp; dp = new DatagramPacket(message.getBytes(), message.length(), serverAddr, 9001); ds.send(dp); byte[] lMsg = new byte[1000]; dp = new DatagramPacket(lMsg, lMsg.length); ds.receive(dp); stringData = new String(lMsg, 0, dp.getLength()); } catch (IOException e) { e.printStackTrace(); } finally { if (ds != null) { ds.close(); } } handler.post(new Runnable() { @Override public void run() { String s = mTextViewReplyFromServer.getText().toString(); if (stringData.trim().length() != 0) mTextViewReplyFromServer.setText(s + "\nFrom Server : " + stringData); } }); } }); thread.start(); } } 

    Segundo código de aplicación – UDP Server Socket

    Activity_main.xml

     <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/btn_stop_receiving" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="STOP Receiving data" android:layout_alignParentTop="true" android:enabled="false" android:layout_centerHorizontal="true" android:layout_marginTop="89dp" /> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/btn_stop_receiving" android:layout_marginTop="35dp" android:layout_alignParentLeft="true" android:layout_alignParentStart="true"> <TextView android:id="@+id/tv_data_from_client" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" /> </ScrollView> <Button android:id="@+id/btn_start_receiving" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="START Receiving data" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="14dp" /> </RelativeLayout> 

    UDPServerSocketActivity.java

     import android.os.Bundle; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; /** * Created by Girish Bhalerao on 5/4/2017. */ public class UDPServerSocketActivity extends AppCompatActivity implements View.OnClickListener { final Handler handler = new Handler(); private Button buttonStartReceiving; private Button buttonStopReceiving; private TextView textViewDataFromClient; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); buttonStartReceiving = (Button) findViewById(R.id.btn_start_receiving); buttonStopReceiving = (Button) findViewById(R.id.btn_stop_receiving); textViewDataFromClient = (TextView) findViewById(R.id.tv_data_from_client); buttonStartReceiving.setOnClickListener(this); buttonStopReceiving.setOnClickListener(this); } private void startServerSocket() { Thread thread = new Thread(new Runnable() { private String stringData = null; @Override public void run() { byte[] msg = new byte[1000]; DatagramPacket dp = new DatagramPacket(msg, msg.length); DatagramSocket ds = null; try { ds = new DatagramSocket(9001); //ds.setSoTimeout(50000); ds.receive(dp); stringData = new String(msg, 0, dp.getLength()); updateUI(stringData); String msgToSender = "Bye Bye "; dp = new DatagramPacket(msgToSender.getBytes(), msgToSender.length(), dp.getAddress(), dp.getPort()); ds.send(dp); } catch (IOException e) { e.printStackTrace(); } finally { if (ds != null) { ds.close(); } } } }); thread.start(); } private void updateUI(final String stringData) { handler.post(new Runnable() { @Override public void run() { String s = textViewDataFromClient.getText().toString(); if (stringData.trim().length() != 0) textViewDataFromClient.setText(s + "\n" + "From Client : " + stringData); } }); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_start_receiving: startServerSocket(); buttonStartReceiving.setEnabled(false); buttonStopReceiving.setEnabled(true); break; case R.id.btn_stop_receiving: //Add logic to stop server socket yourself buttonStartReceiving.setEnabled(true); buttonStopReceiving.setEnabled(false); break; } } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.