gpt4 book ai didi

C# TcpClient ReadAsync 读取大消息

转载 作者:太空宇宙 更新时间:2023-11-03 20:18:31 25 4
gpt4 key购买 nike

我有一个 C# TcpClient 来异步读取数据。简化代码如下:

public async Task StartReading(CancellationToken token)
{
// To fit the largest package
const int BufferSize = 524288;

while(true)
{
var buffer = new byte[BufferSize];
int bytesRead = await this.networkStream.ReadAsync(buffer, 0, BufferSize);
.WithWaitCancellation(token);

if (bytesRead > 0)
{
Console.Read(string.Fromat("{0} bytes received."));

// Run processing at background process
Task.Run(() => ProcessData(buffer, bytesRead));
}
else
{
// If received 0 bytes then a tcp connection is terminated
break;
}
}
}

收到的包可能包含一条或多条以STX开头,以ETX结尾的消息,不发送包长度。此 Feed 由第 3 方提供,不会更改。

在测试过程中,服务器似乎以 8192 个 block 发送数据,因此一条消息可能会被拆分为两个后续 block 并且无法处理。
这是一个日志:
收到 8192 个字节
消息 89 条处理/1 条失败
收到 8192 个字节
消息 89 条处理/2 条失败
收到 8192 个字节
消息 89 条处理/2 条失败
收到 2349 字节
消息 34 条处理/1 条失败

同步阅读也无济于事。我该如何管理它?

最佳答案

从根本上说,TCP 是一种基于流 的协议(protocol)。您正在尝试将其视为基于数据包 的协议(protocol)。不要那样做。

数据提供了自己的定界符——所以使用它。如果消息没有完全收到,请记住这些字节,然后在收到消息的其余部分时处理它们。 (请记住,在下一次读取调用时也可能不会完全接收到消息...)

关于C# TcpClient ReadAsync 读取大消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15144800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com