异步接收数据,第一次接收到不解析,第二次直接从上次的地方进行解析?
最近在把同步改成异步通信,遇到一个奇怪的地方,接到数据后不直接解析,卡住不走了,然后第二次从卡住的地方直接运行解析数据,就是卡在这里:iBytesHead = ThisClient.Receive(recvBytes1, recvBytes1.Length, 0);
个人觉得这接收是不是还是同步接收,但是自己刚接触异步通信,想改却不知道怎么改,特来求助大佬,第一次输出2就不走了,第二次接到数据,直接输出3,然后往下运行了,奇数次就卡在2这,偶数次就直接从卡住的地方运行了,
个人觉得这接收是不是还是同步接收,但是自己刚接触异步通信,想改却不知道怎么改,特来求助大佬,第一次输出2就不走了,第二次接到数据,直接输出3,然后往下运行了,奇数次就卡在2这,偶数次就直接从卡住的地方运行了,
public void recmessage(byte[] data)
{
if (ThisClient.Connected)
{
//接受消息头(消息校验码4字节 + 消息长度4字节 + 身份ID8字节 + 主命令4字节 + 子命令4字节 + 加密方式4字节 = 28字节)
int HeadLength = 28;
//存储消息头的所有字节数
byte[] recvBytesHead = new byte[HeadLength];
//如果当前需要接收的字节数大于0,则循环接收
while (HeadLength > 0)
{
byte[] recvBytes1 = new byte[28];
//将本次传输已经接收到的字节数置0
int iBytesHead = 0;
//如果当前需要接收的字节数大于缓存区大小,则按缓存区大小进行接收,相反则按剩余需要接收的字节数进行接收
if (HeadLength >= recvBytes1.Length)
{
log.text += "2";
iBytesHead = ThisClient.Receive(recvBytes1, recvBytes1.Length, 0);
log.text += "3";
}
else
{
iBytesHead = ThisClient.Receive(recvBytes1, HeadLength, 0);
}
//将接收到的字节数保存
recvBytes1.CopyTo(recvBytesHead, recvBytesHead.Length - HeadLength);
//减去已经接收到的字节数
HeadLength -= iBytesHead;
}
//接收消息体(消息体的长度存储在消息头的4至8索引位置的字节里)
byte[] bytes = new byte[4];
Array.Copy(recvBytesHead, 4, bytes, 0, 4);
int BodyLength = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(bytes, 0));
//存储消息体的所有字节数
byte[] recvBytesBody = new byte[BodyLength];
//如果当前需要接收的字节数大于0,则循环接收
while (BodyLength > 0)
{
byte[] recvBytes2 = new byte[BodyLength < 1024 ? BodyLength : 1024];
//将本次传输已经接收到的字节数置0
int iBytesBody = 0;
//如果当前需要接收的字节数大于缓存区大小,则按缓存区大小进行接收,相反则按剩余需要接收的字节数进行接收
if (BodyLength >= recvBytes2.Length)
{
iBytesBody = ThisClient.Receive(recvBytes2, recvBytes2.Length, 0);
}
else
{
iBytesBody = ThisClient.Receive(recvBytes2, BodyLength, 0);
}
//将接收到的字节数保存
recvBytes2.CopyTo(recvBytesBody, recvBytesBody.Length - BodyLength);
//减去已经接收到的字节数
BodyLength -= iBytesBody;
}
string res = DataPackagesTransform.UnpackDataToStr(recvBytesHead, recvBytesBody);
RecMsg.Enqueue(res);
log.text += "队列加入元素";
}
}
...全文
相关推荐
AndroidStudio蓝牙接收数据绘图
在Android Studio中实现蓝牙接收数据并进行绘图是一项常见的任务,尤其在物联网(IoT)应用和健康监测设备中。
QT串口,重点解决了串口接收数据分包或者不完整的问题
本教程将详细讲解如何使用QT框架处理串口通信,并着重解决串口接收数据分包或不完整的问题。首先,QT库提供了一个名为`QSerialPort`的类,用于管理和操作串行端口。
TCPListener异步接收数据.zip
而异步接收数据则可以避免这个问题。异步接收数据的核心在于使用.NET的BeginAcceptSocket和EndAcceptSocket方法。
C#socket异步发送与接收类
- **MessEvent.cs**: 这个文件很可能是处理网络事件的类,包括数据接收事件和发送事件的处理器。这些处理器通常包含解析接收到的数据和处理发送结果的逻辑。
C#socketUdp异步消息发送接收
**异步接收数据** `BeginReceive`方法用于启动异步接收。同样,它提供了一个回调方法,当数据到达时被调用。


