C#我应该如何更有效地使用NetworkStream?

时间:2016-12-07 07:10:09

标签: c# asynchronous networking

数据包通过TcpListenerTcpClient发送到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; 
    }

1 个答案:

答案 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个字节。