我需要从服务器应用程序收到第二个回复。当我第一次连接到服务器应用程序时,我收到了回复。但是当我尝试发送另一条消息时,我无法收到它。
我尝试过寻找解决方案但我找不到任何东西。我相信问题是我的读者指针仍然在最后。这就是我无法阅读下一个回复的原因。这是我的代码:
public static void XConn()
{
TcpClient client = new TcpClient();
client.Connect("xxx.xxx.xxx.xxx",xx); // i cant show the IP sorry
Stream s = client.GetStream();
StreamReader sr = new StreamReader(s);
StreamWriter sw = new StreamWriter(s);
String r = "";
sw.AutoFlush = true;
sw.WriteLine("CONNECT\nlogin:xxxxxxx \npasscode:xxxxxxx \n\n" + Convert.ToChar(0)); // cant show also
while(sr.Peek() >= 0)
{
r = sr.ReadLine();
Console.WriteLine(r);
Debug.WriteLine(r);
if (r.ToString() == "")
break;
}
sr.DiscardBufferedData();
//get data needed, sendMsg is a string containing the message i want to send
GetmsgType("1");
sw.WriteLine(sendMsg);
// here i try to receive again the 2nd message but it fails =(
while(sr.Peek() >= 0)
{
r = sr.ReadLine();
Console.WriteLine(r);
Debug.WriteLine(r);
if (r.ToString() == "")
break;
}
s.Close();
Console.WriteLine("ok");
}
答案 0 :(得分:0)
TcpClient.GetStream()
返回NetworkStream
,它不支持搜索,因此您无法更改读取器指针,只要连接打开,它就不会真正结束。这意味着当响应之间服务器出现延迟时,StreamReader.Peek()
方法可能会返回误导性-1
。
获得响应的一种可靠方法是设置读取超时并保持循环直到抛出异常,您可以捕获并继续执行。该流仍然可用于发送另一条消息。
s.ReadTimeout = 1000;
try
{
sw.WriteLine(sendMsg);
while(true)
{
r = sr.ReadLine();
Console.WriteLine(r);
}
sr.DiscardBufferedData();
}
catch(IOException)
{
//Timed out—probably no more to read
}
<小时/> 更新:以下内容也可以使用,在这种情况下,您不必担心设置超时或捕获异常:
while(true)
{
r = sr.ReadLine();
Console.WriteLine(r);
if (sr.Peek() < 0) break;
}