1

サーバーが送り返しているのと同じデータをソケットクライアントが受信していないことに気づきました。テキストは8192文字の後に切り取られます。

気づいていない制限はありますか?どうすればこれを乗り越えることができますか?

クライアントは次のコードを使用します。

//Send and Receive
public string sendAndReceiveMSG(string msg)
{
    try
    {
        NetworkStream serverStream = clientSocket.GetStream();
        string sendresponse = sendMSG(msg, serverStream);
        if (sendresponse == "ConnectionCrash")
        {
            return sendresponse;
        }
        else if (sendresponse == "OK")
        {
            string receiveresponse = receiveMSG(serverStream);
            return receiveresponse;
        }
        return "UnknownErrorInternal";
    }
    catch (Exception ex)
    {
        return "UnknownErrorInternal";
    }
}

//Send msg
private string sendMSG(string msg, NetworkStream serverStream)
{
    try
    {
        byte[] outStream = System.Text.Encoding.ASCII.GetBytes(msg);
        serverStream.Write(outStream, 0, outStream.Length);
        serverStream.Flush();
        return "OK";
    }
    catch (Exception ex)
    {
        endSock();
        return "ConnectionCrash";
    }
}

//Receive msg
private string receiveMSG(NetworkStream serverStream)
{
    try
    {
        byte[] inStream = new byte[10025];

        int buffSize = clientSocket.ReceiveBufferSize;
        dynamic bytesRead = serverStream.Read(inStream, 0, buffSize);

        string returndata = System.Text.Encoding.ASCII.GetString(inStream, 0, bytesRead);
        return returndata;
    }
    catch (Exception ex)
    {
        endSock();
        return "ConnectionCrash";
    }
}

次に、クライアントはサーバーからそのように応答を受け取ります。

string recv = client.sendAndReceiveMSG("someRequest");
4

1 に答える 1

5

への呼び出しを1つだけ処理しましたRead。この動作は完全に予想されます。すべてのデータを1つのパケットで取得することはめったにありません(率直に言って、すぐに気付かなかったことに驚いています)。

「フレーミング」ポリシー(つまり、各サブメッセージをどのように区別するか(テキストベースの場合は新しい行、バイナリの場合は長さプレフィックス))を決定し、処理する前にフレームに相当するデータを取得する必要があります。これは通常Read、ループで呼び出すこと、または(テキストの場合)StreamReaderそれを処理するようなものを使用して(つまりReadLine()、ループで呼び出す)ことを意味します。

ソケットにメッセージが1つしかなく、発信者が接続を閉じた場合は、フレーミングを省略して、Readポジティブでないもの(つまり、EOF)が返されるまで読み取ることができます。

于 2012-05-07T18:44:24.407 に答える