如何对 2 个 udp 客户端进行分组?

2024-01-11

我想做的是将 2 组客户分组并让他们相互沟通。因此,如果 2 个客户端连接,它们只能相互通信,如果第三个客户端连接,它将无法与其他 2 个客户端通信,但会创建另一组 2 个客户端,依此类推...对现在,如果客户端发送消息,它会将其发送给所有客户端,但我不知道如何使其像上面描述的那样工作。消息是通过在控制台中键入内容从客户端发送的。

server:

public class Server extends Thread{

public final static int PORT = 7331;
private final static int BUFFER = 1024;

private DatagramSocket socket;
private ArrayList<InetAddress> clientAddresses;
private ArrayList<Integer> clientPorts;
private HashSet<String> existingClients;

public Server() throws IOException {
    socket = new DatagramSocket(PORT);
    System.out.println("[SERVER] UDP server successfully launched on port " + PORT);
    
    clientAddresses = new ArrayList<InetAddress>();
    clientPorts = new ArrayList<Integer>();
    existingClients = new HashSet<String>();
}

public void run() {
    byte[] buf = new byte[BUFFER];
    while (true) {
        try {
            //resets buffer so only new messages get displayed
            Arrays.fill(buf, (byte) 0);
            
            DatagramPacket packet = new DatagramPacket(buf, buf.length);
            socket.receive(packet);

            String content = new String(buf, buf.length);

            InetAddress clientAddress = packet.getAddress();
            int clientPort = packet.getPort();

            String id = clientAddress.toString() + "," + clientPort;
            if (!existingClients.contains(id)) {
                existingClients.add(id);
                clientPorts.add(clientPort);
                clientAddresses.add(clientAddress);
            }

            System.out.println(id + " : " + content);
            byte[] data = (id + " : " + content).getBytes();
            for (int i = 0; i < clientAddresses.size(); i++) {
                InetAddress cl = clientAddresses.get(i);
                int cp = clientPorts.get(i);
                packet = new DatagramPacket(data, data.length, cl, cp);
                socket.send(packet);
            }
        } catch (Exception e) {
            System.err.println(e);
        }
    }
}

public static void main(String args[]) throws Exception {
    Server s = new Server();
    s.start();
}
}

clients:

public class Client implements Runnable {

public static void main(String args[]) throws Exception {
    String host = "127.0.0.1";

    DatagramSocket socket = new DatagramSocket();
    
    //handles the receiving part for every client (incoming packets to clients)
    MessageReceiver r = new MessageReceiver(socket);
    
    Client s = new Client(socket, host);
    Thread rt = new Thread(r);
    Thread st = new Thread(s);
    rt.start();
    st.start();
}



public final static int PORT = 7331;
private DatagramSocket sock;
private String hostname;

Client(DatagramSocket s, String h) {
    sock = s;
    hostname = h;
}

//sending clients socket to server
private void sendMessage(String s) throws Exception {
    //getting bytes from message
    byte buf[] = s.getBytes();
    
    //getting hostname from server
    InetAddress address = InetAddress.getByName(hostname);
    
    //setting up packet
    DatagramPacket packet = new DatagramPacket(buf, buf.length, address, PORT);
    
    //sending packet to server
    sock.send(packet);
}

public void run() {
    //connected boolean is used to send a greetings message once for every new client that has joined
    boolean connected = false;
    
    do {
        try {
            sendMessage("GREETINGS");
            connected = true;
        } catch (Exception e) {

        }
    } while (!connected);
    
    //reads from the console
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    
    while (true) {
        try {
            while (!in.ready()) {
                Thread.sleep(100);
            }
            
            //sends message from console to server
            sendMessage(in.readLine());
        } catch (Exception e) {
            System.err.println(e);
        }
    }
}
}

