0
我想在c#程序中接收udp包。几个软件包组合的内容是一个XML状态日志。在一个状态记录完成后重复。见下图。我使用this UDP Broadcast example来获取包,端口53181(见图片)。 但该程序没有收到任何东西。有任何想法吗?我如何使用收到的包来获取XML数据?c#接收带有xml内容的udp广播包(windows 7)
我想在c#程序中接收udp包。几个软件包组合的内容是一个XML状态日志。在一个状态记录完成后重复。见下图。我使用this UDP Broadcast example来获取包,端口53181(见图片)。 但该程序没有收到任何东西。有任何想法吗?我如何使用收到的包来获取XML数据?c#接收带有xml内容的udp广播包(windows 7)
这是一个通用接收器I类制成
public class UdpBroadcastReceiver
{
private IBroadcastInterpreter _interpreter;
private volatile bool _shouldReceive = true;
/// <summary>
/// Will listen on all ports for udp broadcasts - Will handle input with interpreter
/// </summary>
/// <param name="interpreter"></param>
public UdpBroadcastReceiver(IBroadcastInterpreter interpreter)
{
_interpreter = interpreter;
}
/// <summary>
/// Will listen for a broadcast indefinetly. Will lock up your program.
/// Use Task.Run to start listening. Then you can use StopListening to break the loop.
/// </summary>
public void ListenForBroadcast(int port)
{
using (UdpClient client = new UdpClient(port))
{
IPEndPoint senderEndPoint = new IPEndPoint(IPAddress.Any, 0);
while (_shouldReceive)
{
byte[] receiveBuffer = client.Receive(ref senderEndPoint); // execution will stop and wait for data.
_interpreter?.HandleBroadcast(receiveBuffer);
}
}
}
/// <summary>
/// Breaks the while loop in ListenForBroadcast
/// </summary>
public void StopListening()
{
_shouldReceive = false;
}
}
public interface IBroadcastInterpreter
{
void HandleBroadcast(byte[] input);
}
的示例实现可以是接口:
class WriteToConsole : IBroadcastInterpreter
{
public void HandleBroadcast(byte[] input)
{
string text = Encoding.ASCII.GetString(input);
Console.WriteLine(text);
}
}
这是我制作的UDP广播器,用于播出时间。
class UdpBroadcaster
{
private int _port;
private bool shouldRun = true;
public UdpBroadcaster(int port)
{
_port = port;
}
public void Stop()
{
shouldRun = false;
}
public void Start()
{
Trace.TraceInformation("Entered start method");
Task.Run(() =>
{
Trace.TraceInformation("Started task");
IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Broadcast, _port);
using (UdpClient client = new UdpClient())
{
Trace.TraceInformation("Entered using statement");
client.EnableBroadcast = true;
while(shouldRun)
{
Trace.TraceInformation("Started while loop");
byte[] data = Encoding.ASCII.GetBytes(DateTime.Now.ToString(new CultureInfo("da-dk")));
client.Send(data, data.Length, serverEndPoint);
Trace.TraceInformation("waiting 5 seconds");
Thread.Sleep(5 * 1000);
}
}
});
}
}
创建一个WriteToConsole类的实例,并将其传递到广播接收器的构造函数中。然后,无论何时收到广播,它都将使用接口的实现来执行操作。在这种情况下,根据您的请求 - 它只会写入控制台。
我的答案解决了你的问题吗?如果是这样,请将其标记为答案。如果不。详细说明你需要什么。 –
对不起,但我没有时间测试你的代码。谢谢btw。我希望我能在下周进行测试。 – jazz
恩,我对c#编程相当陌生。使用界面的原因是什么?是否可以通过将命令行打印接收数据的方式完成示例?这将帮助我了解如何处理您的代码。谢谢 – jazz