var buffer = new byte[short.MaxValue];
var splitString = new string[] {"\r\n"};
while (_tcpClient.Connected)
{
if (!_networkStream.CanRead || !_networkStream.DataAvailable)
continue;
var bytesRead = _networkStream.Read(buffer, 0, buffer.Length);
var stringBuffer = Encoding.ASCII.GetString(buffer, 0, bytesRead);
var messages =
stringBuffer.Split(splitString, StringSplitOptions.RemoveEmptyEntries);
foreach (var message in messages)
{
if (MessageReceived != null)
{
MessageReceived(this, new SimpleTextClientEventArgs(message));
}
}
}
问题是,即使使用了 short.MaxValue 这样大的缓冲区,您实际上也可以填充缓冲区。当您拆分从缓冲区创建的字符串时,最后一个字符串会被压缩,其余的字符串会在下一次读取时出现。
我正在考虑为一行创建一个足够大的缓冲区(根据 RFC2812 是 512 个字符),提取一个子字符串直到第一个“\r\n”,然后将其余数据数组复制到开头缓冲区并使用 offset 参数将更多数据读取到上次迭代未提取的数据的末尾。抱歉,如果这很难理解...
这是最好的解决方案,还是我在这里错过了显而易见的事情?