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 と同じ大きさのバッファーを使用しても、実際にはバッファーをいっぱいにすることができることです。作成した文字列をバッファから分割すると、最後の文字列が切り捨てられ、残りの文字列が次の読み取りに付属します。
1 行 (RFC2812 によると 512 文字) に十分な大きさのバッファーを作成し、最初の "\r\n" まで部分文字列を抽出してから、残りのデータを配列の先頭にコピーすることを考えていました。バッファーを使用し、offset パラメーターを使用して、最後の反復で抽出されなかったデータの末尾にさらにデータを読み取ります。フォローしづらかったらすいません…
それが最善の解決策ですか、それともここで明らかなことを見逃していますか?