我有一个服务器应用程序的任务,它检查服务器上是否有任何文件(必须由客户端发送的名称),以及是否存在以回复响应(消息 - “此文件存在。 “)。我有这个问题。服务器正在做正确的事情,但是当我尝试使用我的BinaryReader读取响应时它会让我回到这个例外:
Unable to read beyond the end of the stream
以下是客户端的一些代码:
private void OnRequest()
{
try
{
IPEndPoint serverIp = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 55555);
TcpClient client = new TcpClient();
client.Connect(serverIp);
if (client.Connected)
{
AddLog("Connected!");
writer = new BinaryWriter(client.GetStream());
writer.Write("request");
GetFileText();
writer.Write(fileText);
writer.Flush();
AddServerResponse(GetResponse(client.Client));
writer.Close();
client.Close();
AddLog("Disconnected!");
}
}
catch (Exception e)
{
MessageBox.Show(e.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
这就是GetResponse方法:
private string GetResponse(Socket server)
{
NetworkStream stream = new NetworkStream(server);
reader = new BinaryReader(stream);
string message;
do
{
message = reader.ReadString();
}
while (message != null);
reader.Close();
return message;
}
这是我如何向客户发送数据:
private void SendDataToClient(string data, Socket client)
{
if (client != null && client.Connected)
{
NetworkStream stream = new NetworkStream(client);
BinaryWriter writer = new BinaryWriter(stream);
writer.Write(data);
writer.Flush();
writer.Close();
stream.Close();
}
}
请问你能帮帮我吗?
答案 0 :(得分:0)
我希望流没有提供完整的二进制对象图,因此BinaryReader
正在尝试反序列化部分对象。
答案 1 :(得分:0)
TCP是面向流的协议,而不是面向消息的协议。这意味着保证一切都以正确的顺序到达,而不是收到全部或全部。但是,这并不意味着一切都会以相同的读数到达。
在您尝试阅读之前,请确保已正确接收所有内容。
Google上的一些关于NetworkStream的内容,看看其他人如何在服务器应用程序中使用它。您通常会发送标题而不是数据。
答案 2 :(得分:0)
读取字符串后,您会检测到该消息!= null,因此循环再次运行。但是服务器没有向流写入任何其他内容,因此当您尝试读取下一个字符串时,没有什么可读的。每个ReadString首先读取字符串长度,然后读取字符串数据(参见http://msdn.microsoft.com/en-us/library/system.io.binaryreader.readstring.aspx)。服务器甚至没有可读取的字符串长度,因此您会收到错误。我认为这就是发生的事情。您需要一些指示流的长度或到达终点的时间。