插座接收真的很长的消息被切断了

nat*_*tli 1 c# sockets

我刚注意到我的套接字客户端没有收到服务器发送回它的相同数据.文本在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";
    }
}
Run Code Online (Sandbox Code Playgroud)

然后客户端从服务器获得响应,如此;

string recv = client.sendAndReceiveMSG("someRequest");
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 5

您只处理过一次通话Read.完全可以预料到这种行为; 你很少得到一个数据包中的所有数据(坦白说,我很惊讶你没有早点注意到它).

您需要决定"框架"策略(即如何区分每个子消息 - 可能是基于文本的新行,或二进制的长度前缀) - 并在处理之前获取一数据.这通常意味着Read在循环中调用,或者(对于文本)使用类似于StreamReader为您处理的东西(即ReadLine()在循环中调用).

如果套接字上只有一条消息,并且调用者关闭了它们的连接,则可以省去框架,只需读取直到Read返回非正数(即EOF).