我正在开发一个客户端/服务器项目,客户端是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。
感谢您提供的任何帮助。
答案 0 :(得分:1)
您必须在发送之前在DatagramPacket中设置目标地址。
您正在使用的构造函数(没有地址)仅用于接收,而不是用于发送。
在UDP协议中,由于没有连接(如TCP),因此在数据包中设置了目标 所以在你的代码中,你告诉socket,它没有目的地的概念来发送没有目的地的数据包,所以它会抛出异常。
InetSocketAddress address = InetSocketAddress("www.google.com", 8080);
DatagramPacket replyPacket = new DatagramPacket(buffer, buffer.length, address);
socket.send(replyPacket);