C# TCP客户机。我如何接收大消息?

C# TCP客户机。我如何接收大消息?,c#,.net,tcp,tcpclient,C#,.net,Tcp,Tcpclient,我有以下代码: private string Connect() { string responseData; try { TcpClient client = new TcpClient(ServerIp, Port); client.ReceiveBufferSize = Int32.MaxValue; Byte[] data = Encoding.GetEncoding(1251).GetBytes(ReadyQu

我有以下代码:

private string Connect()
{
    string responseData;

    try
    {
        TcpClient client = new TcpClient(ServerIp, Port);
        client.ReceiveBufferSize = Int32.MaxValue;

        Byte[] data = Encoding.GetEncoding(1251).GetBytes(ReadyQuery);


        NetworkStream stream = client.GetStream();

        // send data
        stream.Write(data, 0, data.Length);


        // buffer
        data = new Byte[65536];               

        Int32 bytes = stream.Read(data, 0, data.Length);
        responseData = Encoding.GetEncoding(1251).GetString(data, 0, bytes);                

        // close all
        stream.Close();
        client.Close();
        return responseData;
    }
我对一条重要信息有意见。接收消息大小为22K个字符。我只收到部分信息。
我怎样才能收到大消息


PS.在调试器
字节中
相等
4096
调用流。在循环中读取,直到读取整个消息。如果您提前知道消息大小,则相对容易:

int messageSize = 22000;
int readSoFar = 0;
byte [] msg = new byte[messageSize];

while(readSoFar < messageSize)
{
    var read = stream.Read(msg, readSoFar, msg.Length - readSoFar);
    readSoFar += read;
    if(read==0)
        break;   // connection was broken
}
int messageSize=22000;
int readSoFar=0;
字节[]消息=新字节[messageSize];
while(readSoFar

如果消息大小是消息的一部分(例如,编码在前4个字节中),则应先读取这些大小,然后按照我的建议执行操作。

调用流。在循环中读取,直到读取整个消息为止。如果您提前知道消息大小,则相对容易:

int messageSize = 22000;
int readSoFar = 0;
byte [] msg = new byte[messageSize];

while(readSoFar < messageSize)
{
    var read = stream.Read(msg, readSoFar, msg.Length - readSoFar);
    readSoFar += read;
    if(read==0)
        break;   // connection was broken
}
int messageSize=22000;
int readSoFar=0;
字节[]消息=新字节[messageSize];
while(readSoFar

如果消息大小是消息的一部分(例如,在前4个字节中编码),您应该先阅读这些内容,然后按照我的建议执行。

作为补充:如果您事先不知道消息大小,最好使用一些“消息终止符”。例如,您可以在末尾附加一个
ETX
字符,以便客户端知道当消息中包含
ETX
时,消息就结束了。这对文本消息很有好处。二进制消息更复杂。你是对的,但在他的代码中,他将接收到的结果转换为字符串,所以我怀疑他发送的是二进制消息。谢谢。是,邮件开头的服务器发送大小。确定。请记住,在读取消息大小时,您可能不会得到整个大小(2或4个字节),而只是其中的一部分。这是极不可能的,但它可能发生。读取固定长度字段也需要同样的技巧。另外,如果事先不知道消息大小,最好使用“消息终止符”。例如,您可以在末尾附加一个
ETX
字符,以便客户端知道当消息中包含
ETX
时,消息就结束了。这对文本消息很有好处。二进制消息更复杂。你是对的,但在他的代码中,他将接收到的结果转换为字符串,所以我怀疑他发送的是二进制消息。谢谢。是,邮件开头的服务器发送大小。确定。请记住,在读取消息大小时,您可能不会得到整个大小(2或4个字节),而只是其中的一部分。这是极不可能的,但它可能发生。读取固定长度字段也需要同样的技巧。