异步读取输入流

本文关键字:输入流 读取 异步 | 更新日期: 2023-09-27 18:35:37

我正在尝试接收数据包,如果没有收到字节,请继续执行下面的代码。等待读取异步块,直到收到新数据包。有没有办法只读取当前收到的字节数?

如果我不使用等待消息,则不会收到消息。

byte[] data = new byte[BufferSize];
IInputStream inputStream = socket.InputStream;
IBuffer buffer = data.AsBuffer();
socketInformation.GetStopwatchPingIdleTime().Start();
while (socketInformation.open)
{
    try
    {
        inputStream.ReadAsync(buffer, BufferSize, InputStreamOptions.Partial);
        data = buffer.ToArray();
    }
    catch (Exception)
    {
        break;
    }
    while (true)
    {
        // Wait for payload size
        if (buffer.Length >= 4)
        {
            int commandType = (int)BitConverter.ToInt16(data, 0);
            int payloadSize = (int)BitConverter.ToInt16(data, 2);
            int packetSize = PacketHeaderSize + payloadSize;
            // Wait for a full message
            if (buffer.Length >= packetSize)
            {
                byte[] packet = new byte[packetSize];
                System.Buffer.BlockCopy(data, 0, packet, 0, packetSize);
                ParsePacketSequence(socket, socketInformation, packet);
                if (buffer.Length > packetSize)
                {
                    int bufferLength = (int)buffer.Length - packetSize;
                    byte[] newData = new byte[BufferSize];
                    System.Buffer.BlockCopy(data, packetSize, newData, 0, bufferLength);
                    data = newData;
                    buffer.Length = (uint)bufferLength;
                }
                else if (buffer.Length == packetSize)
                {
                    break;
                }
                else
                {
                    break;
                }
            }
            else if (buffer.Length == packetSize)
            {
                break;
            }
        }
        else
        {
            break;
        }
    }
    if (host)
    {
        // Send ping to player
        if (socketInformation.waitingPong == false && 
            socketInformation.GetStopwatchPingIdleTime().ElapsedMilliseconds > 5000)
        {
            byte[] pingPacket = CreatePacket(6, null);
            SendPacket(socket, socketInformation, pingPacket);
            socketInformation.waitingPong = true;
        }
    }
    await Task.Delay(33, tokenSource.Token);
}
inputStream.Dispose();
socket.Dispose();
tokenSource.Cancel();

异步读取输入流

在我看来,

您正在接收消息流。当消息存在时,您希望在以后的某个时间或在代码中的其他位置处理它。

一个好的方法是让一个人Task不断地从套接字读取消息并将它们放入队列中。然后,您可以随时从队列中提取完整的消息。

这样你就可以摆脱这里的大部分逻辑。您永远不必中止读取请求,也永远不需要检查超时。