Intereting Posts
Android Signature Capture Холст в SurfaceView – аппаратное ускорение Как показать Android-клавиатуру с режимом символов по умолчанию? Android: есть ли простой способ найти все строки в моем проекте? Как добавить изображение в текст TextView? Оверлейная панель состояния Android с ActionBar Как добавить символ маркера в TextView? Как нажимать на элемент внутри RecyclerView в Espresso Как обрабатывать изменение ориентации экрана, когда диалог выполнения и фоновый поток активны? Почему использование multiDexEnabled (true) позволяет создавать приложение, но постоянно падает? Можно ли объявить переменную в Gradle, используемой в Java? Eclipse IDE – графическая компоновка Android и макет XML рядом друг с другом Google PlacePicker закрывается сразу после запуска Как сделать панель контекстного ActionMode наложением панели инструментов appcompat-v7, но не ящиком навигации? Каково использование файла res / values ​​/ public.xml на Android?

Android нелегальное использование

Я пытаюсь отправить UDP-пакеты с Android на сервер, написанный на C # на моем компьютере. Когда я запускаю приложение на своем телефоне, я получаю исключение из незаконного состояния. Я думаю, что это может быть связано с выполнением сетевых операций над основным видом деятельности, но я не уверен, как решить эту проблему. Вот мой клиент:

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: Кажется, что с сервером возникли многочисленные проблемы, которые я раньше не замечал. Они начали происходить, когда я переписал слушателя по одному из ответов. Иногда я получаю ошибку «Не могу получить доступ к удаленному объекту» с меткой3, исключение сокета 0x80004005 и все еще не получает пакетов. Однако при проверке состояния сокета он выглядит читаемым. Я, вероятно, испортил резьбу, помогите мне исправить это, пожалуйста. Сервер:

 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:

Я попробовал сделать клиент с C # на моем компьютере. Пакет был отправлен, но мой сервер ничего не получил.

EDIT3: Сервер работает отлично сейчас, но приложение Android не работает. Вот код:

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

Проблема возникает из-за того, что я запускаю сетевые операции в основном потоке, чего я явно не делаю.

Solutions Collecting From Web of "Android нелегальное использование"

Исключение указывает вам, что именно делать: создать объект Socket в отдельном Thread . Вы можете использовать AsyncTask для этого.

Причиной тому, что Sockets в главном потоке пользовательского интерфейса не разрешено, является то, что приложение может заставить Application Not Responding ожидать ожидания Socket .

Редактировать: http://thinkandroid.wordpress.com/2010/03/27/incorporating-socket-programming-into-your-applications/

Вы можете просто перейти к примеру клиента, поскольку у вас уже есть настольный сервер.

Edit2 : Так как я тоже работаю на сервере C # для своего Android-приложения, вот как мое настольное приложение создает приемник 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. 

Я почти уверен, что проблема заключается в вашем сервере / сети. Код Android для отправки простого пакета UDP выглядит корректно. Вы также можете попробовать подключиться через localhost или 127.0.0.1 , написав простую клиентскую программу C #.

3:

С помощью этого базового приложения вы сможете подключиться к серверу после ввода правильного IP-адреса. Нажатие кнопки «Отправить» отправит на сервер несколько байтов. Используйте это, чтобы убедиться, что ваше соединение работает. Я подтвердил, что это работает на моем конце. Если это сработает, я открою новый вопрос SO для ваших проблем с сервером, иначе что-то не так с вашей сетевой конфигурацией.

Я думаю, что проблема возникает из цикла do while, потому что вы пытаетесь модифицировать компонент UI (label3) в цикле, который, кстати, бесконечный цикл грешит, переменная terminate всегда ложна . Попробуйте получить код, который изменяет UI (label3. *) Из цикла.