Android 上非常简单的 UDP server/client 无法工作
Very simple UDP server/client on Android wont work
我正在尝试在 android 上做一个非常简单的客户端,以将 UDP 消息发送到 Android 上的服务器。
这是我的简单 UDP 客户端:
public class MyUDPClient {
private static String TAG = "MyUDPClient";
private DatagramSocket udpSocket;
private InetAddress serverAddress;
private int port;
private Scanner scanner;
public MyUDPClient(String destinationAddr, int port) throws SocketException, UnknownHostException {
this.serverAddress = InetAddress.getByName(destinationAddr);
this.port = port;
udpSocket = new DatagramSocket(this.port);
scanner = new Scanner(System.in);
}
public void send(String message) throws IOException {
DatagramPacket p = new DatagramPacket(
message.getBytes(), message.getBytes().length, serverAddress, port);
Log.d(TAG, "udp client send: " + message + " to serverAddress " + serverAddress);
this.udpSocket.send(p);
}
public void connect() {
Log.d(TAG, "UDP connection to port " + port);
}
}
这是我的简单 UDP 服务器:
public class MyUDPServer {
private String TAG = "MyUDPServer";
private int port;
private DatagramSocket udpSocket;
OnMessageCallback onMessageCallback;
public MyUDPServer(int port) throws SocketException {
this.udpSocket = new DatagramSocket(port);
this.port = port;
}
public interface OnMessageCallback {
public void on(String message);
}
private void listen() throws Exception {
Log.d(TAG, "listening UDP server on port " + port);
String msg;
while (true) {
byte[] buf = new byte[256];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
// blocks until a packet is received
udpSocket.receive(packet);
msg = new String(packet.getData()).trim();
Log.d(TAG, "message received; " + msg);
onMessageCallback.on(msg);
}
}
public void start() throws Exception {
listen();
}
public void setMessageCallback(OnMessageCallback onMessageCallback) {
this.onMessageCallback = onMessageCallback;
}
}
问题是服务器从未收到任何消息。我这样启动客户端:
MyUDPClient myUDPClient = new MyUDPClient("192.168.1.6", 8887);
因为它在模拟器上,我尝试过滤 IP 192.168.1.6
,即使我调用 myUDPClient.send("message")
,在 WireShark 上我什么也没有收到,这表明消息甚至没有离开计算机模拟器在哪里。
我做错了什么?
我在 Android 上创建了一个 WebSocket client/server,它运行良好。
我有这两个权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
在您的 MyUDPClient-class 中只需更改即可避免导致异常的“双重”绑定:
public MyUDPClient(String destinationAddr, int port) throws SocketException, UnknownHostException {
super();
this.serverAddress = InetAddress.getByName(destinationAddr);
this.port = port;
udpSocket = new DatagramSocket(this.port);
scanner = new Scanner(System.in);
}
至
public MyUDPClient(String destinationAddr, int port) throws SocketException, UnknownHostException {
super();
this.serverAddress = InetAddress.getByName(destinationAddr);
this.port = port;
udpSocket = new DatagramSocket();
//udpSocket = new DatagramSocket(this.port);
scanner = new Scanner(System.in);
}
问题是我正在获取 NetworkOnMainThreadException
但它被记录到我没有过滤的 logcat 的另一部分。
从单独的线程执行 myudpClient.send("myMessage")
解决了问题。这就是为什么我什至看不到 Wireshark 上的输出,它甚至没有发送。
我正在尝试在 android 上做一个非常简单的客户端,以将 UDP 消息发送到 Android 上的服务器。
这是我的简单 UDP 客户端:
public class MyUDPClient {
private static String TAG = "MyUDPClient";
private DatagramSocket udpSocket;
private InetAddress serverAddress;
private int port;
private Scanner scanner;
public MyUDPClient(String destinationAddr, int port) throws SocketException, UnknownHostException {
this.serverAddress = InetAddress.getByName(destinationAddr);
this.port = port;
udpSocket = new DatagramSocket(this.port);
scanner = new Scanner(System.in);
}
public void send(String message) throws IOException {
DatagramPacket p = new DatagramPacket(
message.getBytes(), message.getBytes().length, serverAddress, port);
Log.d(TAG, "udp client send: " + message + " to serverAddress " + serverAddress);
this.udpSocket.send(p);
}
public void connect() {
Log.d(TAG, "UDP connection to port " + port);
}
}
这是我的简单 UDP 服务器:
public class MyUDPServer {
private String TAG = "MyUDPServer";
private int port;
private DatagramSocket udpSocket;
OnMessageCallback onMessageCallback;
public MyUDPServer(int port) throws SocketException {
this.udpSocket = new DatagramSocket(port);
this.port = port;
}
public interface OnMessageCallback {
public void on(String message);
}
private void listen() throws Exception {
Log.d(TAG, "listening UDP server on port " + port);
String msg;
while (true) {
byte[] buf = new byte[256];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
// blocks until a packet is received
udpSocket.receive(packet);
msg = new String(packet.getData()).trim();
Log.d(TAG, "message received; " + msg);
onMessageCallback.on(msg);
}
}
public void start() throws Exception {
listen();
}
public void setMessageCallback(OnMessageCallback onMessageCallback) {
this.onMessageCallback = onMessageCallback;
}
}
问题是服务器从未收到任何消息。我这样启动客户端:
MyUDPClient myUDPClient = new MyUDPClient("192.168.1.6", 8887);
因为它在模拟器上,我尝试过滤 IP 192.168.1.6
,即使我调用 myUDPClient.send("message")
,在 WireShark 上我什么也没有收到,这表明消息甚至没有离开计算机模拟器在哪里。
我做错了什么?
我在 Android 上创建了一个 WebSocket client/server,它运行良好。
我有这两个权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
在您的 MyUDPClient-class 中只需更改即可避免导致异常的“双重”绑定:
public MyUDPClient(String destinationAddr, int port) throws SocketException, UnknownHostException {
super();
this.serverAddress = InetAddress.getByName(destinationAddr);
this.port = port;
udpSocket = new DatagramSocket(this.port);
scanner = new Scanner(System.in);
}
至
public MyUDPClient(String destinationAddr, int port) throws SocketException, UnknownHostException {
super();
this.serverAddress = InetAddress.getByName(destinationAddr);
this.port = port;
udpSocket = new DatagramSocket();
//udpSocket = new DatagramSocket(this.port);
scanner = new Scanner(System.in);
}
问题是我正在获取 NetworkOnMainThreadException
但它被记录到我没有过滤的 logcat 的另一部分。
从单独的线程执行 myudpClient.send("myMessage")
解决了问题。这就是为什么我什至看不到 Wireshark 上的输出,它甚至没有发送。