我可以使用Delphi中的UDPClient和UDPServer发送大量数据吗?

3

首先,我的意图是创建两个程序:服务器和客户端,用于发送大字节数组。我刚开始使用UDPclient和udpserver组件进行测试,但不确定这是否正确。

我找到了一个程序示例,但它是使用旧版本的Delphi构建的,当我编译时出现错误。

HostName.Caption := UDPServer.LocalName;
HostAddress.Caption := GStack.LocalAddress;
Port.Caption := IntToStr(UDPServer.DefaultPort);
BufferSize.Caption := IntToStr(UDPServer.BufferSize);
UDPServer.Active := True;

看起来 udpserver.localname 已经是旧版本的了,我需要找出要在这里使用哪个属性。如何在 udpserver 组件中获取和写入主机名。Udpclient 有 Host 属性并且运行良好,我可以编译客户端程序。

有人能帮我确定 "localname" 属性之外的内容吗?

如果有人能建议我另一种发送大字节数组的方法。其大小将约为 120000 字节。我将每分钟发送一次。

谢谢。


你为什么要使用UDP而不是TCP? - FHannes
我不知道,没有具体的理由,只是选择了使用UDP。 - Samir Memmedov
4
首先了解UDP和TCP之间的区别。在UDP中,您不能保证接收已发送的数据包,而接收到的数据包顺序可能与发送顺序不同。UDP通常用于实时协议(如VOIP、游戏等)。如果这不是必需条件,我强烈建议您选择TCP路线,因为它更容易学习。 - whosrdaddy
它不是实时的,它会每分钟频繁发送数据,大约有10个客户端。好的,谢谢你的建议。我会看一下TCP。谢谢大家的回复。 - Samir Memmedov
3个回答

4

最好使用TCP,因为它可以检测传输中的数据损坏并请求再次发送已损坏的数据包。检测是通过对16位校验和的数据包进行比对来完成的,这只能检测错误,但不能纠正它,这就是请求重新发送数据的作用。

使用Delphi附带的Indy套接字库创建TCP套接字可能是最方便的。TIdTCPServer和TIdTCPClient组件应该可以很好地完成工作。

您可以在此处找到有关使用Indy库的演示:


你的第二句话可能指的是UDP或TCP,或者两者都有。这一点非常不清楚。无论如何,TCP和UDP都不使用奇偶校验位,它们使用16位校验和。 - user207421
@EJP 您是正确的,我的错,我已经很久没有在大学里上过网络协议的入门课程了。 - FHannes

1

GStack.HostName 是旧的 LocalName 属性的替代品。

UDP 是基于消息的传输协议。120000 字节太大了,无法放入单个 UDP 消息中。您需要将其分成小块。如果要使用 UDP 发送大量数据,请考虑使用基于 UDP 的传输协议,例如 TFTP。Indy 有专门用于此目的的 TIdTrivialFTPTIdTrivialFTP 组件。

否则,请切换到 TCP,它是基于流的传输协议。然后您可以发送任意数量的数据。


0

这取决于您要通过网络发送的数据。如果您想要发送文件,应该使用TCP协议,因为它保证在服务器端接收到的数据与客户端发送的数据相同。如果您要发送的数据是有损的,比如语音(我的意思是在中间和数据中有延迟或丢失并不重要),则可以使用UDP协议。它会非常快,因为它没有检查数据是否损坏的开销。在UDP中,您可能会丢失数据包或数据报,因此UDP被称为无连接协议,因为实际上没有连接。我认为所有已知的编程语言都支持TCP和UDP连接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接