繁体   English   中英

套接字接收时切断了很长的消息

[英]Really long message cut off on socket receive

我只是注意到我的套接字客户端没有收到服务器发送回给它的相同数据。 文本在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");

您仅处理了一个Read调用。 这种行为是完全可以预期的。 您很少会在单个数据包中获得所有数据(坦率地说,我很惊讶您没有很快注意到它)。

您需要确定“成帧”策略(即,如何区分每个子消息-如果是基于文本的则可能是新行,或者是二进制的长度前缀)-并在处理之前获取一有价值的数据。 这通常意味着在循环中调用Read ,或者(使用文本)使用类似StreamReader东西(为您处理该事情)(即在循环中调用ReadLine() )。

如果套接字上只有一条消息,并且呼叫者关闭了它们的连接,则可以省去成帧的过程,只需要阅读,直到Read返回非正数(即EOF)即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM