此流不支持超时

时间:2016-07-12 19:07:06

标签: c# windows uwp

有人可以解释我为什么会收到此流不支持超时。错误。

如果我像这样使用我的代码就好了。我的套接字连接到服务器adn retreives信息。 (这种方法就像是虚拟的,因为连接发生在一台服务器上并且在一切开始时)

 private async Task Update()
    {
        while (true)
        {
            server = Ips.First();
            if (server.Map != sq.map || server.Name != sq.name || server.Players != sq.players)
            {
                return;
            }
        }
   }

在真正的应用程序中,我需要查询很多服务器。所以我尝试这样的事情(因为我是菜鸟,不能找出更好的方法)

foreach (var server in Ips)
            {
                sq.Connect(new Windows.Networking.HostName(server.Ip), server.Port);

                if (server.Map != sq.map || server.Name != sq.name || server.Players != sq.players)
                {
                    return;
                }
            }

这就是我得到的地方此流错误不支持超时。有人可以解释原因并且可能告诉我我应该在哪里查看吗?

我的错误出现在此方法的第一行: (Stream streamIn = args.GetDataStream()。AsStreamForRead();)

        private async void Socket_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
    {

        Stream streamIn = args.GetDataStream().AsStreamForRead();
        StreamReader reader = new StreamReader(streamIn);
        string message = await reader.ReadToEndAsync();
        byte[] packet = System.Text.Encoding.ASCII.GetBytes(message);
        Parser parser = new Parser(packet);

1 个答案:

答案 0 :(得分:1)

  

但为什么第一种方法有效?

您的第一个代码块和第二个代码块之间的主要区别是sq.Connect(new Windows.Networking.HostName(server.Ip), server.Port);,根据您的代码,有可能

  • 您只能连接到Ips.First(),代码会“返回”以跳出“foreach”。

  • 建立两个(或更多)连接,直到代码运行“返回”。

我不知道你的sq是什么,DatagramSocket class中没有Connect(hostname, serverport)方法,只有一个类似的方法,但只有一个方法:DatagramSocket.ConnectAsync(HostName, String) | connectAsync(HostName, String) method

映射到我列出的两种可能性:

  • 如果“foreach”中的代码只运行一次(意味着Ips.First()已连接),那么两个代码块之间的区别就是你在第二个代码中建立了连接,这可能是一个原因。

  • 对于第二种可能性,我假设您实际使用ConnectAsync方法,然后sqc sq = new DatagramSocket();,并使用一个{{1}连接到多个服务器}}。但DatagramSocket方法用于与单个远程端点进行通信,因此我认为这也可能是此原因。

  

在实际应用中,我需要查询很多服务器。

我认为对于您的方案,最好不使用连接,您可以将ConnectAsync绑定到本地端口,并将DatagramSocket对象加入多播组。你可以参考官方DatagramSocket sample,方案5是用于多播和广播,你可以看看。

如果您有任何问题,请发表评论。