Android上非常简单的UDP服务器/客户端无法正常工作

时间:2020-11-04 22:23:08

标签: java android networking udp

我正在尝试在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客户端/服务器,并且运行良好。

我拥有以下2个权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

2 个答案:

答案 0 :(得分:0)

在您的MyUDPClient类中,只需进行更改即可避免引起异常的“双重”绑定:

'<U100'

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);
}

答案 1 :(得分:0)

问题是我在NetworkOnMainThreadException的注视下,但是它正在被记录到我未过滤的logcat的另一部分。

从单独的线程执行myudpClient.send("myMessage")解决了该问题。这就是为什么我什至看不到Wireshark的输出,甚至都没有发送的原因。