C# 通过TCPIP客户端连接异步读取缓冲区

C# 通过TCPIP客户端连接异步读取缓冲区,c#,asyncsocket,tcp-ip,C#,Asyncsocket,Tcp Ip,我编写了一个通过TCP/IP连接到医疗机器的客户端。该机器根据内部触发事件向我发送XML文件。我必须捕获这些XML并存储在文件系统中。 我使用了一个类,该类提供异步连接,除少数几件事外工作正常:当我检查编写的文件时,我注意到它们包含两个由空值分隔的xml(编码为0X00)。 所以我在缓冲区上放置了一种过滤器,但问题仍然存在。基本上,当我检测到XML文件的结尾时,我必须中断缓冲区 这是提供异步读取的代码: try { NetworkStream networkStream = this.c

我编写了一个通过TCP/IP连接到医疗机器的客户端。该机器根据内部触发事件向我发送XML文件。我必须捕获这些XML并存储在文件系统中。 我使用了一个类,该类提供异步连接,除少数几件事外工作正常:当我检查编写的文件时,我注意到它们包含两个由空值分隔的xml(编码为0X00)。 所以我在缓冲区上放置了一种过滤器,但问题仍然存在。基本上,当我检测到XML文件的结尾时,我必须中断缓冲区

这是提供异步读取的代码:

try
{
    NetworkStream networkStream = this.client.GetStream();                
    int read = networkStream.EndRead(asyncResult);

    if (read == 0)
    {
        if (this.Disconnected != null)
            this.Disconnected(this, new EventArgs());
    }

    byte[] buffer = asyncResult.AsyncState as byte[];
    if (buffer != null)
    {
        byte[] data = new byte[read];
        Buffer.BlockCopy(buffer, 0, data, 0, read);
        networkStream.BeginRead(buffer, 0, buffer.Length, this.ClientReadCallback, buffer);
        content.Append(Encoding.UTF8.GetString(buffer.TakeWhile((b, index) => index <= read).Where(b => b != 0x00).ToArray()));

        // Store the file
        string machineId = StoreFile(content.ToString());

        counter++;
        if (this.DataRead != null)
            this.DataRead(this, new DataReadEventArgs(data));
    }
}
catch (Exception ex)
{
    Logger.Log(ex.Message);
    if (this.ClientReadException != null)
        this.ClientReadException(this, new ExceptionEventArgs(ex));
}
试试看
{
NetworkStream NetworkStream=this.client.GetStream();
int read=networkStream.EndRead(异步结果);
如果(读==0)
{
如果(this.Disconnected!=null)
this.Disconnected(this,new EventArgs());
}
byte[]buffer=asyncResult.AsyncState为byte[];
if(缓冲区!=null)
{
字节[]数据=新字节[读取];
块复制(缓冲区,0,数据,0,读取);
networkStream.BeginRead(buffer,0,buffer.Length,this.clientradcallback,buffer);
Append(Encoding.UTF8.GetString(buffer.TakeWhile((b,index)=>index b!=0x00.ToArray());
//存储文件
字符串machineId=StoreFile(content.ToString());
计数器++;
如果(this.DataRead!=null)
this.DataRead(this,newdatareadeventargs(data));
}
}
捕获(例外情况除外)
{
Logger.Log(例如消息);
if(this.clientradexception!=null)
此.clienteradexception(此,新的例外ventargs(ex));
}

问题在于,您正在切断第二个XML文档的开头,然后继续阅读。下一次读取将没有0,因此您将写入其内容

Read: XML1
Read: XML1 \0 XML2 <-- you cut this XML2 off
Read: XML2 <-- but then continue reading here.
Read:XML1

读取:XML1\0 XML2您的意思是我必须忽略对空值(0x00)的检查,空值是两个文件之间的分隔符?您的
buffer.TakeWhile((b,index)=>index b!=0x00)。ToArray()
位停止为单个读取追加XML2。在此之后开始新的读取,完成后将继续写入。需要检查缓冲区是否包含
0
,然后停止执行读取。因此,在
Encoding.UTF8.GetString(buffer.TakeWhile((b,index)=>index b!=0x00.ToArray())之后,我会检查缓冲区的长度是否为零?