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

您只处理了一次对 的调用Read。这种行为完全是意料之中的;您很少会在一个数据包中获得所有数据(坦率地说,我很惊讶您没有早点注意到它)。

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

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

于 2012-05-07T18:44:24.407 回答