多人聊天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 的相关文章

随机推荐

  • 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