接收UDP套接字并发送回复

时间:2014-07-04 20:55:00

标签: android sockets

我正在开发一个客户端/服务器项目,客户端是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());
        }

当我执行socket.send时,它会抛出异常,表明目标地址为null。

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

您必须在发送之前在DatagramPacket中设置目标地址。

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

在UDP协议中,由于没有连接(如TCP),因此在数据包中设置了目标 所以在你的代码中,你告诉socket,它没有目的地的概念来发送没有目的地的数据包,所以它会抛出异常。

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