110,538
社区成员
发帖
与我相关
我的任务
分享
public void sendBytes(Socket socket, byte[] bytes)
{
if (socket.Connected)
{
int lenPer = 1024;
#region 发送bytes;
int count = 0;
byte[] bytesSend = new byte[lenPer + 4];//通过socket发送的数据;
byte[] bytesLen = null;//每个包的长度;(前4个字节表示)
while (true)
{
if (count == bytes.Length)
{
socket.Send(BitConverter.GetBytes(0));//
break;//跳出循环,结束发送;
}
if ((bytes.Length - count) >= lenPer)//如果剩余字节数>=1024字节,则发送1024字节;
{
bytesLen = BitConverter.GetBytes(lenPer);//要发送的字节长度是1024
bytesLen.CopyTo(bytesSend, 0);//将长度bytes复制到要发送数组的前4个字节;
Array.Copy(bytes, count, bytesSend, 4, lenPer);
socket.Send(bytesSend);
count += lenPer;
}
else//要发送的bytes的总长度-已经发送的长度count->小于1024
{
bytesSend = new byte[(bytes.Length - count) + 4];
bytesLen = BitConverter.GetBytes(bytes.Length - count);
bytesLen.CopyTo(bytesSend, 0);
Array.Copy(bytes, count, bytesSend, 4, bytes.Length - count);
socket.Send(bytesSend);
count = bytes.Length;
}
}
#endregion
}
else
{
throw new Exception("远程服务器断开连接");
}
}
public byte[] receBytes(Socket socket)//接收bytes并反序列化为对象;
{
if (socket.Connected)
{
byte[] bytes = null;
int timeCount = 0;
while (true)
{
byte[] bytesPackLen = new byte[4];//存储包长的数组;(前4个字节表示)
int packLen = 0;//包长;
int receLen = socket.Receive(bytesPackLen, 0, 4, SocketFlags.None);//从buffer中的前4个字节读出包长;
packLen = BitConverter.ToInt32(bytesPackLen, 0);//确定每次要接受多少字节数
if (packLen > 0)//如果要接收的包长>0,说明数组没发送完毕;
{
//接收指定包长的字符串数组;
byte[] bytesReceive = new byte[packLen];
int receLenCount = 0;//接收到的字节长度统计;
while (true)
{
byte[] bytesTmp = new byte[packLen - receLenCount];
receLen = socket.Receive(bytesTmp, 0, packLen - receLenCount, SocketFlags.None);//接收服务器指定字节的数据;
Buffer.BlockCopy(bytesTmp, 0, bytesReceive, receLenCount, receLen);//把实际接收到的bytes复制到bytesReceive里;
receLenCount += receLen;
if (receLenCount == packLen)
{
break;
}
}
if (bytes == null)//null,说明第一次接数据包;
{
bytes = new byte[bytesReceive.Length];
bytesReceive.CopyTo(bytes, 0);
}
else//说明已经接到过一次数据包,需要合并;
{
bytes = bytesClass.mergeBytes(bytes, bytesReceive);//把刚接收到的数据包追加到bytes里;
}
}
else
{
break;
}
}
return bytes;
}
else
{
throw new Exception("远程服务器断开连接");
}
}