【问题标题】:Receive on UDP socket and send reply在 UDP 套接字上接收并发送回复
【发布时间】:2014-07-04 20:54:59
【问题描述】:

我正在开发一个客户端/服务器项目,客户端是 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 声明目标地址为空时,它会引发异常。

【问题讨论】:

  • 旁注我认为您对“服务器”的定义是根据设备的大小来定义的……通常侦听传入请求的人(“Android 应用程序侦听 UDP 套接字”)称为“服务器”。 ..
  • 我将 C# 称为服务器,因为它是做大部分工作的服务器,通常不是它进行监听,但是,对于项目的这一部分,我需要 android 来监听跨度>

标签: android sockets


【解决方案1】:

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

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

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

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

【讨论】:

  • 最简单的方法是重用接收到的DatagramPacket,它已经有了源地址,只需更改数据并发送即可。
猜你喜欢
  • 2015-02-21
  • 2021-06-13
  • 1970-01-01
  • 2013-01-17
  • 2010-11-13
  • 2013-11-19
  • 1970-01-01
  • 2013-08-28
相关资源
最近更新 更多