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", затем копируя в массив оставшиеся данные в начало буфера и используя параметр смещения, чтобы прочитать больше данных в конецданные, которые не были извлечены на последней итерации.Извините, если за этим трудно было следовать ...
Это лучшее решение, или я упускаю очевидное здесь?