数据包通过TcpListener
从TcpClient
发送到NetworkStream
。数据包不是很大(5字节),但频率很高(大约每秒1000个或更多)。你能给我建议我应该如何最有效地处理它?现在我使用async来获取流,填充缓冲区,然后我将其切换到数据包。之后,重复该过程。但
在某些时候,我失去了真正的序列。
s
是NetworkStream。
数据包有2个字段:type(1 Byte(byte))和value(4 Bytes(int))
MAXVALUEPACKET
= 4096
客户代码:
async Task process()
{
bool flag = false;
while (true)
{
byte[] actionBuffer;
flag = false;
actionBuffer = await ReadFromStreamAsync();
while (!flag)
{
byte type = actionBuffer[0];
int value = 0;
if (type > 0)
{
byte[] valueBytes = { actionBuffer[4], actionBuffer[3], actionBuffer[2], actionBuffer[1] };
value = BitConverter.ToInt32(valueBytes, 0);
actionBuffer = actionBuffer.Skip(5).ToArray();
CommonVariables.RawMessages.Add(new KeyValuePair<byte, int>(type, value));
OnHandler();
}
else
flag = true;
}
}
}
byte[] buf = new byte[MAXVALUEPACKET];
async Task<byte[]> ReadFromStreamAsync()
{
await s.ReadAsync(buf, 0, MAXVALUEPACKET);
return buf;
}
答案 0 :(得分:0)
设置MAXVALUEPACKET = 5
以准确读取每5个字节可能有助于避免丢失字节:
const int MAXVALUEPACKET = 5;
async Task process()
{
while (true)
{
var actionBuffer = await ReadFromStreamAsync();
byte type = actionBuffer[0];
int value = 0;
if (type > 0)
{
byte[] valueBytes = { actionBuffer[4], actionBuffer[3], actionBuffer[2], actionBuffer[1] };
value = BitConverter.ToInt32(valueBytes, 0);
CommonVariables.RawMessages.Add(new KeyValuePair<byte, int>(type, value));
OnHandler();
}
}
}
async Task<byte[]> ReadFromStreamAsync()
{
await s.ReadAsync(buf, 0, MAXVALUEPACKET);
return buf;
}
原始代码逻辑的问题是当迭代到达第820个循环时,剩下1个字节并且它使逻辑读取整数值失败。我假设服务器总是在每个部分写入5个字节。