//this class handles receiving part of clients
class MessageReceiver implements Runnable {
DatagramSocket sock;
byte buf[];

MessageReceiver(DatagramSocket s) {
    sock = s;
    buf = new byte[1024];
}

public void run() {
    while (true) {
        try {
            DatagramPacket packet = new DatagramPacket(buf, buf.length);
            sock.receive(packet);
            String received = new String(packet.getData(), 0, 
            packet.getLength());
            System.out.println(received);
        } catch (Exception e) {
            System.err.println(e);
        }
    }
}
}

您正在尝试的是消息广播或消息中继器客户端。 广播是在网络层实现的(使用广播本地网络广播地址)。

如果您以这种方式实现,当您有两个以上的客户端时,您的网络就会被淹没。向您的网络管理员致以最诚挚的问候。 ;-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何对 2 个 udp 客户端进行分组? 的相关文章

  • 使用 Java 在 WebDriver 中按 Ctrl+F5 刷新浏览器

    我已经使用 java 刷新了 WebDriver 中的浏览器 代码如下 driver navigate refresh 如何使用 Java 在 WebDriver 中按 Ctrl F5 来做到这一点 我认为您可以使用 WebDriver 和
  • 在哪里可以获得有关 Java FitNesse 和 Slim 的一些教程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Java、Oracle 中索引处缺少 IN 或 OUT 参数:: 1 错误

    您好 我使用 Netbeans 8 0 2 和 Oracle 11g Express Edition 在 JSF 2 2 中编写了一个图书馆管理系统 我有几个名为 书籍 借阅者 等的页面 以及数据库中一些名为相同名称的表 我的问题是这样的
  • 将过滤器添加到 Eclipse 中的 Project Explorer

    我想向 Project Explorer 添加一个新的过滤器 以向用户隐藏一些在 Eclipse RCP 应用程序中自动创建的项目 到目前为止我已经找到了两个扩展点 org eclipse ui ide resourceFilters 允许
  • 请参阅 Java EE eclipse 调试中的 POST 参数

    我在调试 Java EE 方面没有经验 我更像是一个 javascript 人 我需要查看哪些 HTTP POST 参数到达服务器端 我在表单将其操作指向的 jsp 文件中放置了一个断点 现在我在调试变量窗口中找不到 POST 内容 他们在
  • 字符串池可以包含两个具有相同值的字符串吗? [复制]

    这个问题在这里已经有答案了 字符串池可以包含两个具有相同值的字符串吗 String str abc String str1 new String abc Will the second statement with new operator
  • Java Microsoft Excel API [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • JFace ColumnWeigthData 导致父级增长

    我有一个 Eclipse RCP 应用程序 并且想要在TableViewer using ColumnWeigthData as ColumnLayoutData 问题是父表单 ScrolledForm在示例代码中 每当我布局表格时都会增加
  • 如何导入 org.apache.commons.lang3.ArrayUtils;进入 Eclipse [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我如何导入 org apache commons lang3 ArrayUtils 将库添加到 Ecl
  • 带有 OpenId 提供程序的 Java Spring 安全性

    我有一个 spring MVC 应用程序 另一个客户端应用程序想要使用 open id connect 访问我的 spring 应用程序 如何在服务器端实现开放ID提供商 请帮忙 MITREid 连接 OpenID Connect Java
  • 创建正则表达式匹配数组

    在Java中 我试图将所有正则表达式匹配返回到一个数组 但似乎您只能检查模式是否匹配某些内容 布尔值 如何使用正则表达式匹配来形成与给定字符串中的正则表达式匹配的所有字符串的数组 4城堡的回答 https stackoverflow com
  • 如何将 arraylist 从 servlet 传递到 javascript?

    我通过在属性中设置数组列表并将其转发到 jsp 来从 servlet 传递数组列表 Servlet ArrayList
  • JSch中如何设置文件类型和文件传输模式?

    我使用 Apache Common NetFTPClient并设置了我的ftpClient在上传文件之前使用如下所示的方法 ftpClient setFileType FTP BINARY FILE TYPE ftpClient setFi
  • 改变for循环的顺序?

    我遇到一种情况 我需要根据用户输入以不同的顺序循环遍历 xyz 坐标 所以我是 3D 空间中的一个区域 然后是一组像这样的 for 循环 for int x 0 x lt build getWidth x for int y 0 y lt
  • Android Gradle 同步失败:无法解析配置“:classpath”的所有工件

    错误如下 Caused by org gradle api internal artifacts ivyservice DefaultLenientConfiguration ArtifactResolveException Could n
  • 了解 Spark 中的 DAG

    问题是我有以下 DAG 我认为当需要洗牌时 火花将工作划分为不同的阶段 考虑阶段 0 和阶段 1 有些操作不需要洗牌 那么为什么 Spark 将它们分成不同的阶段呢 我认为跨分区的实际数据移动应该发生在第 2 阶段 因为这里我们需要cogr
  • 如何初始化静态地图?

    你会如何初始化静态Map在Java中 方法一 静态初始化方法二 实例初始化 匿名子类 或者 还有其他方法吗 各自的优点和缺点是什么 这是说明这两种方法的示例 import java util HashMap import java util
  • 公共方法与公共 API

    在干净的代码书中 有一个观点是 公共 API 中的 Javadocs 同样 Effective java 一书也有这样的内容 项目 56 为所有公开的 API 元素编写文档注释 所以这就是我的问题 所有公共方法都被视为公共 API 吗 它们
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific
  • 春季 CORS。在允许的来源中添加模式

    查看CORS的弹簧指南 以下代码启用所有允许的来源 public class MyWebMVCConfigurer extends WebMvcConfigurerAdapter Override public void addCorsMa

随机推荐

  • FFMPEG 套件 iOS 异步调用未异步运行

    当我打电话给executeAsync的方法FFmpegKit我期望异步行为 但代码会运行但从不等待FFmpegKit executeAsync运行 因此 程序输出来自print FFmpeg process exited with stat
  • 将值添加到数据框的所有行

    我有两个熊猫数据框df1 长度为 2 和df2 长度约 30 行 df1 的索引值始终不同 并且不会出现在 df2 中 我想添加来自的列的平均值df1到相应的列df2 示例 将 0 6 添加到 c1 的所有行 将 0 9 添加到 c2 的所
  • 获取 Data.ByteString.Builder 的长度

    我有一个函数tabulate它接受一个对象列表以及将这些对象的字段转换为函数的列表Builders 它返回一个Builder代表一个格式良好的表格 例如 tabulate a gt Builder gt a gt Builder tabul
  • Android Studio 将 2 个 .aar 合二为一

    我有一个 Android Studio 库项目 它依赖于另一个库项目 顶级项目依赖于第二个库项目的代码和资源 当在客户端应用程序中仅使用顶级库项目 aar 时 找不到第二个库项目中的资源 那么在这种情况下我们是否必须始终使用 2 个 aar
  • 使用 PDO 与 Postgresql 连接速度慢

    我正在使用 php7 4 fpm 连接到 PostgreSQL 12 3 Ubuntu 12 3 1 pgdg18 04 1 当我使用 pgadmin4 时 查询在 129 毫秒内执行 结果立即显示在屏幕上 在 php 上执行相同的查询大约
  • Java android AsyncHttpClient 如何设置标头“Accept”“application/xml”或“application/json”

    我不知道如何为 applicatjon json 设置标头 Accept 现在我来自服务器的响应是 xml 但我想要一个 json 当我设置标头时 服务器应该向我发送一个 xml 这是我的代码 final JSONObject reques
  • WPF:动态视图/内容

    我是 WPF 的初学者 所以我问这个 假设我有一个窗口 在窗口内我想要有一些类似容器的东西 可以只是边框 也可以是面板 用 winform 术语来说 容器的内容绑定到所选选项 例如 按钮 因此 例如 当用户选择选项 1 时 容器显示图表 当
  • 做像 Twitter、Hash-Bang #! 这样的链接网址[重复]

    这个问题在这里已经有答案了 可能的重复 Facebook 和新 Twitter URL 中的 shebang hashbang 有何用途 https stackoverflow com questions 3009380 whats the
  • Django表单和html表单有什么区别

    我正在基于 html 表单提交方法来处理我的 django 项目 但最近 我开始知道存在 django 形式 请让我知道它们之间有什么区别 在 Django 中编写表单最终会生成 HTML 表单 Django 表单可以绑定到一个模型 然后该
  • mysql 中的平均时间差

    在我的sql中是否有一个函数可以查找标准时间格式的平均时间差 您可以使用timestampdiff http dev mysql com doc refman 5 1 en date and time functions html func
  • 变量声明与定义

    我正在阅读一些关于外部人员的信息 现在作者开始提到变量的声明和定义 通过声明 他提到了以下情况 如果声明了一个变量 没有为其分配空间 现在这让我感到困惑 因为我认为MOST时代的 当我在 C 中使用变量时 我实际上是在定义和声明它们 对吗
  • 如何使用 Firebase 创建好友列表? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我一直在网上研究如何使用 firebase 创建朋友列表系统 到目前为止 我运气不佳 获得的资源并不完全是我想要的 该应用程序的前提是
  • 无法从 LinkedIn 应用程序获取访问令牌。它在 onActivityResult 中返回 null

    我正在使用 linkedIn android sdk 登录应用程序 但无法获取访问令牌 void startAutheniticate LISessionManager getInstance getApplicationContext i
  • 使用 64 位 llvm-gcc 构建 32 位

    我有 64 位版本的 llvm gcc 但我希望能够构建 32 位和 64 位二进制文 件 有这个标志吗 我尝试传递 m32 适用于常规 gcc 但收到如下错误消息 jay andesite llvm gcc m32 test c o te
  • Angular 9 - 删除 Angular Material Stepper 上的默认图标(创建)

    我在 Angular 中遇到了这个恼人的问题 我通过添加到provides页面的 provide STEPPER GLOBAL OPTIONS useValue displayDefaultIndicatorType false showE
  • Play 商店崩溃报告:android.view.View$DeclaredOnClickListener.onClick 上存在 IllegalStateException

    我的一个应用程序收到了一些 IllegalStateException 的崩溃报告 堆栈跟踪表明它来自 android view View DeclaredOnClickListener onClick view 我在测试或日常使用中从未遇
  • 在保持状态的同时切换片段

    决定重写这个问题 我有三个片段 称为 A B C 每个片段都有一个视图 其中包含一些字段供用户填写 用户应该能够使用菜单在不同的片段之间切换 如果用户在片段 A 中填写信息 然后切换到 C 填写更多信息 然后切换回 A 则用户在 A 中键入
  • 使用时间模块测量经过的时间

    使用python中的Time模块可以测量经过的时间吗 如果是这样 我该怎么做 我需要这样做 以便如果光标在小部件中停留一段时间 就会发生事件 start time time time your code elapsed time time
  • 使用 Windows 复制对话框进行复制

    我目前正在使用shutil copy2 复制大量图像文件和文件夹 0 5 到 5 GB 之间的任意位置 Shutil工作正常 但是太慢了 我想知道是否有办法将此信息传递到 Windows 来制作副本并为我提供其标准传输对话框 你知道 这个人
  • 如何对 2 个 udp 客户端进行分组?

    我想做的是将 2 组客户分组并让他们相互沟通 因此 如果 2 个客户端连接 它们只能相互通信 如果第三个客户端连接 它将无法与其他 2 个客户端通信 但会创建另一组 2 个客户端 依此类推 对现在 如果客户端发送消息 它会将其发送给所有客户