0

我的任务是创建一个服务器应用程序,该应用程序检查服务器上是否存在任何文件(必须由客户端发送该名称)以及是否存在以返回响应(消息 - “此文件存在。”)。我有这个问题。服务器正在做正确的事情,但是当我尝试使用 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();
        }
    }

请问你能帮帮我吗?

4

3 回答 3

0

我希望流没有提供完全二进制对象图,因此BinaryReader正在尝试反序列化部分对象。

于 2011-01-28T16:48:40.317 回答
0

TCP是面向流的协议,而不是面向消息的协议。这意味着保证一切都以正确的顺序到达,而不是全部或什么都没有收到。但是,这并不意味着所有内容都会以相同的读数到达。

在您尝试阅读之前,您需要确保所有内容都已正确接收。

在 NetworkStream 上谷歌一些,看看其他人如何在服务器应用程序中使用它。您通常发送标头而不是数据。

于 2011-01-28T17:33:45.587 回答
0

读取字符串后,您检测到该消息 != null ,因此循环再次运行。但是服务器没有向流中写入任何其他内容,因此当您尝试读取下一个字符串时,没有什么可读取的。每个 ReadString 首先读取字符串长度,然后读取字符串数据(请参阅http://msdn.microsoft.com/en-us/library/system.io.binaryreader.readstring.aspx)。服务器甚至还没有提供可供读取的字符串长度,因此您会收到错误消息。我认为这就是正在发生的事情。您需要一些指示流有多长或何时到达终点。

于 2011-01-28T18:24:39.930 回答