【问题标题】:C# Asynchronous read over tcp/ipC# 通过 tcp/ip 异步读取
【发布时间】:2012-11-22 13:04:58
【问题描述】:

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

由于我在 tcp/ip 编程方面没有太多经验,所以我在 Google 上搜索了一下,我在 MSDN 上找到了一个异步客户端示例 (Client Example)

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

我也考虑过轮询,但作为解决方案似乎不正确。 有什么提示吗?

【问题讨论】:

    标签: c# buffer tcp-ip asynchronous


    【解决方案1】:

    我很确定在这种情况下轮询不会有帮助。

    几件事可以告诉你一些好的开始:

    1)。套接字以您决定大小的一些预定义提供的字节数组为您提供接收到的数据,因此请确定大小。 例如:

    public const int BufferSize = 256;
    

    对于 MSDN 上的示例,是 256,现在如果您的数据大小为 260 字节,它将首先向您发送 256 字节,然后在下一次接收时向您发送其余 4 字节。这可能是您需要找到一种方法来堆积收到的所有这些数据然后每次检查开始标识符和结束标识符以提取您需要的数据的一个原因。从另一个角度来看,如果您考虑数据的平均大小定义更大的字节缓冲区大小。在大多数情况下,您将一次性收到整个消息。但是你仍然不能 100% 实现它,这就是 socket 的工作方式。

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

    3)。 EOF 或 EOT 可以通过多种方式确定,如果您可以控制医疗机器,则可以在其发送数据之前在末尾插入一个标识符,并使用它来区分发送的消息。如果您对发送方没有编程控制,并且您确定要接收 XML 格式,您可以随时尝试在接收到的数据中查找“”“”文本并在此基础上进行区分。

    【讨论】:

    • 您好,J Sinh,谢谢您的提示。我已经能够使用 C# 的 tcpclasses 创建我的客户端。现在客户要求将此客户端转换为 WCF 版本,但由于服务器不是基于 wcf 的,我认为是不可能的。你怎么看?
    • WCF 是 SOA(面向服务的架构)应用程序(简单的 SOAP 或 REST 服务)的微软实现。如果服务器是某个以 SOAP 或 REST 响应形式提供响应的服务,则可以使用 WCF 实现客户端。但如果不是这样,那么朝那个方向思考就不好了。需要明确的是,XML 响应并不总是服务响应。此外,如果套接字是决定的通信媒介,您可以在客户端创建一个套接字实现并在其之上创建一个 Windows 服务(WINService)。
    猜你喜欢
    • 1970-01-01
    • 2018-06-14
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 2010-10-22
    • 2012-08-16
    相关资源
    最近更新 更多