Java简易版:UDP协议实现群聊

news2024/11/29 10:31:43

 要先 运行服务端,在运行客户端,否则会报错。

服务端:

package 二十一章;



import java.io.*;
import java.net.*;
import java.util.ArrayList;
public class T{
   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());
           T bo = new T();
           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();
       }
   }
}

客户端: 

package 二十一章;


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");
       }
   }
}

运行结果:

 

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

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

相关文章

CMake是什么

文章目录 一.什么是CMake二.CMake安装三.CMake一个HelloWord-的语法介绍3.1 PROJECT关键字3.2 SET关键字3.3 MESSAGE关键字3.4 ADD_EXECUTABLE关键字3.5 include_directories关键字3.6 aux_source_directory 四.语法的基本原则4.1 语法注意事项 五.内部构建和外部构建5.1 外部构…

Python:核心知识点整理大全11-笔记

目录 ​编辑 6.2.4 修改字典中的值 6.2.5 删除键—值对 注意 删除的键—值对永远消失了。 6.2.6 由类似对象组成的字典 6.3 遍历字典 6.3.1 遍历所有的键—值对 6.3.2 遍历字典中的所有键 往期快速传送门&#x1f446;&#xff08;在文章最后&#xff09;&#xff1a; 6.…

file-saver 的使用

简介 FileSaver.js 是在客户端保存文件的解决方案&#xff0c;非常适合在客户端生成文件的 Web 应用程序 基本使用 以下内容基于官方文档&#xff0c;官方文档传送门https://gitcode.net/mirrors/eligrey/FileSaver.js 注意&#xff1a;存在文件保存的大小限制&#xff0c;具…

入门深度学习真的这么难吗?

今天微信私信回答了一个同学的问题&#xff1a;&#xff1f;我在入门深度学习的过程中&#xff0c;从配环境到 debug 全是坑&#xff0c;解决问题的时间远超跑模型的时间&#xff0c;为什么入门深度学习这么难&#xff1f; 这个问题真的问到我的心坎里了&#xff0c;我只能说&…

Python轴承故障诊断 (二)连续小波变换CWT

目录 前言 1 连续小波变换CWT原理介绍 1.1 CWT概述 1.2 CWT的原理和本质 2 基于Python的CWT实现与参数对比 2.1 代码示例 2.2 参数介绍和选择策略 2.2.1 尺度长度&#xff1a; 2.2.2 小波函数&#xff08;wavelet&#xff09;&#xff1a; 2.3 凯斯西储大学轴承数据的…

御剑工具学习

御剑 1.1 工具的下载路径1.2 工具的安装流程1.3 工具的详细使用 1.1 工具的下载路径 百度网盘 链接&#xff1a;https://pan.baidu.com/s/1Bn7GtWb7AStcjzVahFOjSQ 提取码&#xff1a;zkaq 1.2 工具的安装流程 御剑不用安装&#xff0c;直接下载下来解压&#xff0c;双击“御…

【Java实现百钱买百鸡的两种写法】

Java实现百钱买百鸡的两种写法 Java双重嵌套for循环实现百钱买百鸡的写法&#xff08;一&#xff09;Java三重嵌套for循环实现百钱买百鸡的写法&#xff08;二&#xff09; Java双重嵌套for循环实现百钱买百鸡的写法&#xff08;一&#xff09; //定义一个记录循环次数变量int …

C语言指针基础题(一)

目录 例题一题目解析答案 例题二题目解析答案 例题三题目解析答案 例题四题目解析答案 例题五题目解析答案 例题六题目解析答案 例题七题目解析答案 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x…

202301209将RK3399的挖掘机开发板在Android10下设置系统默认为24小时制

202301209将RK3399的挖掘机开发板在Android10下设置系统默认为24小时制 2023/12/9 22:07 应该也可以适用于RK3399的Android12系统 --- a/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/frameworks/base/packages/SettingsProvider/res/values/default…

docker安装node及使用

文章目录 一、安装node二、创建node容器三、进入创建的容器如有启发&#xff0c;可点赞收藏哟~ 一、安装node 查看可用版本 docker search node安装最新版本 docker install node:latest二、创建node容器 docker run -itd --name node-test node–name node-test&#xff1…

10款装系统启动工具

1、GhostWin10 PE&#xff1a; GhostWin10 PE主要适用于安装Windows 10操作系统。它是一个基于Ghost Win10制作的PE系统&#xff0c;提供了安装Windows 10的功能 2、老毛桃PE&#xff1a; 老毛桃PE适用于各种Windows操作系统的安装和修复。它是一个基于Windows PE环境的工具…

epoll实现同时承载100w客户端的数量

概念 先表明&#xff0c;这里是让epoll能够同时承受100w的连接&#xff0c;不针对业务处理。 对于百万并发的业务处理&#xff0c;其前提条件就是要同时承受住100w的连接。 程序源码 epoll的源码直接给出来 /*支持百万并发的 reactor1.其主要限制在于Linux系统的限制,需要修改一…

小白教学!几个步骤入门AI动画视频制作

公众号&#xff1a;算法一只狗 文章目录 文本视频生成软件&#xff1a;PIKA小黑子表情包熊猫头表情包 动画视频制作故事和分镜文本制作动画生成与拼接 总结 要介绍动画生成之前&#xff0c;先让大家来看看我生成的动画视频&#xff1a; AI动画生成故事 上面的视频我只用了不到2…

Android12 WIFI 无法提供互联网连接

平台 RK3588 Android 12 问题描述 ConnectivityService是Android系统中负责处理网络连接的服务之一。它负责管理设备的网络连接状态&#xff0c;包括Wi-Fi、移动数据、蓝牙等。 在Android系统中&#xff0c;ConnectivityService提供了一些关键功能&#xff0c;包括但不限于…

Docker部署开源分布式任务调度平台DolphinScheduler并实现远程访问办公

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问&#xff0c;结合内…

【Java期末复习资料】(2)常见例题 //持续更新

本文章主要是常见例题&#xff0c;解析不会太详细&#xff0c;有问题、不会的可以给我发消息哦&#xff0c;后续会出模拟卷 常见例题&#xff1a; 1.下列跟Java技术平台有关的是&#xff08;ABD&#xff09; A.JVM B.JDK C.JPN D.JRE 2.面向对象的特征包括&#xff08;ACD&…

uniapp实战 —— 可滚动区域 scroll-view (自适配高度,下拉刷新)

自适配高度 自定义的顶部导航栏&#xff0c;可参考博文 https://blog.csdn.net/weixin_41192489/article/details/134852124 如图可见&#xff0c;在页面滚动过程中&#xff0c;顶部导航栏和底栏未动&#xff0c;仅中间的内容区域可滚动。 整个页面的高度设置为 100%&#xf…

【SQL开发实战技巧】系列(四十九):Oracle12C常用新特性☞表分区部分索引(Partial Indexes)

系列文章目录 【SQL开发实战技巧】系列&#xff08;一&#xff09;:关于SQL不得不说的那些事 【SQL开发实战技巧】系列&#xff08;二&#xff09;&#xff1a;简单单表查询 【SQL开发实战技巧】系列&#xff08;三&#xff09;&#xff1a;SQL排序的那些事 【SQL开发实战技巧…

漏洞复现-用友NC任意文件上传漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

架构LNMP

目录 1.安装Nginx服务 2.安装 MySQL 服务 3.安装配置 PHP 解析环境 4.部署 Discuz&#xff01;社区论坛 Web 应用 1.安装Nginx服务 实验准备 systemctl stop firewalld systemctl disable firewalld setenforce 0 安装依赖包 yum -y install pcre-devel zlib-devel gcc…