Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android illegalxception

Estoy tratando de enviar paquetes UDP con Android a un servidor escrito en C # en mi computadora. Cuando ejecuto la aplicación en mi teléfono, recibo una excepción de estado ilegal. Creo que puede tener algo que ver con la realización de operaciones de red en la actividad principal, pero no estoy seguro de cómo resolver ese problema. Aquí está mi cliente:

public class MainActivity extends Activity { WifiManager wifi; InetAddress dev_ip; final int serverPort = 31337; Thread drawThread = new Thread(new drawer()); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //set up wifi and connection wifi = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); WifiInfo info = wifi.getConnectionInfo(); int ip = info.getIpAddress(); String ipaddr = (ip & 0xff) + "." + (ip >> 8 & 0xff) + "." + (ip >> 16 & 0xff) + "." + (ip >> 24 & 0xff); try { dev_ip = InetAddress.getByName(ipaddr); } catch (UnknownHostException e) { Toast.makeText(this, "host error", Toast.LENGTH_LONG).show(); } if (!wifi.isWifiEnabled()) wifi.setWifiEnabled(true); Toast.makeText(this, "IP: " + ipaddr, Toast.LENGTH_LONG).show(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } public void draw(View view) throws IOException, SocketException { drawThread.start(); } public class drawer implements Runnable { public void run() { //transmit data try { DatagramSocket socket = new DatagramSocket(serverPort, /*myip*/); String test_data = "It works!"; byte btest[] = new byte[50]; btest = test_data.getBytes(); DatagramPacket p1 = new DatagramPacket(btest, btest.length, /*myip*/, serverPort); socket.send(p1); socket.close(); } catch (IOException e) { } } } } 

LogCat:

 07-27 00:10:17.155: D/CLIPBOARD(1711): Hide Clipboard dialog at Starting input: finished by someone else... ! 07-27 00:10:18.020: W/System.err(1711): java.net.BindException: bind failed: EADDRNOTAVAIL (Cannot assign requested address) 07-27 00:10:18.020: W/System.err(1711): at libcore.io.IoBridge.bind(IoBridge.java:89) 07-27 00:10:18.020: W/System.err(1711): at java.net.PlainDatagramSocketImpl.bind(PlainDatagramSocketImpl.java:68) 07-27 00:10:18.020: W/System.err(1711): at java.net.DatagramSocket.createSocket(DatagramSocket.java:133) 07-27 00:10:18.020: W/System.err(1711): at java.net.DatagramSocket.<init>(DatagramSocket.java:95) 07-27 00:10:18.020: W/System.err(1711): at com.ls.styloid.MainActivity$drawer.run(MainActivity.java:67) 07-27 00:10:18.025: W/System.err(1711): at java.lang.Thread.run(Thread.java:856) 07-27 00:10:18.025: W/System.err(1711): Caused by: libcore.io.ErrnoException: bind failed: EADDRNOTAVAIL (Cannot assign requested address) 07-27 00:10:18.025: W/System.err(1711): at libcore.io.Posix.bind(Native Method) 07-27 00:10:18.025: W/System.err(1711): at libcore.io.ForwardingOs.bind(ForwardingOs.java:39) 07-27 00:10:18.025: W/System.err(1711): at libcore.io.IoBridge.bind(IoBridge.java:87) 07-27 00:10:18.025: W/System.err(1711): ... 5 more 07-27 00:10:42.090: D/CLIPBOARD(1711): Hide Clipboard dialog at Starting input: finished by someone else... ! 07-27 00:11:30.150: W/System.err(2535): java.net.BindException: bind failed: EADDRNOTAVAIL (Cannot assign requested address) 07-27 00:11:30.155: W/System.err(2535): at libcore.io.IoBridge.bind(IoBridge.java:89) 07-27 00:11:30.155: W/System.err(2535): at java.net.PlainDatagramSocketImpl.bind(PlainDatagramSocketImpl.java:68) 07-27 00:11:30.155: W/System.err(2535): at java.net.DatagramSocket.createSocket(DatagramSocket.java:133) 07-27 00:11:30.155: W/System.err(2535): at java.net.DatagramSocket.<init>(DatagramSocket.java:95) 07-27 00:11:30.155: W/System.err(2535): at com.ls.styloid.MainActivity$drawer.run(MainActivity.java:67) 07-27 00:11:30.155: W/System.err(2535): at java.lang.Thread.run(Thread.java:856) 07-27 00:11:30.155: W/System.err(2535): Caused by: libcore.io.ErrnoException: bind failed: EADDRNOTAVAIL (Cannot assign requested address) 07-27 00:11:30.155: W/System.err(2535): at libcore.io.Posix.bind(Native Method) 07-27 00:11:30.155: W/System.err(2535): at libcore.io.ForwardingOs.bind(ForwardingOs.java:39) 07-27 00:11:30.155: W/System.err(2535): at libcore.io.IoBridge.bind(IoBridge.java:87) 07-27 00:11:30.155: W/System.err(2535): ... 5 more 07-27 00:11:36.515: D/CLIPBOARD(2535): Hide Clipboard dialog at Starting input: finished by someone else... ! 

EDIT: Parece que hay muchos problemas con el servidor que no había notado antes. Comenzaron a suceder cuando volví a escribir el oyente de acuerdo a una de las respuestas. A veces obtengo un error "No se puede acceder a un objeto eliminado" con label3, una excepción de socket 0x80004005, y aún no se recibieron paquetes. Sin embargo, al comprobar el estado del zócalo, parece ser legible. Probablemente estropeé el hilo, ayúdame a arreglar esto por favor. Servidor:

