Java实现一个简单的本地群聊。可以多开Client。

news2024/9/22 21:14:44

网络编程也有趣的,Java中有对系统网络IO操作的封装包:Socket。现在我们在本地电脑(网络)用它来模拟一个简单的群聊功能,以便能更好地对网络编程进行深刻的理解。

"Client"去连接"Host",可同时多有多个"Client"去连接"Host";

在IDEA中,要多开一个程序(重复运行一个程序),可能需要关闭配置的"single instance only",或者打开"Allow parallel run"。

f3566c62fd8040ce8393b53efbfcb3a9.png

408ff2ddeb814f789b6cdd3b07c79bbe.png

即可实现应用多开(并行运行)。

这是一个服务主机端的模拟代码:

/**
 * @ Annotation:模拟服务器,实现群聊(群发)
 */
public class Host {
    public static void main(String[] args) {
        try {
            System.out.println("Host start");
            List<Socket> onlineSocket = new ArrayList<>();
            //assign port:8898
            ServerSocket server = new ServerSocket(8898);
            while (true) {
                Socket socket = server.accept();//monitor port:8898
                System.out.println("a client:" + socket.getRemoteSocketAddress() + " online");
                new Thread(() -> {
                    System.out.println("current thread id of host for new client is:" + Thread.currentThread().getId());
                    try {
                        InputStream is = socket.getInputStream();
                        DataInputStream dis = new DataInputStream(is);
                        while (true) {
                            try {
                                String content = dis.readUTF(dis);
                                System.out.println(content);
                                //static content
                                for (Socket oc : onlineSocket) {
                                    OutputStream os = oc.getOutputStream();
                                    DataOutputStream dos = new DataOutputStream(os);
                                    dos.writeUTF(content);
                                    dos.flush();
                                }
                            } catch (Exception e) {
                                System.out.println("a client:" + socket.getRemoteSocketAddress() + "offline");
                                onlineSocket.remove(socket);
                                dis.close();
                                socket.close();
                                break;
                            }

                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }).start();
                onlineSocket.add(socket);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这是一个客户端的模拟代码: 

/**
 * @ Author Jam·Li
 * @ Date 2024/9/8 19:13
 * @ version 1.0.0
 * @ Annotation:模拟客户端,可多开
 */
public class Client {
    public static void main(String[] args) {
        try {
            //Socket client = new Socket(InetAddress.getLocalHost(), 8898);
            Socket client = new Socket("127.0.0.1", 8898);
            new Thread(()->{
                try {
                    InputStream is = client.getInputStream();
                    DataInputStream dis = new DataInputStream(is);
                    while (true){
                        try {
                            String msg = dis.readUTF(dis);
                            System.out.println(msg);
                        } catch (Exception e) {
                            dis.close();
                            client.close();
                            System.out.println("I offline: "+client.getRemoteSocketAddress()+" now.");
                            break;
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }).start();
            OutputStream os = client.getOutputStream();
            DataOutputStream dos = new DataOutputStream(os);
            Scanner scanner = new Scanner(System.in);
            while (true){
                System.out.println("Input Content Please");
                String msg = scanner.nextLine();
                dos.writeUTF(msg);
                dos.flush();
                System.out.println("Sent.");
                if (msg.equals("Bye")){
                    client.close();
                    dos.close();
                    System.out.println("See you~");
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 先打开服务主机端:

9524d445e4954b708dd0ae747c9e2cd5.png

再打开客户端:

 9119efaab13d4f25b023fb60e8d5f915.png

多开客户端: 

662395c30dcb45a6939faea3cfb9e482.png

 5db471e848d64463822f6739b0f4ee63.png

81ca533894174bddb003eba5f0be61db.png

b1e2105edd3040a5aed250a406a2b235.png

6e7d82d0962941eb9e898b8cad0dcd74.png

27bfb0f2d8f948549fe8f70456e07a11.png

1568975b974648d2aaab38b742677228.png296c9c7f5ea14200a651bc0e1e87e82c.png 

如果此文对有帮助,请一键三连,点赞收藏加关注!作者后续会更新更多高质量文章哦!谢谢! 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2117473.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaEE 第23节 TCP的流量控制与阻塞控制详解

目录 前言&#xff08;必读&#xff09;1、滑动窗口背景运行机制 2. 流量控制作用实现机制关键目标 3. 拥塞控制作用实现机制作用 4. 流量控制和拥塞控制的区别作用对象不同触发条件不同控制方式不同 5.总结 前言&#xff08;必读&#xff09; 流量控制&#xff08;Flow Contr…

中科院院士薛其坤:通用量子计算机还得10-20年

说到量子计算机&#xff0c;很多人都抱有不切实际的幻想&#xff0c;甚至认为它无所不能&#xff0c;很快就能取代现有的电子计算机&#xff0c;但事实上&#xff0c;目前的量子计算机只能高效解决特定问题&#xff0c;不具备通用性。在2024年浦江创新论坛上&#xff0c;2023年…

linux日志备份

什么是日志文件?为什么要设立日志文件? 1、日志文件是用来记录事务对数据库的更新操作的文件。2、设立日志文件的目的是: 进行事务故障恢复;进行系统故障恢复;协助后备副本进行介质故障恢复。 但是&#xff0c;随着时间&#xff0c;日志文件内存过于增加&#xff0c;将会导…

creating chat agent with langchain and openai getting no attribute error

题意&#xff1a; 使用 LangChain 和 OpenAI 创建聊天代理时遇到“没有属性错误”&#xff08;Getting "no attribute" error when creating a chat agent with LangChain and OpenAI&#xff09; 问题背景&#xff1a; Im trying to test a chat agent using the …

基于springboot+vue的工作量统计系统(全套)

传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装工作量统计系统软件来发挥其高效地信息处理的作用&#xff0c;可以…

java后端开发的DO、DTO、BO、AO、VO、POJO定义

1.常用文件夹命名规则 pojo&#xff1a; &#xff08;1&#xff09;vo &#xff08;与前端交互的所有对象&#xff0c;包括接参和返回&#xff09; &#xff08;2&#xff09;query &#xff08;查询的筛选条件&#xff0c;前端传参和后端内部传参通用&#xff09; &#x…

[计算机基础四大件学习笔记]计算机组成原理

文章总览&#xff1a;YuanDaiMa2048博客文章总览 计算机基础四大件学习笔记 说明&#xff1a;虽然学习过计算机组成与系统结构、操作系统、计算机网络以及数据结构这四门课程&#xff0c;但是对于这四门课的结合和实际中的应用还是模糊的&#xff0c;因此x想通过网上的一些视频…

Rust语言初探:WebAssembly 入门

Rust语言初探&#xff1a;WebAssembly 入门 前言 在我的印象中&#xff0c;Rust 一直是比较底层的语言&#xff0c;例如在操作系统底层、高性能中间件等底层场景才会看到它的身影。 然而&#xff0c;随着技术的发展&#xff0c;Rust 也开始在前端场景如 WebAssembly 中崭露头…

大数据Flink(一百一十五):Flink SQL的基本概念

文章目录 Flink SQL的基本概念 一、​​​​​​​SQL 中表的概念 二、​​​​​​​​​​​​​​SQL 临时表、永久表 三、​​​​​​​​​​​​​​SQL表类型的定义 四、​​​​​​​​​​​​​​常见的连接器 五、​​​​​​SQL数据视图 1、​​​​​​…

校园气膜馆助力青少年体质发展:少年强则国强—轻空间

青少年是国家的未来&#xff0c;体质的强健与否&#xff0c;直接关系到国家的竞争力和可持续发展。在现代社会&#xff0c;学习和压力并存&#xff0c;青少年的体育锻炼时间不断被压缩&#xff0c;如何提供更为优质的体育设施&#xff0c;帮助他们增强体质&#xff0c;成为学校…

【C/C++】“秒懂”学C/C++不可错过的“经典编程题” — 日期类的经典运用 (含题链接)

“秒懂”学C/C不可错过的“经典编程题” — 日期类的经典运用 (含题链接&#xff09; 1. 计算日期到天数转换(1). 解题思路&#xff1a;(2). 代码实现&#xff1a; 2. 打印日期(1). 解题思路&#xff1a;(2). 代码实现&#xff1a; 3. 日期累加(1). 解题思路&#xff1a;(2). 代…

Java 设计模式-状态模式

目录 一. 概述 二. 主要角色 三. 代码示例 四. 优缺点 优点&#xff1a; 缺点&#xff1a; 五. 常见应用场景 一. 概述 状态模式是一种行为设计模式&#xff0c;它允许一个对象在其内部状态改变时改变它的行为。对象看起来好像修改了它的类。状态模式把所有的与一个特定…

AES算法与接口解密

文章目录 AES算法基本介绍加密模式模式与IV 接口响应AES解密 AES算法 基本介绍 高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法。 对称加密算法中加解密密钥都是一样的。 AES 的主要特性&#xff1a; 块加密&#xff1a;AES 是一种分组加密算法&…

Vue day-04

目录 一. vue组件 1.1 为什么用组件 1.2 vue组件 1.3 基础使用 1.4 全局 - 注册使用 1.5 局部 - 注册使用 1.4 用less写的样式 二. Vue组件之间传值(重点) 2.1 父组件向子组件传值 2.2 子组件向父组件传值 2.3 兄弟之间的传递 三. vue生命周期 3.1 含义 3.2 钩子…

phpmyadmin报错mysqli::real_connect(): (HY000/1045): Access denied for user ‘

问题分析 这是因为本身还安装了MySQL&#xff0c;导致发生冲突&#xff0c;只需要找到自己安装的进行关闭即可 方法 在任务管理器(快捷键&#xff1a;ctrlaltdelete)-服务中&#xff0c;找到对应的MySQL进行关闭

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端&#xff0c;一般来说需要版本检测和自动更新功能&#xff0c;这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤&#xff1a; 读取本地应用版本拉取远程版本并比较两个版本如果需要升级&…

数字化转型的战略规划应该怎么做?(附IBM-IT战略规划方法论PPT下载)

IBM-IT战略规划方法论PPT-下载链接见文末~ 数字化转型的战略规划是一个系统而复杂的过程&#xff0c;需要从多个维度进行考虑和规划。以下是一些关键步骤和建议&#xff0c;以帮助企业制定有效的数字化转型战略规划&#xff1a; 1. 明确数字化转型愿景和目标 设定愿景&#…

基于ONSEMI电源管理芯片NCP1607之AC300V高输入电压36W调色温智能电源

NCP1607PFC在LED智能电源PFC处理部分性价比高&#xff0c;输入电压范围宽到AC90-300V,母线电压420V导致高压低电流整机光效高&#xff0c;成熟芯片可靠新高&#xff0c;没有任何纹波与频闪&#xff0c;智能护眼。 ►场景应用图 ►产品实体图 ►展示板照片 ►方案方块图 ►核心…

常见概念 -- OPA与插损预置

OPA基本原理 OPA功能&#xff0c;即光功率调节(Optical Power Adjust)&#xff0c;在新建光层业务时使用。 ​单板正常工作后&#xff0c;在网管上创建单站光交叉时&#xff0c;可以创建自动模式的光交叉&#xff0c;即启动OPA功能。OPA功能通过软件计算&#xff0c;自动调节交…

MACD指标精讲PART1:MACD指标入门及使用法则

一、MACD指标入门 MACD&#xff08;Moving Average Convergence Divergence&#xff09;指标称为指数平滑异同移动平均线指标&#xff0c;是由Geral Apple所创造&#xff0c;用来跟踪股价运行趋势、判断股票买卖时机的技术分析工具。 MACD指标由DIFF线&#xff08;Difference线…