C#异步读取tcp / ip

时间:2012-11-22 13:04:59

标签: c# buffer tcp-ip asynchronous

我需要创建一个通过tcpip连接到医疗机器的客户端。在内部事件发生时,这台机器向我发送一个或多个XML文件,其中包含我需要处理的数据。由于这些事件不是易于理解的,我想到了异步连接,它获取数据并将其保存在文件系统中。基本上,对于该机器发送的每个XML,我必须将其保存到磁盘上。

我google了一下,因为我没有太多tcp / ip编程经验,我在MSDN上发现了异步客户端的一个例子(Client Example

首先,不起作用的属性Console.WriteLine("Response received : {0}", response);永远不会被击中。然后,当该机器只发送一个文件时,在缓冲区上我有两次相同的数据。而且我猜测如何在发送的xml文件中检测EOF。

我也考虑过轮询,但似乎是不正确的解决方案。 任何提示?

1 个答案:

答案 0 :(得分:1)

我非常确定民意调查在这种情况下无济于事。

很少有东西可以向你展示一些好的指示:

1)。 Socket为您提供接收到的数据,这些数据是您决定的大小的预定义字节数组,因此可以很好地确定大小。 例如:

public const int BufferSize = 256;
对于MSDN上的示例,

为256,现在如果您的数据大小为260字节,它将首先向您发送256个字节,然后在下一次接收时,它将向您发送剩余的4个字节。这可能是您需要找到一种方法来堆积所有收到的数据,然后每次检查开始标识符和结束标识符以提取所需数据的原因之一。从另一个视图中,如果您根据数据的平均大小定义更大的字节缓冲区大小。在大多数情况下,您将一次性收到整个消息。但仍然无法实现100%,这就是套接字的工作方式。

2)。您可能已收到两次数据或某种类型的数据,因为缓冲区字节数组未在适当的时间清除或在下次使用之前未刷新。

3)。 EOF或EOT可以通过各种方式决定,如果您对医疗机器有控制权,您可以在发送数据之前在末尾插入标识符,并使用相同的标识来区分发送的消息。如果您没有对发件人进行编程控制,并且您确定要收到XML格式,那么您总是可以尝试找到“< xml>” “< / XML>” 中收到的数据中的文字并在此基础上进行区分。