多人聊天Java

2023-12-19

服务端

 
 
import java.io.*;
import java.net.*;
import java.util.ArrayList;
public class Server{
    public static ServerSocket server_socket;
    public static ArrayList<Socket> socketList=new ArrayList<Socket>();  
    public static void main(String []args){
        try{
            server_socket = new ServerSocket(5000);
            while(true){
                Socket socket = server_socket.accept();
                socketList.add(socket); //把sock对象加入sock集合
                ServerBO_Thread st=new ServerBO_Thread(socket,socketList); //初始化多线程
                st.start();//启动多线程
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }finally{
            try{
                if(server_socket!=null){
                    server_socket.close();
                }
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
    }
    public void encryptWrite(String src,DataOutputStream output)throws IOException{
        //将一个字符串转化为字符数组
        //System.out.println(src);
        char[] char_arr = src.toCharArray();
        //加密操作
        for(int i = 0;i<char_arr.length;i++){
            output.writeChar(char_arr[i]+13);
        }
        //用作结束标志符
        output.writeChar(2333);
        output.flush();
    }
    //读取并解密
    public String readDecrypt(DataInputStream input)throws IOException{
        String rtn="";
        while(true){
            int char_src =input.readChar();
            if(char_src!=2333){
                rtn=rtn+(char)(char_src-13);
            }else{
                break;
            }
        }
        return rtn;
    }
}
class ServerBO_Thread extends Thread{
    Socket client = null;
    ArrayList<Socket> clients;
    ServerBO_Thread(Socket s,ArrayList<Socket> ss){//初始化
        client=s;
        clients=ss; 
    }
    public void run(){
        DataInputStream input = null;
        DataOutputStream output =null;
        try{
            input = new DataInputStream(client.getInputStream());
            Server bo = new Server();
            String receive=null;
            String send=null;
            while(true){//监视当前客户端有没有发来消息
                if(!client.isClosed()){
                    receive=bo.readDecrypt(input);
                    clients.trimToSize();
                    String[] param = receive.split("&");
                    if(")start".equals(param[1])){    //分析客户端发来的内容
                        send = param[0]+"进入聊天室";
                    }else{
                        send = param[0]+"说:    "+param[1];
                    }
                    if(!("3333".equals(param[1]))){//3333为退出聊天室信号
                        for(Socket socket:clients){ //遍历socke集合 
                            //把读取到的消息发送给各个客户端  
                            if(!socket.isClosed()){
                                output = new DataOutputStream(socket.getOutputStream());
                                bo.encryptWrite(send,output);
                            }
                        }  
                    }else{//如果有客户端退出
                        for(Socket socket:clients){ //遍历socke集合 
                                if(socket!=client){//告诉其他人此人退出聊天室
                                    if(!(socket.isClosed())){
                                        output = new DataOutputStream(socket.getOutputStream());
                                        bo.encryptWrite(param[0]+"已退出聊天室",output);
                                    }
                                }
                            }
                        output = new DataOutputStream(client.getOutputStream());
                        bo.encryptWrite("3333",output);//返回信号给要退出的客户端,然后关闭线程
                        client.close();
                        input.close();
                        output.close();
                    }
                }else{
                    break;
                }
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
}

用户端

 
import java.io.IOException;
import java.util.Scanner;
import java.net.*;
import java.io.*;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.DataOutputStream;
public class People{
//服务端ip
    public  String ip = "127.0.0.1";
    //服务端端口
    public  int port = 5000;
    public  DataOutputStream output = null;
    public  Socket socket = null;
    public  DataInputStream input = null;
    public  Scanner sc =new Scanner (System.in);
    public  String send ;
    public  String receive;
    public  String name;
    public String sd = null;
    public static void main(String[]aa){
        People po = new People();
        po.start();
    }
    public void start(){
        try{
            System.out.println("*******欢迎使用匿名聊天室!**********");
            System.out.println("请输入你将要使用的昵称:");
            name=sc.nextLine();//获取昵称
            socket = new Socket(ip,port);
            output=new DataOutputStream(socket.getOutputStream());
            input = new DataInputStream(socket.getInputStream());
            send = name+"&)start";//把昵称发送到server 告诉所有人有新成员加入聊天室
            System.out.println("(如果要退出聊天室请输入“3333”!)");
            System.out.println("*******成功进入匿名聊天室!**********");
            System.out.println("");
            encryptWrite(send,output);
            Out out=new Out(output,name,input,socket);
            out.start();//启动发送聊天内容的多线程
            while(true){    
                String receive = readDecrypt(input);
                if("3333".equals(receive)){//如果收到“3333”则退出聊天室
                    System.out.println("*******成功退出匿名聊天室!**********");
                    input.close();
                    output.close();
                    socket.close();
                    System.exit(0);
                }
                System.out.println(receive);
            }
        }catch(Exception ex){
                ex.printStackTrace();
        }finally{
            try{
                if(socket!=null) socket.close();
                input.close();
                output.close();
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }    
    }
    public void encryptWrite(String src,DataOutputStream output)throws IOException{
        //将一个字符串转化为字符数组
        char[] char_arr = src.toCharArray();
        //加密操作
        for(int i = 0;i<char_arr.length;i++){
            output.writeChar(char_arr[i]+13);
        }
        //用作结束标志符
        output.writeChar(2333);
        output.flush();
    }
    //读取并解密
    public String readDecrypt(DataInputStream input)throws IOException{
        String rtn="";
        while(true){
            int char_src =input.readChar();
            if(char_src!=2333){
                rtn=rtn+(char)(char_src-13);
            }else{
                break;
            }
        }
        return rtn;
    }
}
class Out extends Thread {
    public DataOutputStream output;
    public DataInputStream input;
    public static String name;
    public Socket socket;
    public  Scanner sc =new Scanner (System.in);
    Out(DataOutputStream ot,String n,DataInputStream it,Socket socket){
        output=ot;
        input=it;
        name=n;
    }
    public void run(){
        People po = new People();
        try{
            while(true){
                String send=sc.nextLine();//获取用户输入
                String send2=name+"&"+send;//把聊天内容打包成约定形式
                po.encryptWrite(send2,output);
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }finally{
            System.out.println("sfef");
        }
    }
}

运行结果如下:

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

多人聊天Java 的相关文章

  • Netbeans 8.1 Gnome 3 GTK+ UI 字体和选项卡高度

    我刚刚在运行 GNOME 3 桌面的 Ubuntu 16 04 上安装了 NetBeans 8 1 如果可能的话 我想继续使用 IDE 的 GTK 外观和感觉 但 UI 上的字体 尤其是选项卡中的字体 太小且重叠 我尝试添加 fontsiz
  • 有没有创建 Cron 表达式的 Java 代码? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要一个 Java 代码来根据用户输入创建一个 cron 表达式 用户输入是时间 频率和执行次数 只需从评论中添加 自己创建 即可
  • TreeMap 删除所有大于某个键的键

    在项目中 我需要删除键值大于某个键的所有对象 键类型为Date 如果重要的话 据我所知TreeMapJava中实现的是红黑树 它是一种二叉搜索树 所以我应该得到O n 删除子树时 但除了制作尾部视图并一一删除之外 我找不到任何方法可以做到这
  • java.lang.ClassNotFoundException:javax.mail.MessagingException

    我想使用 eclipse 将电子邮件从我的 gmail 帐户发送到另一个邮件帐户 我使用 apache tomcat 7 0 34 作为我的 Web 服务器 并使用端口 8080 作为 apache 服务器 HTTP 1 1 并使用 JRE
  • 与 Eclipse 中的 Java Content Assist 交互

    作为我的插件项目的一部分 我正在考虑与 Eclipse 在 Java 文件上显示的内容辅助列表进行交互 我正在尝试根据一些外部数据对列表进行重新排序 我看过一些有关创建新内容辅助的教程 但没有看到有关更改现有内容辅助的教程 这可能吗 如果是
  • Thymeleaf 3 Spring 5 映射加载字符串而不是 HTML

    我正在尝试将 Spring 5 和 Thymeleaf 3 一起配置 我正在 Eclipse 上工作 我使用 全新安装 构建并使用 springboot run 运行应用程序 我已经设置了一个控制器和几个模板 但 Thymeleaf 似乎找
  • 如何在 Java 中向时间戳添加/减去时区偏移量?

    我正在使用 JDK 8 并且玩过ZonedDateTime and Timestamp很多 但我仍然无法解决我面临的问题 假设我得到了格式化的Timestamp在格林威治标准时间 UTC 我的服务器位于某处 假设它设置为Asia Calcu
  • Android中如何使用JNI获取设备ID?

    我想从 c 获取 IMEIJNI 我使用下面的代码 但是遇到了未能获取的错误cls 它总是返回NULL 我检查了环境和上下文 它们都没有问题 为什么我不能得到Context班级 我在网上搜索了一下 有人说我们应该使用java lang Ob
  • 如何在 ant 中为 junit 测试设置 file.encoding?

    我还没有完全完成file encoding 和 ant https stackoverflow com questions 1339352 how do i set dfile encoding within ants build xml
  • 如何将 HTML 链接放入电子邮件正文中?

    我有一个可以发送邮件的应用程序 用 Java 实现 我想在邮件中放置一个 HTML 链接 但该链接显示为普通字母 而不是 HTML 链接 我怎样才能将 HTML 链接放入字符串中 我需要特殊字符吗 太感谢了 Update 大家好你们好 感谢
  • 如何在JPanel中设置背景图片

    你好 我使用 JPanel 作为我的框架的容器 然后我真的想在我的面板中使用背景图片 我真的需要帮助 这是我到目前为止的代码 这是更新 请检查这里是我的代码 import java awt import javax swing import
  • hibernate 6.0.2.Final 和 spring boot 2.7.0 的entityManagerFactory bean 未配置问题

    所以最近我想升级我的 Spring Boot 项目项目的一些依赖项 特别是这些组件 雅加达 EE 9 弹簧靴2 7 休眠 6 0 2 Final 完成此操作后 所有更新和代码折射 更新将 javax 导入到 jakarta 以及一些 hib
  • Java Swing - 如何禁用 JPanel?

    我有一些JComponents on a JPanel我想在按下 开始 按钮时禁用所有这些组件 目前 我通过以下方式显式禁用所有组件 component1 setEnabled false 但是有什么办法可以一次性禁用所有组件吗 我尝试禁用
  • 部署 .war 时出现 Glassfish 服务器错误:部署期间发生错误:准备应用程序时出现异常:资源无效

    我正在使用以下内容 NetBeans IDE 7 3 内部版本 201306052037 爪哇 1 7 0 17 Java HotSpot TM 64 位服务器虚拟机 23 7 b01 NetBeans 集成 GlassFish Serve
  • 手动设置Android Studio的JDK路径

    如何为 Android Studio 使用自定义 JDK 路径 我不想弄乱 PATH 因为我没有管理员权限 是否有某个配置设置文件允许我进行设置 如果您查看项目设置 您可以从那里访问 jdk 在标准 Windows 键盘映射上 您可以在项目
  • 列表过滤器内的 Java 8 lambda 列表

    示例 JSON id 1 products id 333 status Active id 222 status Inactive id 111 status Active id 2 products id 6 status Active
  • java 中的蓝牙 (J2SE)

    我是蓝牙新手 这就是我想做的事情 我想获取连接到我的电脑上的蓝牙的设备信息并将该信息写入文件中 我应该使用哪个 api 以及如何实现 我遇到了 bluecove 但经过几次搜索 我发现 bluecove 不能在 64 位电脑上运行 我现在应
  • Java 正则表达式中的逻辑 AND

    是否可以在 Java Regex 中实现逻辑 AND 如果答案是肯定的 那么如何实现呢 正则表达式中的逻辑 AND 由一系列堆叠的先行断言组成 例如 foo bar glarch 将匹配包含所有三个 foo bar 和 glarch 的任何
  • Android View Canvas onDraw 未执行

    我目前正在开发一个自定义视图 它在画布上绘制一些图块 这些图块是从多个文件加载的 并将在需要时加载 它们将由 AsyncTask 加载 如果它们已经加载 它们只会被绘制在画布上 这工作正常 如果加载了这些图片 AsyncTask 就会触发v
  • 由 Servlet 容器提供服务的 WebSocket

    上周我研究了 WebSockets 并对如何使用 Java Servlet API 实现服务器端进行了一些思考 我没有花费太多时间 但在使用 Tomcat 进行一些测试时遇到了以下问题 如果不修补容器或至少对 HttpServletResp

随机推荐

  • Mimikatz ERROR kuhl_m_sekurlsa_acquireLSA ; Key import

    原文链接 ERROR kuhl m sekurlsa acquireLSA Key import CSDN博客 报错原因 1 确定不是权限的问题 已是最高权限 2 确定不是UAC绕过的问题 已是HIGH GROUPS 3 环境为Win10系
  • 基于Spring Boot、Mybatis、Redis和Layui的企业电子招投标系统源码实现与立项流程

    招投标管理系统是一款适用于招标代理 政府采购 企业采购和工程交易等领域的企业级应用平台 该平台以项目为主线 从项目立项到项目归档 实现了全流程的高效沟通和协作 通过该平台 用户可以实时共享项目数据信息 实现规范化管理和有效监控 协同工作网络
  • 防止被坑!明理信息科技知识服务平台教你如何明智选择知识付费平台

    明理信息科技知识服务平台 随着知识经济的兴起 知识付费已经成为一种趋势 越来越多的人开始将自己的知识和技能进行变现 而知识付费小程序平台则成为了一个重要的渠道 然而 市面上的知识付费小程序平台琳琅满目 其中不乏一些不良平台 让老实人望而却步
  • 第二十一章网络通信总结博客

    网络程序设计基础 局域网与互联网 为了实现两台 计算机 的通信 必须用一个网络线路连接两台计算机 如下图所示 网络协议 1 IP协议 IP是Internet Protocol的简称 是一种网络协议 Internet 网络采用的协议是TCP
  • Vue3+Echarts:堆积柱状图的绘制

    一 需求 在Vue3项目中 想用Echarts来绘制堆积柱状图 去展示最近一周APP在不同渠道的登录人数 效果如下 二 实现 关于Echarts的下载安装以及图表的样式设计 此处不展开 1 Templates部分
  • 大语言模型(LLM)与 Jupyter 连接起来了!

    现在 大语言模型 LLM 与 Jupyter 连接起来了 这主要归功于一个名叫 Jupyter AI 的项目 它是官方支持的 Project Jupyter 子项目 目前该项目已经完全开源 其连接的模型主要来自 AI21 Anthropic
  • TimeGPT:时序预测领域终于迎来了第一个大模型

    时间序列预测领域在最近的几年有着快速的发展 比如N BEATS N HiTS PatchTST和TimesNet 大型语言模型 llm 最近在ChatGPT等应用程序中变得非常流行 因为它们可以适应各种各样的任务 而无需进一步的训练 这就引
  • SCADA助力食品加工数字化变革:未来产业的智慧引擎

    一 背景介绍 当前 在国际市场竞争加剧 消费者个性化需求突出的背景下 我国食品加工行业面临着诸多挑战 越发严苛的食品安全标准 追求供应链的透明度和效率 进一步提高产品质量和降低成本 等等 为了应对上述挑战 我国食品加工企业迫切需要利用先进的
  • 3d抄数逆向建模服务造纸机械叶轮三维扫描曲面建模-CASAIM

    在造纸机械中 叶轮是重要的组成部分 造纸机械叶轮在使用过程中会承受较大外力的摩擦 长期使用容易导致外观变形破损 从而降低叶轮的工作效率和精度 因此 定期生产制作同类型的造纸机械叶轮产品 以用于替换年久失修的旧产品 已成为越来越多造纸类企业的
  • 【网络安全】-Linux操作系统—操作系统发展历史与Linux

    操作系统发展历史 操作系统 Operating System 简称OS 是管理计算机硬件与软件资源的系统软件 它是计算机系统的核心与基石 操作系统的发展历史可以追溯到20世纪50年代 初期的操作系统 在计算机技术的早期 操作系统并不存在 那
  • mycat读写分离部署

    一 前言 mycat跟proxysql一样都是实现mysql主从架构的读写分离 提高mysql性能 也是具备主从读写的故障切换和读写分离功能 不过跟proxysql有区别的是 mycat用的是虚拟库映射后端真实数据库的用法 二 部署 部署m
  • 一对一聊天

    服务端 package 一对一用户 import java awt BorderLayout import java io BufferedReader import java io IOException import java io I
  • 基于生成对抗网络的图像修复技术研究

    随着数字技术的发展 图像修复技术在各个领域得到了广泛应用 然而 传统的图像修复方法容易出现过度模糊 失真等问题 限制了其在实际应用中的效果 近年来 基于生成对抗网络 GAN 的图像修复技术逐渐成为研究焦点 其通过引入对抗训练的思想 有效提高
  • Axure--中继器(增删改查)

    我是bing人 一个在CSDN分享笔记的博主 在这里 我要推荐给大家我的专栏 Axure 无论你是编程小白 还是有一定基础的程序员 这个专栏都能满足你的需求 我会用最 简 单易懂的语言 带你走进代码的世界 让你从零开始 一步步成为编程大师
  • 官网 Navicat Premium 历史版本官方下载地址

    Navicat Premium 客户端命名规则 是 navicat 大版本 2位 小版本 1位 premium cs x 32或者64位的系统 exe 比如 https download navicat com download navic
  • 证件照制作免费软件有哪些推荐?这几款小白也能轻松驾驭

    今天收到闺蜜急冲冲打来的电话 说让我帮忙找一家靠谱的照相馆 仔细一问 原来是她有个考试报名的照片不符合要求 需要重新拍摄 但是明天就要截止报名了 她害怕赶不上趟 所以才火急火燎地电话 轰炸 我 其实 遇到照片不符合要求的情况 不一定只有重新
  • 案例分享 | 3D开发工具HOOPS加速「全球知名矿业软件」可视化创新与突破!

    近日 某全球知名的三维矿业软件公司 以下简称 客户 与慧都科技携手合作 慧都将联合数字化合作伙伴 Tech Soft 3D HOOPS 为客户注入3D渲染及可视化核心动力 赋能客户产品实现在地质勘探 地质模型可视化等方向的创新与突破 构建强
  • 扬帆证券:股票代码开头有何含义?各板块股票开头代码是多少?

    股票代码开始有何意义 1 沪市主板 股票代码以600 601或603开始 2 深市主板 股票代码以000 001 002 003开始 3 创业板 股票代码以300开始 创业板归于深证市场 4 科创板 股票代码以688开始 科创板归于上证市场
  • 小节测验

    第1关 第一题 任务描述 本关任务 根据编程要求 完成任务 编程要求 打开右侧代码文件窗口 在 Begin 至 End 区域补充代码 完成任务 在 pyspark 中读取 Linux 系统本地文件 data bigfiles data tx
  • 多人聊天Java

    服务端 import java io import java net import java util ArrayList public class Server public static ServerSocket server sock