Java UDP 多人聊天室简易版

服务端

 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{
//服务端ippublic  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.mzph.cn/news/206485.shtml

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

相关文章

Rask AI引领革新,推出多扬声器口型同步技术,打造本地化内容新纪元

“ Rask AI是一个先进的AI驱动视频和音频本地化工具&#xff0c;旨在帮助内容创作者和公司快速、高效地将他们的视频转换成60多种语言。通过不断创新和改进产品功能&#xff0c;Rask AI正塑造着未来媒体产业的发展趋势。 ” 在多语种内容创作的新时代&#xff0c;Rask AI不断突…

Day53力扣打卡

打卡记录 重新规划路线&#xff08;dfs&#xff09; 链接 class Solution:def dfs(self, x: int, parent: int, e: List[List[List[int]]]) -> int:res 0for edge in e[x]:if edge[0] parent:continueres edge[1] self.dfs(edge[0], x, e)return resdef minReorder(se…

基于AWS Serverless的Glue服务进行ETL(提取、转换和加载)数据分析(三)——serverless数据分析

3 serverless数据分析 大纲 3 serverless数据分析3.1 创建Lambda3.2 创建API Gateway3.3 结果3.4 总结 3.1 创建Lambda 在Lambda中&#xff0c;我们将使用python3作为代码语言。 步骤图例1、入口2、创建&#xff08;我们选择使用python3.7&#xff09;3、IAM权限&#xff08;…

第二十一章——网络通信总结

网络程序设计基础 局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机。如下图所示 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#xff0c;其全称是Transmission…

展望2024年供应链安全

2023年是开展供应链安全&#xff0c;尤其是开源治理如火如荼的一年&#xff0c;开源治理是供应链安全最重要的一个方面&#xff0c;所以我们从开源治理谈起。我们先回顾一下2023的开源治理情况。我们从信通院《2023年中国企业开源治理全景观察》发布的信息。信通院调研了来自七…

渐进式web全栈blazor web

渐进式 vue是渐进式web前端框架&#xff0c;所谓的渐进式就是你不用一开始就整个项目全部使用vue&#xff0c;因为开始你可能并不熟悉vue&#xff0c;而是开始只使用vue的些简单功能&#xff0c;慢慢用它更复杂更好的功能&#xff0c;最终项目可能完全使用vue。 渐进式blazor…

1+x网络系统建设与运维(中级)-练习题4

一.设备命名 LSW1 <Huawei>sys [Huawei]sysn LSW1 [LSW1]un in en 同理可得&#xff0c;给所有设备如以上命令一样配置 二.VLAN LSW1 [LSW1]vlan ba 1 10 20 100 [LSW1]int g0/0/1 [LSW1-GigabitEthernet0/0/1]port link-type trunk [LSW1-GigabitEthernet0/0/1]port tru…

K线图详解

K线图是一种常用于股票、外汇和数字货币等金融市场的图表形式&#xff0c;它提供了价格走势的可视化展示。每根K线代表了一个特定时间周期内的价格变动情况。 每根K线由四个关键价格构成&#xff1a;开盘价&#xff08;Open&#xff09;、收盘价&#xff08;Close&#xff09;…

Redis 环境搭建

文章目录 第1关&#xff1a;Redis 环境搭建 第1关&#xff1a;Redis 环境搭建 编程要求 根据上述相关知识&#xff0c;在右侧命令行中完成 Redis 集群的部署与安装。 安装完成后&#xff0c;使用 echo “cluster nodes”|redis-cli -p 7001 -c >/root/test.txt 将结果保存。…

@德人合科技 | 数据透明加密防泄密系统\文件文档加密\设计图纸加密|源代码加密防泄密软件系统,——防止内部办公终端核心文件数据/资料外泄!

一款专业的数据防泄密管理系统&#xff0c;它采用了多种加密模式&#xff0c;包括透明加密、半透明加密和落地加密等&#xff0c;可以有效地保护企业的核心数据安全。 PC端访问地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee …

el-table操作栏按钮过多 增加展开/收起功能

是的 如图所示有那么一条数据 列表操作栏的按钮七八个 小屏笔记本啥数据项也别看了 就剩下个固定列大刺刺的占着整个页面 解决方法&#xff1a; <el-table-column :width"tableToggle ? 600 : 300" label"操作栏" align"center" header-ali…

idea安装包下载

idea安装教程 IDEA安装包链接&#xff1a;https://pan.baidu.com/s/15dEPF2hV3WPiFWMwGOsKWQ 提取码&#xff1a;kxl7 有激活部署的文档说明&#xff0c;下载自己看吧&#xff0c; 链接&#xff1a;https://pan.baidu.com/s/11yh8cz0R86Ngl7EJN8_5FA 提取码&#xff1a;mdg6

苍穹外卖+git开源

搁置了很久重新开始学 为了学习方便&#xff0c;苍穹外卖的前后端代码已放至git开源。 源代码-->sky-take-out: 苍穹外卖 git学习-->Git基础使用-CSDN博客 后端接口员工管理和分类管理模块 添加员工表单分析&#xff0c;添加的表单账号、手机号、身份证都是码…

vuepress路径问题,导致图片不显示

图片不显示&#xff0c;报 Uncaught SyntaxError: Unexpected token <错误 很可能就是&#xff1a;路径配置原因 1.当设置为 / 时&#xff0c;VuePress 会假设你的站点将部署到服务器的根路径&#xff0c; 例如 https://yourdomain.com/。 2.生成的页面链接和资源引用将以…

MacBook 逆水寒下载安装使用教程,支持最新版本 MacOS 流畅不闪退

最近 MacBook 系统更新到了 MacOS 14.1 很多朋友的逆水寒玩不了了&#xff0c;我尝试了一番可以正常玩了&#xff0c;看图&#xff1a; 其实操作也很简单&#xff0c;我们从头开始&#xff0c;因为 MacOS 系统的更新所以我们也需要更新新版本的 playCover 来适配新的系统&#…

在前端开发中,什么是SEO(Search Engine Optimization)?如何优化网站的SEO?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

韩墨耘——当代大风堂门人代表人物

韩墨耘 中央美术学院客座教授 全国书画艺术委员会副主席 中国书画家协会理事 荣宝斋签约画家 张大千大风堂国展班主任导师 国画大师何海霞亲传弟子 韩墨耘&#xff1a;62年生于洛阳&#xff1b;著名画家、美术教育家、书法家&#xff0c;现居北京。出身书香门第&#xf…

外贸网站建站的注意事项?海洋建站的流程?

外贸网站建站需要注意什么&#xff1f;网站建设要注意哪些问题&#xff1f; 在建设外贸网站时&#xff0c;有一些关键的注意事项需要牢记&#xff0c;以确保网站的成功运营。海洋建站将介绍一些重要的外贸网站建站注意事项&#xff0c;帮助企业避免一些常见的陷阱和错误。 外…

【Java用法】Lombok中@SneakyThrows注解的使用方法和作用

Lombok中SneakyThrows注解的使用方法和作用 一、SneakyThrows的作用二、SneakyThrows注解原理 一、SneakyThrows的作用 普通Exception类,也就是我们常说的受检异常或者Checked Exception会强制要求抛出它的方法声明throws&#xff0c;调用者必须显示的去处理这个异常。设计的目…

力扣541.反转字符串 II

文章目录 力扣541.反转字符串 II示例代码实现总结收获 力扣541.反转字符串 II 示例 代码实现 class Solution {public String reverseStr(String s, int k) {char[] ans s.toCharArray();for(int i0;i<ans.length;i2*k){int begin i;int end Math.min(ans.length-1,begin…