【发布时间】:2016-04-03 18:15:16
【问题描述】:
我是 Java 套接字编程的新手,我目前正在开发一个小型点对点 UDP 聊天室应用程序,它允许多个客户端相互聊天。
我的问题是如何让客户端在点击连接按钮后发现所有其他连接的客户端,仅提供一个连接的客户端 ip 和端口?该程序仅在本地网络上运行。
【问题讨论】:
-
我尝试过使用列表并将其传递给每个新客户。不知何故它不起作用。
我是 Java 套接字编程的新手,我目前正在开发一个小型点对点 UDP 聊天室应用程序,它允许多个客户端相互聊天。
我的问题是如何让客户端在点击连接按钮后发现所有其他连接的客户端,仅提供一个连接的客户端 ip 和端口?该程序仅在本地网络上运行。
【问题讨论】:
您可以使用 UDP 的独特功能 broadcasting
在 IPv4(您可能正在使用)上,广播地址是 255.255.255.255。发送到该地址的任何数据报都将发送到该端口网络上的所有 UDP 客户端。
您可以为您的聊天应用程序做的是让每个客户端向 UDP 广播发送一个数据包来标识自己,例如用户的昵称。所有其他客户端都会看到该数据包,您将能够解析该数据包并显示网络上所有聊天客户端的列表。
下面是一个发送数据报广播的例子:
DatagramSocket s = new DatagramSocket();
s.setBroadcast(true);
DatagramPacket dp = new DatagramPacket("insert data here".getBytes(), "insert data here".length(), new InetSocketAddress("255.255.255.255", 5000));
s.send(dp);
另一个客户端可以这样接收它:
DatagramSocket s = new DatagramSocket();
s.setBroadcast(true);
DatagramPacket dp = new DatagramPacket(new byte[1024], 1024);
s.receive(dp);
收到的 DatagramPacket 将包含广播它的客户端的 IP 和端口。
【讨论】:
一个简单的可能性是每个客户端都存储它知道的其他对等点,并将列表传递给任何连接的新客户端。
【讨论】:
不要忘记对您的同行进行身份验证。您可以尝试使用 OpenSSL(非常简单)来生成一些证书并将其与 ssl 关联使用。
编辑:一个机器人告诉我要更具体,所以这里是:
本地网络 (LAN) 并不总是安全的,因此,可以肯定的是,我建议您使用 OpenSSL 生成用于身份验证的证书和用于加密的私钥,这样您就可以安全地进行通信。 Python ssl 模块就是一个很好的例子。
【讨论】: