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一樣大的緩衝區,您實際上可以填充緩衝區。當你將你創建的字符串從緩衝區中分離出來時,最後一個字符串會被刪除,其餘的字符會隨着下一次讀取而來。使用NetworkStream的IRC - 緩衝區填充和行被取消
我正在考慮爲單行創建一個足夠大的緩衝區(根據RFC2812是512個字符),提取子字符串直到第一個「\ r \ n」,然後數組複製剩餘的數據到緩衝區的開始,並使用偏移參數將更多數據讀取到最後一次迭代未提取的數據末尾。對不起,如果很難遵循...
這是最好的解決方案,還是我錯過了這裏明顯?
你確定緩衝區滿,不就是'bytesRead'不與發送的字節數相同的大小? – 2010-08-24 07:51:26
可能是這種情況 - 但通常情況並非如此。 – carlsb3rg 2010-08-24 08:05:39