java - 在 Java 中使用 UDP 广播
问题描述
我一直在努力理解使用 UDP 进行广播并且无法在我的程序中实现它。
目前,我有一个客户端和服务器,它们都运行 2 个线程(一个用于接收,一个用于发送)。
客户端可以向它连接的服务器发送 SET/GET 查询,以存储/获取键值对。这个想法是,对于多个服务器,我们正在寻找的密钥可能在另一个服务器上。因此 GET 查询应该广播到所有其他服务器。
private void send(String value, int port) throws IOException {
System.out.println("Send: " + value);
byte[] buffer = (value).getBytes();
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, connectingPort);
socket.send(packet);
}
这是当前客户端的发送线程的发送功能。
作为 InetAddress,我使用 localhost。
连接端口 = 此客户端连接到的服务器端口
public ClientSendingThread() throws UnknownHostException, SocketException {
address = InetAddress.getByName("localhost");
stdin = new BufferedReader(new InputStreamReader(System.in));
//Registering yourself upon creation
try {
socket = new DatagramSocket();
socket.setBroadcast(true);
receiver = new ClientReceivingThread(socket);
System.out.println("Enter port of the Server you would like to connect to: ");
System.out.println("localhost is used automatically as address");
connectingPort = Integer.parseInt(stdin.readLine());
Thread receivingThread = new Thread(receiver);
receivingThread.start();
send("Client", connectingPort);
} catch (IOException ex) {
System.out.println(ex);
}
}
那是 ClientSendingThread 的构造函数,我只是要求用户输入他们想要连接的端口号。然后我启动接收线程并将“客户端”发送到服务器,这样它将“注册”客户端。
我关于广播的问题:
我什至使用什么地址?哪个港口?
解决方案
您想要的在技术上称为“多播”,而不是“广播”。它允许一个或多个服务器注册一个多播地址,客户端可以向该地址发送消息。
客户端和服务器都创建一个MulticastSocket。您需要在 224.xxx 空间中选择一个端口号和一个多播地址;224.0.0.1 可能是合适的,虽然我已经有一段时间没有这样做了,所以我可能有点生疏了。您还可以为您的特定用途选择一个“未使用”的 224 地址。
多播和广播之间的区别在于广播是“所有人”,包括随机路由器、网络摄像头等,它们并不关心您的应用程序。广播访问往往是一种特权操作。广播地址在您的网络中是全一。所以,如果你的网络是 192.168.1.0/24,那么广播地址就是 192.168.1.255。
推荐阅读
- python - 使用 discord.py 创建角色
- d3.js - 带有水平标签的 d3v4 饼图
- sql - 将多行(具有相同ID)合并为一行?
- java - 如何从字符串中获取所有值?
- vue.js - vue-router beforeRouteUpdate 切换时使用旧参数
- c++ - ReadDirectoryChangesW 仅将单个事件放在 FILE_NOTIFY_INFORMATION 缓冲区中
- android - 如何找出冲突的路径?
- python - gunicorn 发送信息消息处理信号:绞盘
- python - 如何在 PsychoPy 或 Python 中对 WPI 注射泵进行编程?
- c# - 如何隐藏使用 Selenium 打开或切换选项卡时弹出的窗口