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

文字列を読み取った後、そのメッセージ!= nullを検出したため、ループが再度実行されます。ただし、サーバーはストリームに他に何も書き込んでいないため、次の文字列を読み取ろうとしても、読み取るものはありません。すべてのReadStringは、最初に文字列の長さを読み取り、次に文字列データを読み取ります(http://msdn.microsoft.com/en-us/library/system.io.binaryreader.readstring.aspxを参照)。サーバーは文字列の長さを読み取れるようにしていないため、エラーが発生します。それが起こっていると思います。ストリームの長さ、または終了に達したときのインジケーターが必要です。

于 2011-01-28T18:24:39.930 に答える
0

TCP はメッセージ指向のプロトコルではなく、ストリーム指向のプロトコルです。これは、すべてが正しい順序で到着することが保証され、すべてまたはまったく受信されないことを意味します。ただし、すべてが同じ読み取りで到着するという意味ではありません。

読もうとする前に、すべてが正しく受信されていることを確認するのはあなた次第です。

NetworkStream を Google で検索して、他のユーザーがサーバー アプリケーションでどのように使用しているかを確認してください。通常、データよりもヘッダーを送信します。

于 2011-01-28T17:33:45.587 に答える
0

ストリームが完全なバイナリ オブジェクト グラフを提供していないためBinaryReader、部分的なオブジェクトを逆シリアル化しようとしていると思われます。

于 2011-01-28T16:48:40.317 に答える