我只是注意到我的套接字客户端没有收到服务器发送回给它的相同数据。文本在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
的调用。这种行为是完全可以预期的。您很少会在单个数据包中获得所有数据(坦率地说,我很惊讶您没有很快注意到它)。
您需要确定一种“成帧”策略(即,如何区分每个子消息-如果是基于文本的则可能换行,或者是二进制的长度前缀)-并在处理之前获取一帧有值(value)的数据。这通常意味着在循环中调用Read
,或者(使用文本)使用类似于StreamReader
的东西(即在您的循环中调用ReadLine()
)(对于文本)。
如果套接字上只有一条消息,并且调用方关闭了它们的连接,则可以省去成帧,直到Read
返回非正数(即EOF)时,您才可以阅读。
关于c# - 套接字接收时切断了很长的消息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10487262/