多人聊天Java

news/2024/5/21 2:00:42/文章来源:https://blog.csdn.net/ycq8888/article/details/134852467

服务端

 
  1. import java.io.*;

  2. import java.net.*;

  3. import java.util.ArrayList;

  4. public class Server{

  5. public static ServerSocket server_socket;

  6. public static ArrayList<Socket> socketList=new ArrayList<Socket>();

  7. public static void main(String []args){

  8. try{

  9. server_socket = new ServerSocket(5000);

  10. while(true){

  11. Socket socket = server_socket.accept();

  12. socketList.add(socket); //把sock对象加入sock集合

  13. ServerBO_Thread st=new ServerBO_Thread(socket,socketList); //初始化多线程

  14. st.start();//启动多线程

  15. }

  16. }catch(Exception ex){

  17. ex.printStackTrace();

  18. }finally{

  19. try{

  20. if(server_socket!=null){

  21. server_socket.close();

  22. }

  23. }catch(Exception ex){

  24. ex.printStackTrace();

  25. }

  26. }

  27. }

  28. public void encryptWrite(String src,DataOutputStream output)throws IOException{

  29. //将一个字符串转化为字符数组

  30. //System.out.println(src);

  31. char[] char_arr = src.toCharArray();

  32. //加密操作

  33. for(int i = 0;i<char_arr.length;i++){

  34. output.writeChar(char_arr[i]+13);

  35. }

  36. //用作结束标志符

  37. output.writeChar(2333);

  38. output.flush();

  39. }

  40. //读取并解密

  41. public String readDecrypt(DataInputStream input)throws IOException{

  42. String rtn="";

  43. while(true){

  44. int char_src =input.readChar();

  45. if(char_src!=2333){

  46. rtn=rtn+(char)(char_src-13);

  47. }else{

  48. break;

  49. }

  50. }

  51. return rtn;

  52. }

  53. }

  54. class ServerBO_Thread extends Thread{

  55. Socket client = null;

  56. ArrayList<Socket> clients;

  57. ServerBO_Thread(Socket s,ArrayList<Socket> ss){//初始化

  58. client=s;

  59. clients=ss;

  60. }

  61. public void run(){

  62. DataInputStream input = null;

  63. DataOutputStream output =null;

  64. try{

  65. input = new DataInputStream(client.getInputStream());

  66. Server bo = new Server();

  67. String receive=null;

  68. String send=null;

  69. while(true){//监视当前客户端有没有发来消息

  70. if(!client.isClosed()){

  71. receive=bo.readDecrypt(input);

  72. clients.trimToSize();

  73. String[] param = receive.split("&");

  74. if(")start".equals(param[1])){ //分析客户端发来的内容

  75. send = param[0]+"进入聊天室";

  76. }else{

  77. send = param[0]+"说: "+param[1];

  78. }

  79. if(!("3333".equals(param[1]))){//3333为退出聊天室信号

  80. for(Socket socket:clients){ //遍历socke集合

  81. //把读取到的消息发送给各个客户端

  82. if(!socket.isClosed()){

  83. output = new DataOutputStream(socket.getOutputStream());

  84. bo.encryptWrite(send,output);

  85. }

  86. }

  87. }else{//如果有客户端退出

  88. for(Socket socket:clients){ //遍历socke集合

  89. if(socket!=client){//告诉其他人此人退出聊天室

  90. if(!(socket.isClosed())){

  91. output = new DataOutputStream(socket.getOutputStream());

  92. bo.encryptWrite(param[0]+"已退出聊天室",output);

  93. }

  94. }

  95. }

  96. output = new DataOutputStream(client.getOutputStream());

  97. bo.encryptWrite("3333",output);//返回信号给要退出的客户端,然后关闭线程

  98. client.close();

  99. input.close();

  100. output.close();

  101. }

  102. }else{

  103. break;

  104. }

  105. }

  106. }catch(Exception ex){

  107. ex.printStackTrace();

  108. }

  109. }

  110. }

