我刚注意到我的套接字客户端没有收到服务器发送回它的相同数据.文本在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)
您只处理过一次通话Read.完全可以预料到这种行为; 你很少得到一个数据包中的所有数据(坦白说,我很惊讶你没有早点注意到它).
您需要决定"框架"策略(即如何区分每个子消息 - 可能是基于文本的新行,或二进制的长度前缀) - 并在处理之前获取一帧数据.这通常意味着Read在循环中调用,或者(对于文本)使用类似于StreamReader为您处理的东西(即ReadLine()在循环中调用).
如果套接字上只有一条消息,并且调用者关闭了它们的连接,则可以省去框架,只需读取直到Read返回非正数(即EOF).