我编写了一个小的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
这可能是什么原因?
答案 0 :(得分:2)
Android不允许来自主线程(NetworkOnMainThreadException
)的网络连接,以阻止用户界面。他们希望用户界面能够响应并且不会被网络操作阻止,因此用户不会认为应用程序崩溃了。
你必须在新线程中进行网络工作。
AsyncTask对此有好处。