有人可以解释我为什么会收到此流不支持超时。错误。
如果我像这样使用我的代码就好了。我的套接字连接到服务器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);
答案 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
方法,然后sq
为c sq = new DatagramSocket();
,并使用一个{{1}连接到多个服务器}}。但DatagramSocket
方法用于与单个远程端点进行通信,因此我认为这也可能是此原因。
在实际应用中,我需要查询很多服务器。
我认为对于您的方案,最好不使用连接,您可以将ConnectAsync
绑定到本地端口,并将DatagramSocket
对象加入多播组。你可以参考官方DatagramSocket sample,方案5是用于多播和广播,你可以看看。
如果您有任何问题,请发表评论。