0

谁能指导我一个简单的设计或想法或常见步骤来实现 UDP 聊天服务器和客户端?我不是问绳索,我想尝试我自己。我正在寻找一种独立于编程语言的解释。

提前致谢

4

3 回答 3

2

经典的设计是,每当用户在他的聊天客户端中键入一行文本时,该客户端将文本(可能还有一些其他信息,例如用户名)放入它发送到服务器的 UDP 数据包中。服务器接收 UDP 数据包,然后将数据包的副本转发给它知道的所有其他客户端。当其他客户端收到转发的数据包时,它们各自显示数据包的内容供本地用户阅读。

唯一不明显的部分是发现——即客户端如何知道将 UDP 数据包发送到哪个 IP 地址,以及服务器如何知道将接收到的数据包转发到哪个 IP 地址?

如果你能保证所有的客户端总是和服务器在同一个以太局域网上,那么这很容易处理——只要总是将所有的 UDP 数据包发送到广播地址(255.255.255.255),局域网上的每个人都会接收它们。(事实上​​,在这种情况下,您根本不需要服务器,因为客户端可以直接相互通信)。

在更现实的情况下,客户端位于 Internet 上的任意位置,发现变得更加困难。希望您可以在众所周知的固定位置(例如 www.thabo-chat.com 或其他地方)运行服务器,并将该主机名硬编码到客户端中。然后每当客户端启动时,它可以向服务器发送一个 UDP 数据包,让服务器知道它的存在,服务器可以从收到的 UDP 数据包中读取源 IP 地址并将其添加到 known-client- 列表中它将接收到的数据包转发到的 IP 地址。它还应该保留每个客户端最近收到消息的时间戳,如果很长时间没有收到消息,则从列表中删除 IP 地址(以避免无意义地向已经离开的客户端发送数据包)。

在 Internet 上使用 UDP 时您将面临的最后一个问题是,许多计算机都位于防火墙后面,这些防火墙将阻止来自 Internet 的 UDP 数据包,因此您的服务器发送的 UDP 数据包在许多情况下不会到达客户端它正试图将它们发送到。对此没有一个很好的解决方案——您可以要求您的客户端用户在他们的路由器上设置 UDP 端口转发,但这对他们来说很麻烦,而且很多人没有这样做的技能。在这种情况下,唯一真正的选择是改用 TCP,让客户端通过 TCP 连接到服务器并以这种方式来回发送数据(这种方式有效,因为几乎所有防火墙都允许通过传出 TCP 连接进行双向数据流量,因为这是网页浏览和电子邮件所必需的)

于 2012-05-18T04:59:46.060 回答
2

看看这本书的第 9 章。将清除您对聊天应用程序的客户端-服务器架构的所有查询。

于 2012-05-18T03:38:07.067 回答
0

Python 是一种很容易上手的语言: http ://wiki.python.org/moin/UdpCommunication

于 2012-05-18T03:27:21.527 回答