【发布时间】:2019-10-07 15:04:19
【问题描述】:
我想连接到服务器,接收 UDP 消息。我认为连接是正确的,但它不会从服务器接收到我的 udp 包。服务器在网络上发送 udp 消息,但我无法接收?所以它只会连接到服务器,为什么它不向我发送消息。我不需要先向服务器发送消息。
public class TestUdpClient implements Runnable {
private DatagramSocket sock;
private int port = 1200;
private String inetAddress = "122.17.4.6";
private SocketAddress remoteAddress;
byte[] message = new byte[200];
private ByteBuffer b;
private String signature;
public void run() {
try {
Log.d(TAG, "S: Connecting...");
InetSocketAddress localSocketAddress = new InetSocketAddress(0);
remoteAddress = new InetSocketAddress(inetAddress, port);
sock = new DatagramSocket(localSocketAddress);
sock.connect(remoteAddress);
System.out.println(sock.isConnected());
boolean running = true;
while (running) {
// Prepare a UDP-Packet that can contain the data we want to receive
DatagramPacket packet = new DatagramPacket(message, message.length);
Log.d(TAG, "S: Receiving...");
// Receive the UDP-Packet
sock.receive(packet);
Log.d(TAG, "S: Received: '" + new String(packet.getData()) + "'");
synchronized (this) {
wait(500);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
Log.e("connection","No connection was made");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
主活动
View.OnClickListener buttonConnectOnClickListener =
new View.OnClickListener() {
@Override
public void onClick(View arg0) {
try {
udpClient = new UdpClient(serverAdres,poortNummer);
} catch (IOException e) {
e.printStackTrace();
}
new Thread(new ClientSendAndListen()).start();
buttonConnect.setEnabled(false);
}
};
【问题讨论】:
-
你能分享错误堆栈跟踪吗?
-
android.os.NetworkOnMainThreadException 在 android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1513) 在 java.net.AbstractPlainDatagramSocketImpl.connect(AbstractPlainDatagramSocketImpl.java:132) 在 java.net。 DatagramSocket.connectInternal(DatagramSocket.java:169) at java.net.DatagramSocket.connect(DatagramSocket.java:517) at com.ict.barcodescanner.UdpClient.
(UdpClient.java:31) at com.ict.barcodescanner .MainActivity$1.onClick(MainActivity.java:48) -
Android 不允许在主线程上进行网络操作。创建一个 AsyncTask 并从
doInBackground()调用udpClient = new UdpClient(serverAdres,poortNummer);(另请参阅此处stackoverflow.com/a/19541474/5312102) -
UDP 是无连接的,调用
sock.connect()只会过滤入站数据包,因此只有从特定对等 IP/端口接收到的数据包才会返回给您。但是要真正通知服务器您已准备好接收,您通常必须先向服务器发送一个数据包,以便它知道您甚至存在,除非服务器正在向整个网络子网发送广播数据包。话虽如此,您是否使用像 Wireshark 这样的数据包嗅探器嗅探网络以确保服务器实际上开始发送非空白数据包? -
另外,为什么您的线程会在每次循环迭代时创建一个新的
DatagramSocket和DatagramPacket?它应该在进入循环之前创建一次DatagramSocket和DatagramPacket。循环应该只是调用sock.receive()(并忽略SocketTimeoutException错误),直到应用准备好终止线程。
标签: java android sockets udp connection