我正在尝试在Android平板电脑上发送/接收UDP数据包。我在我的Windows笔记本电脑上设置了一个Java程序,使用与平板电脑相同的UDP读取器/写入器类(Android读卡器和计算机编写器使用相同的端口,反之亦然),我使用的是交叉电缆和用于连接两者的USB以太网适配器。
我始终能够从计算机上接收平板电脑上的数据包。但是,即使我可以通过同一网络接收数据包,从平板电脑向计算机发送数据包通常也会出现java.net.SocketException: sendto failed: ENETUNREACH (Network is unreachable)
错误。
如果我打开平板电脑的无线网络,我就不会再收到错误,但是我没有通过以太网连接获取数据包。
当我将系统插入带有交换机的网络时,我能够让系统正常工作,所以我想知道是否存在一些我的计算机缺失的基础网络设置。
或者:有没有办法告诉它尝试发送UDP数据包,无论它是否认为它已连接?
对于这些类,serverIP
是平板电脑尝试与之通信的计算机的地址。每个serverPort
对应于对方正在寻找的内容。
UDP Writer类:
public void sendMessage(final SentMessage message) {
try {
try (DatagramChannel channel = DatagramChannel.open()) {
try (DatagramSocket socket = channel.socket()) {
socket.bind(new InetSocketAddress(this.serverPort));
byte[] byteArray = message.buildByteArray(false);
DatagramPacket sendPacket = new DatagramPacket(byteArray, byteArray.length, this.serverIP, this.serverPort);
socket.send(sendPacket);
}
}
}
catch (Exception e) {
log.log(Level.SEVERE, e.getMessage(), e);
e.printStackTrace();
} }
UDP Reader类:
protected void runServer() {
try {
try (DatagramChannel channel = DatagramChannel.open()) {
try (DatagramSocket socket = channel.socket()) {
socket.bind(new InetSocketAddress(this.serverPort));
int messageSize = 48;
while (this.mRun) {
//Read in packet
final byte[] messageBytes = new byte[messageSize];
DatagramPacket receivedMessage = new DatagramPacket(messageBytes, messageSize, this.serverIP, this.serverPort);
socket.receive(receivedMessage);
//Convert to known message type
//...
}
}
}
} catch (Exception e) {
log.log(Level.SEVERE, e.getMessage(), e);
e.printStackTrace();
} }