【发布时间】:2014-07-29 08:31:54
【问题描述】:
我的 c# 应用程序中有一些套接字通信。客户端向服务器发送请求(一个 XML 字符串),服务器以另一个 XML 字符串作为响应。
以下是客户端运行的代码:
using (TcpClient client = new TcpClient(socket.HostName, socket.Port))
{
client.SendBufferSize = int.MaxValue;
client.ReceiveBufferSize = int.MaxValue;
Stream stream = client.GetStream();
StreamReader sr = new StreamReader(stream);
StreamWriter sw = new StreamWriter(stream);
sw.AutoFlush = true;
sw.WriteLine(requests.ToXML());
List<string> xmlStrings = new List<string>();
while (sr.Peek() > -1)
xmlStrings.Add(sr.ReadLine());
string xmlStr = string.Join("\r\n", xmlStrings.ToArray());
ProcessXMLResponse(xmlStr);
stream.Close();
client.Close();
}
这在服务器机器上运行:
using (Stream stream = new NetworkStream(socket))
using (StreamReader sr = new StreamReader(stream))
using (StreamWriter sw = new StreamWriter(stream))
{
sw.AutoFlush = true;
List<string> xmlStrings = new List<string>();
while (sr.Peek() > -1)
xmlStrings.Add(sr.ReadLine());
string xmlStr = string.Join("\r\n", xmlStrings.ToArray());
XmlDocument xml = new XmlDocument();
xml.LoadXml(xmlStr);
string responseXML = ProcessXMLRequest(xml);
sw.WriteLine(response);
socket.Shutdown(SocketShutdown.Both);
stream.Close();
}
这段代码似乎大部分时间都可以工作,但有时(也许当 XML 响应很大时?),客户端似乎只接收到 XML 回复的第一部分。 sr.Peek() 调用返回 -1,即使数据尚未全部接收。
知道可能是什么问题吗?
【问题讨论】:
-
可能是因为数据还没有完全发送/接收。尝试提前发送长度,等到socket.Available == length。