我在Android中编写了一个与UDP套接字定期通信的应用程序。 我创建了一个datagramSocket,并每隔5秒定期从服务器发送和接收一个数据包,这是代码的一部分:
Thread commTh = new Thread(new Runnable() {
@Override
public void run() {
try {
ds = new DatagramSocket();
serverAddr = InetAddress.getByName(ip);
ds.connect(serverAddr, port);
while(exitThread) {
....
DatagramPacket dp;
dp = new DatagramPacket(data.getBytes(),
data.length(), serverAddr, port);
ds.setSoTimeout(DEFAULT_TIMEOUT);
ds.send(dp);
byte[] lMsg = new byte[SOCKET_BYTE];
dp = new DatagramPacket(lMsg, lMsg.length);
ds.receive(dp);
....
Thread.sleep(5000);
}
}
catch (Exception e) {
e.printStackTrace();
}
}
});
几十分钟后,我得到了这个异常:
W/System.err: java.io.IOException: sendto failed: EPERM (Operation not permitted)
W/System.err: at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:576)
at libcore.io.IoBridge.sendto(IoBridge.java:544)
at java.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:125)
at java.net.DatagramSocket.send(DatagramSocket.java:721)
为什么我不允许进行手术?我的清单中有Internet权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />