在UDP套接字上接收并发送应答



我正在做一个客户端/服务器项目,客户端是Android,服务器是c#。

我要做的是Android应用程序监听UDP套接字,c#服务器在该端口上发送消息。Android将从回复中接收消息,并返回一个响应。

这是我的代码:

public void run()
    {
        Log.d(TAG, "Heartbeat manager thread starting");
        try
        {
            android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
            DatagramSocket socket = new DatagramSocket(HEARTBEAT_PORT);
            byte[] buffer = new byte[1024];
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
            while (!cancelThread)
            {
                socket.receive(packet);
                final String xml = new String(packet.getData(), 0, packet.getLength());
                Log.v(TAG, xml);
                XmlSettings xmlSettings = new XmlSettings();
                xmlSettings.setIndent(true);
                XmlWriter writer = new XmlWriter(xmlSettings);
                writer.writeStartDocument();
                writer.writeStartElement("HeartbeatManager");
                writer.writeElementString("Command", Defines.ServerCommands.HeartbeatResponse.toString());
                writer.writeEndElement();
                buffer = writer.returnXmlOutput().getBytes();
                DatagramPacket replyPacket = new DatagramPacket(buffer, buffer.length);
                socket.send(replyPacket);
            }
        }
        catch (SocketException ex)
        {
            Log.e(TAG, "Socket Exception Occurred: " + ex.toString());
        }
        catch (IOException ex)
        {
            Log.e(TAG, "IOException Occurred: " + ex.toString());
        }

当我执行套接字时,它抛出了一个异常。发送声明目的地址为空

发送前必须在DatagramPacket中设置目的地址。

你正在使用的构造函数(没有地址)只是用于接收,而不是用于发送。

在UDP协议中,因为没有连接(如TCP),所以在数据包中设置了目的地。所以在你的代码中,你告诉套接字,它没有目的地的概念,发送一个没有目的地的数据包,所以它会抛出一个异常。

InetSocketAddress address = InetSocketAddress("www.google.com", 8080);
DatagramPacket replyPacket = new DatagramPacket(buffer, buffer.length, address); 
socket.send(replyPacket);

最新更新