我需要连接一个服务器(带有ip和port)并创建一个读取循环,它将从服务器以XML格式获取消息。有时没有来自服务器的消息。
我尝试创建连接(工作正常)并阅读消息,我从服务器获取第一条消息,当我尝试读取另一条消息时 - 它会卡住。我想也许现在可能没有消息,但我需要循环才会继续,直到有消息......它甚至不会“捕获”或“终于”,只是什么都不做..
public class Connection
{
public Connection()
{
Socket server = null;
try
{
string p = string.Empty;
using (var client = new TcpClient(myIPAddress, myPort))
using (var stream = client.GetStream())
using (var reader = new StreamReader(stream))
{
while (p != null)
{
try
{
p = reader.ReadLine();
}
catch (Exception e)
{
//
}
}
}
}
catch (Exception e)
{
//
}
finally {
server.Close();
}
}
}
答案 0 :(得分:5)
循环 继续,等待数据。这里的问题似乎只是ReadLine()
是阻塞调用。你提到可能还没有消息;好吧,ReadLine()
将阻止,直到满足以下两个条件之一:
null
基本上,ReadLine()
将等待消息进入或套接字关闭。这只是ReadLine()
的行为。如果这有问题,您可以更接近套接字,并检查NetworkStream.DataAvailable
但:请注意,这只会告诉您某些数据当前是否可用;它并不意味着“这是一个完整的消息”,也不能用于判断将更多消息到达。 DataAvailable
的主要用途是决定同步和异步访问。另外,如果您在插座附近工作,则必须进行所有自己的缓冲和编码/解码。
我认为ReadLine()
正在成功运作。我在这里唯一要做的就是重新说一下:
string line;
while((line = reader.ReadLine()) != null) {
// line is meaningful; do something
}
最后一个想法:xml并不总是简单地在“每行”的基础上简单地拆分成消息。您可能想要考虑其他形式的框架,但这可能意味着更接近套接字,而不是StreamReader
。
答案 1 :(得分:-2)
你必须等到数据到达流,你可以尝试使用follwing,
if(reader.EndOfStream)
continue;