客户端

 
  1. import java.io.IOException;

  2. import java.util.Scanner;

  3. import java.net.*;

  4. import java.io.*;

  5. import java.io.InputStreamReader;

  6. import java.io.OutputStreamWriter;

  7. import java.io.BufferedWriter;

  8. import java.io.BufferedReader;

  9. import java.io.DataOutputStream;

  10. public class People{

  11. //服务端ip

  12. public String ip = "127.0.0.1";

  13. //服务端端口

  14. public int port = 5000;

  15. public DataOutputStream output = null;

  16. public Socket socket = null;

  17. public DataInputStream input = null;

  18. public Scanner sc =new Scanner (System.in);

  19. public String send ;

  20. public String receive;

  21. public String name;

  22. public String sd = null;

  23. public static void main(String[]aa){

  24. People po = new People();

  25. po.start();

  26. }

  27. public void start(){

  28. try{

  29. System.out.println("*******欢迎使用匿名聊天室!**********");

  30. System.out.println("请输入你将要使用的昵称:");

  31. name=sc.nextLine();//获取昵称

  32. socket = new Socket(ip,port);

  33. output=new DataOutputStream(socket.getOutputStream());

  34. input = new DataInputStream(socket.getInputStream());

  35. send = name+"&)start";//把昵称发送到server 告诉所有人有新成员加入聊天室

  36. System.out.println("(如果要退出聊天室请输入“3333”!)");

  37. System.out.println("*******成功进入匿名聊天室!**********");

  38. System.out.println("");

  39. encryptWrite(send,output);

  40. Out out=new Out(output,name,input,socket);

  41. out.start();//启动发送聊天内容的多线程

  42. while(true){

  43. String receive = readDecrypt(input);

  44. if("3333".equals(receive)){//如果收到“3333”则退出聊天室

  45. System.out.println("*******成功退出匿名聊天室!**********");

  46. input.close();

  47. output.close();

  48. socket.close();

  49. System.exit(0);

  50. }

  51. System.out.println(receive);

  52. }

  53. }catch(Exception ex){

  54. ex.printStackTrace();

  55. }finally{

  56. try{

  57. if(socket!=null) socket.close();

  58. input.close();

  59. output.close();

  60. }catch(Exception ex){

  61. ex.printStackTrace();

  62. }

  63. }

  64. }

  65. public void encryptWrite(String src,DataOutputStream output)throws IOException{

  66. //将一个字符串转化为字符数组

  67. char[] char_arr = src.toCharArray();

  68. //加密操作

  69. for(int i = 0;i<char_arr.length;i++){

  70. output.writeChar(char_arr[i]+13);

  71. }

  72. //用作结束标志符

  73. output.writeChar(2333);

  74. output.flush();

  75. }

  76. //读取并解密

  77. public String readDecrypt(DataInputStream input)throws IOException{

  78. String rtn="";

  79. while(true){

  80. int char_src =input.readChar();

  81. if(char_src!=2333){

  82. rtn=rtn+(char)(char_src-13);

  83. }else{

  84. break;

  85. }

  86. }

  87. return rtn;

  88. }

  89. }

  90. class Out extends Thread {

  91. public DataOutputStream output;

  92. public DataInputStream input;

  93. public static String name;

  94. public Socket socket;

  95. public Scanner sc =new Scanner (System.in);

  96. Out(DataOutputStream ot,String n,DataInputStream it,Socket socket){

  97. output=ot;

  98. input=it;

  99. name=n;

  100. }

  101. public void run(){

  102. People po = new People();

  103. try{

  104. while(true){

  105. String send=sc.nextLine();//获取用户输入

  106. String send2=name+"&"+send;//把聊天内容打包成约定形式

  107. po.encryptWrite(send2,output);

  108. }

  109. }catch(Exception ex){

  110. ex.printStackTrace();

  111. }finally{

  112. System.out.println("sfef");

  113. }

  114. }

  115. }

运行结果如下:

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

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

相关文章

将单体应用程序迁移到微服务

多年来&#xff0c;我处理过多个单体应用&#xff0c;并将其中一些迁移到了微服务架构。我打算写下我所学到的东西以及我从经验中用到的策略&#xff0c;以实现成功的迁移。在这篇文章中&#xff0c;我将以AWS为例&#xff0c;但基本原则保持不变&#xff0c;可用于任何类型的基…

web前端之css变量的妙用、通过JavaScrip改变css文件中的属性值、querySelector、setProperty

MENU 效果图htmlJavaScripstylequerySelectorsetProperty 效果图 html <div id"idBox" class"p_r w_680 h_160 b_1s_red"><div id"idItem" class"p_a l_0 t_30 w_100 h_100 bc_rgba_255_00_05 radius_50_"></div> …

智慧安防三大信息技术:云计算、大数据及人工智能在视频监控EasyCVR中的应用

说到三大信息技术大家都很清楚&#xff0c;指的是云计算、大数据和人工智能&#xff0c;在人工智能&#xff08;AI&#xff09;快速发展的当下&#xff0c;例如常见的大数据分析、人工智能芯片生产的智能机器人等等&#xff0c;在工作、生活、教育、金融、科技、工业、农业、娱…

Embedding And Word2vec

Embedding与向量数据库&#xff1a; Embedding 简单地说就是 N 维数字向量&#xff0c;可以代表任何东西&#xff0c;包括文本、音乐、视频等等。要创建一个Embedding有很多方法&#xff0c;可以使用Word2vec&#xff0c;也可以使用OpenAI 的 Ada。创建好的Embedding&#xff…

优化记录 -- 记一次搜索引擎(SOLR)优化

业务场景 某服务根据用户相关信息&#xff0c;使用搜索引擎进行数据检索 软件配置 solr 1台&#xff1a;32c 64g 数据10gb左右&#xff0c;版本 7.5.5 应用服务器1台&#xff1a;16c 64g 应用程序 3节点 问题产生现象 1、因业务系统因处理能不足&#xff0c;对业务系统硬件…

k8s引用环境变量

一 定义环境变量 ① 如何在k8s中定义环境变量 env、configmap、secret补充&#xff1a; k8s 创建Service自带的环境变量 ② 从pod属性中获取 kubectl explain deploy.spec.template.spec.containers.env.valueFrom关注&#xff1a; configMapKeyRef、fieldRef 和 resour…

