#java #android #udp
#java #Android #udp
Вопрос:
Я написал небольшой Java-скрипт, который отправляет сообщение через UDP на сервер на моем компьютере:
@Override
public void onClick(View view) {
try {
DatagramSocket clientSocket = new DatagramSocket();
InetAddress IP = InetAddress.getByName("192.168.1.5");
byte[] sendData = new byte[1024];
String sentence = "HELLO";
sendData = sentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IP, 9876);
clientSocket.send(sendPacket);
clientSocket.close();
} catch(IOException e) {
}
}
Я попробовал тот же код с другого компьютера в сети, и затем сообщение правильно отправляется и принимается. Когда я пытаюсь запустить это со своего телефона Android, сервер его не получит. Почему это?
Редактировать
Я забыл добавить разрешение доступа в Интернет в манифест, но когда я это сделал, приложение вылетает при нажатии кнопки:
06-13 21:14:26.932 13501-13501/com.example.omgandroid E/AndroidRuntime﹕ FATAL EXCEPTION: main
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1144)
at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:175)
at libcore.io.IoBridge.sendto(IoBridge.java:466)
at java.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:182)
at java.net.DatagramSocket.send(DatagramSocket.java:284)
at com.example.omgandroid.MainActivity.onClick(MainActivity.java:72)
at android.view.View.performClick(View.java:4475)
at android.view.View$PerformClick.run(View.java:18786)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:5419)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
at dalvik.system.NativeStart.main(Native Method)
06-13 21:14:38.987 13501-13501/com.example.omgandroid I/Process﹕ Sending signal. PID: 13501 SIG: 9
Что может быть причиной этого?
Комментарии:
1. если ваш телефон Android использует вашу локальную сеть? если оно передается через сотовые данные,
192.168
сетевой блок не может быть использован — они являются «частными» блоками и не маршрутизируются. Ваш поставщик данных сотовой связи буквально не будет знать, где находится этот IP-адрес.2. Телефон, конечно, подключен к Wi-Fi, но я не уверен, отправляется ли сообщение через Wi-Fi или 3g. Откуда я это знаю?
3. Проверьте исключение, которое вы улавливаете, и посмотрите, появляется ли там что-нибудь. Я предполагаю, что вы забыли запросить разрешения на доступ в Интернет в своем манифесте Android.
4. Вы правы! Но теперь появляется другая проблема, см. Исходное сообщение.
Ответ №1:
Android не разрешает сетевые подключения из основного потока ( NetworkOnMainThreadException
), чтобы не блокировать пользовательский интерфейс. Они хотят, чтобы пользовательский интерфейс был отзывчивым и не блокировался сетевыми операциями, поэтому пользователь не подумает, что приложение разбилось.
Вы должны выполнять сетевые действия внутри нового потока.
AsyncTask подходит для этого.