Delphi中发送和接收数据流

Posted

技术标签:

【中文标题】Delphi中发送和接收数据流【英文标题】:Sending and receiving data streams in Delphi 【发布时间】:2011-10-19 10:15:13 【问题描述】:

我想创建一个软件来连接到另一个软件并通过互联网将一些数据(基于文本)发送到另一个程序。

软件将每 300 毫秒发送一次数据(使用定时器),接收方必须按时接收数据。

连接可以像下面这样

    任何数据都可能丢失; 但其余的必须准时到达,并尽可能减少延迟(最多 2 秒); 延迟的数据可以认为是丢失,可以忽略。

我认为它可能类似于视频会议软件,但仅使用简单的文本作为数据。

谁能告诉我如何制作这样的程序,具体

我可以使用哪种组件(任何 INDY 示例); 您推荐哪些技术。

我计划用 Delphi 做,但也欢迎其他建议。

===========================update1 =================

是否可以通过流发送图像

【问题讨论】:

然后我会重点介绍一些Delphi UDP协议的实现。 @Tlama 是的!但我的问题在于实施 Log4D 开源日志框架包括基于 UDP 的客户端和服务器(GUI 应用程序)记录器代码(使用 Indy),这可以服务器作为起点 如果你想发送图像,那么你应该使用 TCP。 UDP 最适用于小数据包/消息,并且不适用于较大的文件。 一次需要发送多少数据? 【参考方案1】:

我建议使用 UDP 协议并将时间戳信息添加到您的数据中,并在接收端跟踪传入数据。您可以使用 Indy 或其他软件包中的 UDP 服务器 (TIdUDPServer) 和客户端 (TIdUDPClient) 组件。客户端组件用于发送数据,服务器用于接收。

我个人通常更喜欢Synapse -classes。它们的级别低于 Indy,因此更容易知道发生了什么,但另一方面,您可能需要自己实现 Indy 默认提供的功能。

更新

实现非常简单:

发送数据:

将 TIdUDPClient 拖放到表单上。将“Host”设置为接收端的名称或IP地址(如果您在同一台计算机上运行程序,则设置为“localhost”)并将端口设置为服务器正在侦听的高数字,例如54656。

在按钮或定时器事件中添加以下代码:

IdUDPClient1.Send('Hello, world!');

接收数据:

在表单上放置 TIdUDPServer 组件。将默认端口设置为与发送应用程序相同的端口。添加 OnUDPRead 事件处理程序,代码:

MessageDlg('Received: ' + StringOf(AData), mtInformation, [mbOk], 0);

每次收到新消息时都会弹出新消息对话框。

更新 2

UDP 不适合图像,如果你想确保它们不会被破坏,除非图像非常小并且可以放在一个数据包中。

【讨论】:

对于多达 100 个左右的客户端,TCP 更容易。 UDP 对于大量客户端的扩展性要好得多,也适用于您可以承受丢失的离散(短)消息。 @Misha 我认为这取决于应用程序的目标。如果您正在流式传输在线数据并且只对最新到达的数据感兴趣,我认为 UDP 更容易,因为您不必担心连接、断开连接、延迟等。 @Harriv,是的,只要每条消息都是独立的并且整齐地放入一个数据包中(正如您上面的更新所解释的那样)。【参考方案2】:

我建议使用除 Indy 之外的任何东西。它既有缺陷(尤其是与 Delphi 捆绑的版本),也比其他组件集慢。它很容易理解并开始使用它,但是一旦你深入研究底层,你就会开始注意到一些小问题。 Indy 一直在开发中,您可以找到最新版本 here。问题是,由于一些硬编码的依赖关系,您无法轻松地用 2009 年以后的 Delphi 版本中的较新版本替换捆绑版本。

Delphi 集成的其他网络通信方法很少,但我建议探索 3rd 方组件。首先,如果你想开源,你应该看看Overbyte ICS。有点难掌握,但性能和功能都不错。

作为一个非常好的商业解决方案,看看IP^Works。我只是刮了一下,但就我所见,我可以全心推荐它。

【讨论】:

垃圾!自 2004 年以来,我一直在生产中使用 Indy。我有 20 多个不同的应用程序(服务器和客户端)都与 Indy 通信,而且我从未遇到过 Indy 组件的问题。是的,如果您每天都使用最新版本,那么可能会出现奇怪的问题,但这些问题很快就会得到解决。您可以从我的网站 (csinnovations.com/framework_delphi.htm) 上的下载中了解我是如何构建一个完整的通用通信框架的。 我必须纠正自己,因为我解释的内容与协议特定组件问题有关,例如 IMAP。另一方面,TIdTCPServerTIdTCPClient 相当不错,尽管我仍然声称其他组件集优于 Indy,尤其是在时间紧迫的任务中。 关于特定组件集的情况还算不错(我真的不使用 TCP、UDP、HTTP 和 SMTP 之外的任何东西)。鉴于我可以在与 Indy 通信时获得毫秒级的延迟,并且连接的吞吐量为 20-50 Mbps,我怀疑在实现中的任何性能限制都比 Indy 本身更多。至于你能把 Indy 推到多远,看看我的问题 - ***.com/questions/7150093/…。 @LightBulb:在 XE/XE2 中移除了 Embarcadero 包中 Indy 上的“硬编码依赖项”,以便用户更轻松地升级 Indy 而不会破坏任何内容。 @RemyLebeau-TeamB:我知道这一点,但是对于那些坚持使用旧版本的 Delphi,尤其是 2009/10 版本的我们呢?你不能指望我们升级 Delphi 只是为了能够使用关键的组件集。我的观点是,我需要有效的组件集,并且它完全符合预期。这就是为什么如果您需要时间紧迫和持久的功能,我仍然建议不要使用 Indy。

以上是关于Delphi中发送和接收数据流的主要内容,如果未能解决你的问题,请参考以下文章

Delphi XE IdTCPClient1 和 IdTCPServer1 数据的发送与接收(indy10)

delphi的tserversocket控件如何接收16进制数

delphi indy10 无法接收中文

Delphi XE 中的 VaComm

delphi多线程怎么解决数据处理速度跟不上数据接收的速度?

Indy10 Tcp接收数据问题