我需要连接一个服务器(使用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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
循环正在继续,等待数据.这里的问题似乎只是ReadLine()一个阻塞调用.你提到可能还没有消息; 好吧,ReadLine()将阻止,直到满足两个条件之一:
null所以基本上,ReadLine()要等到消息进来或套接字关闭.这只是行为ReadLine().如果这有问题,你可以更接近套接字,并检查NetworkStream.DataAvailable 但是:请注意,它只会告诉你当前是否有一些数据可用; 但这并不意味着"这是一个完整的信息",也不能用来判断是否更多的消息将到达.主要用途DataAvailable是决定同步和异步访问.另外,如果您靠近套接字工作,则必须进行所有自己的缓冲和编码/解码.
它看起来像是ReadLine()成功的工作.我在这里唯一要做的就是重新说一下:
string line;
while((line = reader.ReadLine()) != null) {
// line is meaningful; do something
}
Run Code Online (Sandbox Code Playgroud)
最后一个想法:xml并不总是简单地在"每行"的基础上简单地分成消息.您可能想要考虑其他形式的框架,但这可能意味着更接近套接字,而不是一个StreamReader.