我正在使用Socket Stream,协议Tcp用于服务器和客户端之间的连接
与外部IP地址。
我的问题是我没有收到客户发送的完整数据!
我试图解决许多解决方案,我知道我必须发送Data Size
首先发送Actual Data
,这就是我所做的例如:
string Data = ""; // my data here
string Crypted = crypt(Data); // just a method crypting string (work perfectly tested)
byte[] DataBytes = Encoding.Unicode.GetBytes(Crypted);
_ClientSocket.Send(BitConverter.GetBytes(DataBytes.Length),0,4,0);
_ClientSocket.Send(DataBytes,0,DataBytes.Length,0);
接受Somethign喜欢那样:
byte[] uffer;
byte[] BufferData;
int Size;
int Received;
uffer = new byte[4];
while (true)
{
uffer = new byte[4];
Size = _Client.Receive(uffer, 0, 4, 0);
if (Size > 0)
{
if (Size < _Client.ReceiveBufferSize)
{
BufferData = new byte[Size];
}
else
{
BufferData = new byte[_Client.ReceiveBufferSize];
}
Received = _Client.Receive(BufferData, 0, BufferData.Length, 0);
string Msg = Encoding.Unicode.GetString(buffer);
String Data = U.Decrypt(Msg);
}
但我仍然不接收数据,如果我没有收到数据!
答案 0 :(得分:1)
我认为你把第一次收到的结果和收到的价值混在一起。
后:
Size = _Client.Receive(uffer, 0, 4, 0);
Size
将是该API调用接收的字节数,但是在您使用它来调整主内容的缓冲区大小之后。
您需要将uffer
的内容转换为int
并使用它来调整缓冲区的大小以便下次接收。 IE浏览器。你错过了一个:
int messageSize = BitConverter.ToInt32(uffer, 0);
BufferData = new byte [Math.Min(messageSize, _Client.ReceiveBufferSize];