第十五届蓝桥杯模拟赛B组(第二期)C++

前言&#xff1a; 第一次做蓝桥模拟赛的博客记录&#xff0c;可能有很多不足的地方&#xff0c;现在将第十五届蓝桥杯模拟赛B组&#xff08;第二期&#xff09;的题目与代码与大家进行分享&#xff0c;我是用C做的&#xff0c;有好几道算法题当时自己做的也是一脸懵&#xff0c…

房产中介管理信息系统的设计与实现

摘 要 随着房地产业的开发&#xff0c;房产中介行业也随之发展起来&#xff0c;由于房改政策的出台&#xff0c;购房、售房、租房的居民越来越多&#xff0c;这对房产中介部门无疑是一个发展的契机。本文结合目前中国城市房产管理的实际情况和现阶段房屋产业的供求关系对房产中…

12.7作业

1. #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//***********窗口相关设置***********//设置窗体大小this->resize(540,410);this->setFixedSize(540,410);//取消菜单栏this->setWindowFlag(Qt::FramelessWindowHint);/…

《计算机网络-自顶向下》wireShark实验-第二章:http

基本HTTP GET/response交互 我们开始探索HTTP&#xff0c;方法是下载一个非常简单的HTML文件。非常短&#xff0c;并且不包含嵌入的对象。执行以下操作&#xff1a; 启动您的浏览器。启动Wireshark数据包嗅探器&#xff0c;如Wireshark实验-入门所述&#xff08;还没开始数据包…

Matlab 用矩阵画图

文章目录 Part.I IntroductionChap.I 预备知识Chap.II 概要Chap.III 杂记 Part.II 用矩阵画图Chap.I 摸索过程Chap.II 绘制专业图Chap.III 矩阵转tiff Part.I Introduction 本文汇总了 Matlab 用矩阵画图的几种方式。 Chap.I 预备知识 关于 *.mat 文件 *.mat文件是 matlab 的…

Thymeleaf生成pdf表格合并单元格描边不显示

生成pdf后左侧第一列的右描边不显示&#xff0c;但是html显示正常 显示异常时描边的写法 cellpadding“0” cellspacing“0” &#xff0c;td,th描边 .self-table{border:1px solid #000;border-collapse: collapse;width:100%}.self-table th{font-size:12px;border:1px sol…

GPT实战系列-大模型训练和预测,如何加速、降低显存

GPT实战系列-大模型训练和预测&#xff0c;如何加速、降低显存 不做特别处理&#xff0c;深度学习默认参数精度为浮点32位精度&#xff08;FP32&#xff09;。大模型参数庞大&#xff0c;10-1000B级别&#xff0c;如果不注意优化&#xff0c;既耗费大量的显卡资源&#xff0c;…

【新品上市】启扬储能管理平板,打造储能管理新模式,助力全场景储能数智化升级!

随着可再生能源的快速发展&#xff0c;储能技术的应用日益广泛&#xff0c;储能系统成为解决可再生能源波动性和不可控制性的关键环节。储能系统通过实时监测、数据分析、远程控制等智能化功能&#xff0c;实现能量的高效利用和系统的稳定运行。 启扬智能推出 工业级储能管理平…

三数之和(LeetCode 15)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路方法一&#xff1a;暴力法方法二&#xff1a;排序双指针 5.实现示例参考文献 1.问题描述 给你一个整数数组 nums&#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时…

Linux 编译安装colmap

COLMAP可以作为独立的app&#xff0c;通过命令行或者图形交互界面使用&#xff0c;也可以作为一个库被包含到其他源代码中。 这里记录一下编译安装colmap的过程&#xff0c;首先需要安装好CUDA&#xff0c;CUDA具体安装过程这里就不赘述了。在GitHub上下载源代码&#xff0c;我…

python之pyqt专栏7-信号与槽3

在上一篇文章中python之pyqt专栏6-信号与槽2-CSDN博客中&#xff0c;我们可以了解到对象可以使用内置信号&#xff0c;这些信号来自于类定义或者继承过来的。我们可以对这些信号可以通过connect连接槽函数。 需求 现在有一个需求&#xff0c;有两个UI界面“untitled.ui”和“u…

15:00的面试,15:06就出来了,问的问题过于变态了。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

若依框架分页

文章目录 一、分页功能解析1.前端代码分析2.后端代码分析3. LIMIT含义 二、自定义MyPage,多态获取total1.定义MyPage类和对应的调用方法 一、分页功能解析 1.前端代码分析 页面代码 封装的api请求 接口请求 2.后端代码分析 controller代码 - startPage() getDataTable(…

Nginx配置反向代理与负载均衡

Nginx配置反向代理与负载均衡 一、代理服务1.正向代理2.反向代理 二、实战场景-反向代理1.修改nginx配置 -> nginx.conf文件2.修改前端路径 三、实战场景-负载均衡1.热备2.轮询3.加权轮询4.ip_hash ​ Nginx (“engine x”) 是一个高性能的HTTP和反向代理服务器&#xff0c;…