 public partial class Form1 : Form { Socket listener; Thread udp_listener; public Form1() { InitializeComponent(); //set up listener thread udp_listener = new Thread(listen); udp_listener.IsBackground = true; udp_listener.Start(); } protected override void OnFormClosing(FormClosingEventArgs e) { base.OnFormClosing(e); listener.Close(); udp_listener.Join(); } private void listen() { //set up UDP const int serverPort = 31337; bool terminate = false; IPHostEntry iphost = Dns.GetHostEntry(Dns.GetHostName()); IPAddress ipaddr = iphost.AddressList[0]; IPEndPoint endpoint = new IPEndPoint(ipaddr, serverPort); listener = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); label3.Text = ipaddr.ToString(); try { do { byte[] buffer = new byte[100]; listener.Receive(buffer); label3.Text = "Connected"; label3.ForeColor = Color.Red; label3.Text = Encoding.UTF8.GetString(buffer); } while (!terminate); } catch (Exception e) { MessageBox.Show(e.ToString()); } finally { listener.Close(); } listener.Close(); } } 

EDIT2:

Intenté hacer un cliente con C # en mi computadora. El paquete fue enviado pero mi servidor no recibió nada.

EDIT3: El servidor funciona bien ahora, pero la aplicación de Android se niega a ejecutar. Aquí está el código:

  package com.tests.contest; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; import java.net.UnknownHostException; import android.app.Activity; public class MainActivity extends Activity { private Socket sock; private BufferedWriter out; private Thread thrd; @Override public void onResume() { super.onResume(); thrd = new Thread(new Runnable() { public void run() { while (!Thread.interrupted()) { runOnUiThread(new Runnable() { @Override public void run() { try { sock = new Socket("THEIP", 31337); } catch (UnknownHostException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { out = new BufferedWriter(new OutputStreamWriter(sock .getOutputStream())); out.write("WORKS"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } } }); thrd.start(); } @Override public void onPause() { super.onPause(); if (thrd != null) thrd.interrupt(); try { if (sock != null) { sock.getOutputStream().close(); sock.getInputStream().close(); sock.close(); } } catch (IOException e) {} thrd = null; } /*private void sendText() { String text = "HI"; try { out.write(text + "\n"); out.flush(); } catch (IOException e) {} }*/ } 

El problema se produce porque estoy ejecutando operaciones de red en el hilo principal, que claramente no estoy haciendo.

  • Enviar una estructura de C ++ sobre UDP en Java
  • No se pueden recibir paquetes UDP adecuados mediante SSDP
  • No se puede establecer el valor DSCP en la aplicación android
  • Solución de streaming UDP o RTP para android
  • UDP Hole Punching no es posible con el proveedor móvil
  • Envío de DatagramPacket sin conexión a Internet - Android
  • Retraso / retraso enorme de UDP con Android
  • ¿Cómo usar sockets UDP en android?
  • 2 Solutions collect form web for “Android illegalxception”

    La excepción es decirle exactamente qué hacer: crear el objeto Socket en un Thread independiente. También puede utilizar un AsyncTask para esto.

    El razonamiento detrás de no permitir Sockets en el hilo principal de la interfaz de usuario es que puede causar que la aplicación obtenga el temido mensaje de la Application Not Responding esperando un Socket .

    Editar: http://thinkandroid.wordpress.com/2010/03/27/incorporating-socket-programming-into-your-applications/

    Sólo puede saltar al ejemplo del cliente ya que ya tiene un servidor de escritorio.

    Edit2 : Dado que también estoy trabajando en un servidor C # para mi aplicación para Android, he aquí cómo mi aplicación de escritorio crea un listener Socket :

     IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName()); IPAddress ipAddress = ipHostInfo.AddressList[0]; IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 27015); //Port 27015 Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // Create a TCP/IP socket. 

    Estoy casi seguro de que el problema se encuentra dentro de su servidor / red. El código de Android para enviar un paquete UDP simple parece correcto. También puede intentar conectarse a través de localhost o 127.0.0.1 escribiendo un simple programa cliente C #.

    Editar 3:

    Con esta aplicación básica, deberías poder conectarte al servidor después de introducir la dirección IP correcta. Al presionar Enviar, se enviarán algunos bytes al servidor. Utilícelo para asegurarse de que su conexión funciona. He confirmado que funciona en mi final. Si esto funciona, entonces abriría una nueva pregunta SO para sus problemas de servidor, de lo contrario algo está mal con su configuración de red.

    Creo que el problema viene del bucle do while porque estás intentando modificar un componente UI (label3) en el bucle que es por cierto un bucle infinito que la variable terminate es siempre falsa . Trate de obtener el código witch modifica la interfaz de usuario (label3. *) Fuera del bucle.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.