【问题标题】:c# receive udp broadcast packets with xml content (windows 7)c#接收带有xml内容的udp广播包(windows 7)
【发布时间】:2016-09-21 10:04:40
【问题描述】:

我想在 C# 程序中接收 udp 包。几个包的内容组合起来,就是一个 XML 状态日志。在一个状态日志完成后重复。见下图。我正在使用this UDP Broadcast example 获取包,端口为 53181(见图)。 但该程序没有收到任何东西。有任何想法吗?如何使用收到的包来获取 XML 数据?

【问题讨论】:

  • 我的回答解决了你的问题吗?如果有,请将其标记为答案。如果不。详细说明您需要什么。
  • 抱歉,我没有时间测试您的代码。谢谢顺便说一句。我希望我能在下周进行测试。
  • 嗯,我对 c# 编程还很陌生。使用接口的原因是什么?您是否可以通过将接收到的数据打印到命令行的方式完成示例?这将帮助我了解如何处理您的代码。谢谢
  • 接口的目的是为了实现复用。然后,您可以在重用时将接收器放在 dll 文件中。然后创建一个从接口继承的新类,并将该对象的实例传递给接收器的构造函数。

标签: c# xml sockets udp


【解决方案1】:

这是我在课堂上制作的通用接收器

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 类的实例,并将其传递给广播接收器的构造函数。然后任何时候收到广播,它都会使用接口的实现来做一个动作。在这种情况下,根据您的要求 - 它只会写入控制台。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 2011-03-02
    相关资源
    最近更新 更多