此流不支持超时
本文关键字:超时 不支持 | 更新日期: 2023-09-27 17:56:32
有人可以解释为什么我得到 此流不支持超时。 错误。
如果我像这样使用我的代码,一切都很好。我的套接字连接到服务器并检索信息。(这种方法就像虚拟的,因为连接发生在一台服务器上,并且在一切开始时)
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;
}
}
这就是我得到此流错误不支持超时的地方。有人可以解释为什么,也许告诉我我也应该在哪里看吗?
我的错误出现在此方法的第一行:(流流 = 参数。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);
但是为什么第一种方法有效?
您的第一个代码块和第二个代码块之间的主要区别是 sq.Connect(new Windows.Networking.HostName(server.Ip), server.Port);
,根据您的代码,有可能
-
你只连接到
Ips.First()
,代码运行到"返回"跳出"foreach"。 -
您建立两个(或更多)连接,直到代码运行以"返回"。
我不知道你的sq
是什么,DatagramSocket类中没有Connect(hostname, serverport)
方法,只有一个类似的方法,但有一个aysnc:DatagramSocket.ConnectAsync(HostName,String)| connectAsync(HostName,String)方法。
映射到我列出的两种可能性:
-
如果"foreach"中的代码只运行一次(表示
Ips.First()
连接),那么两个代码块之间的区别在于您在第二个代码中建立了连接,这可能是一个原因。 -
对于第二种可能性,我假设您实际上正在使用
ConnectAsync
方法,然后sq
c sq = new DatagramSocket();
,并且它使用一个DatagramSocket
连接到多个服务器。但是ConnectAsync
方法是与单个远程端点进行通信,因此我认为这也可能是这里的原因。
在实际应用程序中,我需要查询很多服务器。
我认为对于您的方案,最好不要使用连接,您可以将DatagramSocket
绑定到本地端口,并将DatagramSocket
对象加入多播组。可以参考官方的DatagramSocket示例,场景5是针对组播和广播的,可以看看。
如果您在这里有任何问题,请发表评论。