在Metro-Apps中接收UDP消息的问题

时间:2014-09-24 15:47:43

标签: c# windows-8 windows-runtime udp microsoft-metro

我目前正在开发一个项目,其中一个特色设备是Windows平板电脑。到"连接"它在项目环境中的其他设备(如某些Raspberry Pi)用于发送消息。 Windows平板电脑旨在成为具有soem touch功能的控制设备。因此,我正在编写一个应用程序(该应用程序的目的不是将其放入Windows应用商店)。这项工作中的UDP部分非常痛苦,因为自从我开始没有App编程经验以来,我不得不做很多研究。比编程更痛苦的是,我几乎完成了工作只是重新开始,因为App不再接收UDP。

这是我的代码(我删除了与实际问题无关的元素)。我为糟糕的编码道歉......

App.xaml.cs:

sealed partial class App : Application
{
    NetworkInterface ni = new NetworkInterface();

    public App()
    {
        this.InitializeComponent();
        this.Suspending += OnSuspending;

        ni.MessageReceived += OnMessageReceived;

        ni.Connect(new HostName("127.0.0.1"), "5556");

    }

    private void OnMessageReceived(object sender, MessageReceivedEventArgs e)
    {
        Debug.WriteLine("Processing");
        Debug.WriteLine(e.Message.Data);

    }

    public static new App Current
    {
        get { return Application.Current as App; }
    }

    private DatagramSocket _socket;

    protected override void OnLaunched(LaunchActivatedEventArgs e)
    {
        Update_Timer();
    }
    DispatcherTimer timer = new DispatcherTimer();
    private void Update_Timer()
    {
        timer.Start();
        timer.Interval = new TimeSpan(0,0,0,0,500);
        timer.Tick += alive;
    }

    private void alive(object sender, object e)
    {
        if (start == 0) {
            Debug.WriteLine("App-Startup");
            ni.SendMessage("Startup...");
            start++;
        }
        else
        {
            Debug.WriteLine("App-Alive");
            ni.SendMessage("alive");
            start++;
        }

    }    
}

这部分代码是在整个App中的背景中发送和接收消息。

和NetworkInterface类:

    class NetworkInterface
{
    private DatagramSocket _socket;

    public bool IsConnected { get; set; }

    public NetworkInterface()
    {
        IsConnected = false;
        _socket = new DatagramSocket();
        _socket.MessageReceived += OnSocketMessageReceived;
    }

    public async void Connect(HostName remoteHostName, string remoteServiceNameOrPort)
    {
        if (IsConnected != true)
        {
            await _socket.BindServiceNameAsync("5321");
            await _socket.ConnectAsync(remoteHostName, remoteServiceNameOrPort);
        }
        IsConnected = true;
    }

    public void alive(object sender, object e)
    {
        Debug.WriteLine("alive");
    }


    public event EventHandler<MessageReceivedEventArgs> MessageReceived;

    private void OnSocketMessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
    {
        var reader = args.GetDataReader();
        var count = reader.UnconsumedBufferLength;
        var data = reader.ReadString(count);
        Debug.WriteLine(args);
        if (MessageReceived != null)
        {
            var ea = new MessageReceivedEventArgs();
            ea.Message = new Message() { Data = data };
            ea.RemoteHostName = args.RemoteAddress;
            ea.RemotePort = args.RemotePort;
            MessageReceived(this, ea);
        }
    }

    DataWriter _writer = null;
    public async void SendMessage(string message)
    {
        if (_writer == null)
        {
            var stream = _socket.OutputStream;
            _writer = new DataWriter(stream);
        }

        _writer.WriteString(message);
        await _writer.StoreAsync();
    }

}

主要问题是:

  1. 如果我在收到之前没有发送内容,我就无法收到消息。
  2. 如果我在此行发出随机故障之前发送:

    var reader = args.GetDataReader();
    
  3. 如果没有任何失败,我无法从本地Python脚本(可以工作)接收消息,但我可以从应用程序接收的本地程序发送消息。

  4. 有谁知道如何解决这些问题?

    提前致谢!

0 个答案:

没有答案