多人聊天Java

服务端

 
  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.mzph.cn/news/204142.shtml

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

相关文章

性能调优入门

从公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、性能定律和数理基础 1.三个定律法则 (1)帕累托法则 我它也被称为 80/20 法则、关键少数法则&#xff0c;或者八二法则。人们在生活中发现很多…

Ubuntur编译ROS报错:error PCL requires C++14 or above

ubuntu20.04 编译ROS包 报错&#xff1a; error&#xff1a; PCL requires C14 or above&#xff1a; 修改Cmakelists.txt文件&#xff1a; set&#xff08;CMAKE_CXX_STANDARD 14&#xff09; 再次编译成功.

用 Bytebase 做数据库 schema 迁移

数据库 schema 迁移指修改管理数据库结构的变更&#xff0c;包括为数据库添加视图或表、更改字段类型或定义新约束。Bytebase 提供了可视化 GUI 方便迁移数据库 schema&#xff0c;本教程将展示如何使用 Bytebase 为 schema 迁移配上 SQL 审核&#xff0c;自定义审批流&#xf…

改造python3中的http.server为简单的文件上传下载服务

改造 修改python3中的http.server.SimpleHTTPRequestHandler&#xff0c;实现简单的文件上传下载服务 simple_http_file_server.py&#xff1a; # !/usr/bin/env python3import datetime import email import html import http.server import io import mimetypes import os …

UDP协议实现群聊

服务端 package ydd;import java.io.*; import java.net.*; import java.util.ArrayList; public class A2{public static ServerSocket server_socket;public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []a…

【C++】如何优雅地把二维数组初始化为0

2023年12月7日&#xff0c;周四上午 目录 为什么要初始化二维数组不优雅的初始化方式&#xff1a;使用两个for循环优雅的初始化方式一&#xff1a;使用初始化列表优雅的初始化方式二&#xff1a;使用memset函数 为什么要初始化二维数组 如果不初始化二维数组&#xff0c;那么…

点评项目——短信登陆模块

2023.12.6 短信登陆如果基于session来实现&#xff0c;会存在session共享问题&#xff1a;多台Tomcat不能共享session存储空间&#xff0c;这会导致当请求切换到不同服务器时出现数据丢失的问题。 早期的解决办法是让session提供一个数据拷贝的功能&#xff0c;即让各个Tomcat的…

【Python】流畅!一个非常好用的网络数据采集工具!

文章目录 前言一、注册二、初窥三 数据集四 自定义网站网络爬虫总结 前言 你是否曾为获取重要数据而感到困扰&#xff1f;是否因为数据封锁而无法获取所需信息&#xff1f;是否因为数据格式混乱而头疼&#xff1f;现在&#xff0c;所有这些问题都可以迎刃而解。让我为大家介绍…

【数据结构】——二叉树简答题模板

目录 一、树和二叉树的概念&#xff08;一&#xff09;二叉树的定义和性质&#xff08;二&#xff09;树和二叉树的区别 二、完全二叉树和满二叉树三、二叉树的遍历&#xff08;一&#xff09;由序列确定二叉树&#xff08;二&#xff09;不同遍历序列的关系 四、二叉树的性质&…

智能井盖传感器产品介绍,井盖传感器推荐

智能井盖传感器是一种先进的设备&#xff0c;能够提高城市管理的智能化水平。该传感器作为城市生命线建设的核心组成部分&#xff0c;为智慧城市的正常建设提供了有力的保障&#xff0c;能够提高城市管理的智能化水平。这种设备通过高度灵敏的传感器网络&#xff0c;实时监测井…

智能优化算法应用:基于野马算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于野马算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于野马算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.野马算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

通过Powershell远程控制windows服务器

1、被测服务器5985、5986端口开启&#xff0c;在网络设置中&#xff0c;点击“更改连接属性”。 2、网络配置文件中选择“专用”。 3、以管理员权限运行Powershell&#xff0c; 4.通过powershell命令在本地电脑上添加远端信任主机 winrm set winrm/config/client {TrustedHos…

关于DWC OTG2.0中PFC的理解

在DWC OTG2.0 Controller手册中&#xff0c;有一章节专门介绍了PFC&#xff0c;Packet FIFO Controller。其内部分为共享FIFO&#xff08;shared FIFO&#xff09;以及专用FIFO&#xff08;Dedicated FIFO&#xff09;&#xff0c;并针对dev和host两种模式&#xff0c;并且还要…

国内AI翘楚,看看有没有你心动的offer?

科技创新争占高地&#xff0c;AI领域各显神通。从一战成名的阿尔法狗到引起轩然大波的ChatGPT&#xff0c;我们早已卷入了一场没有硝烟的革命。前方世人看到的科技日新日异、岁月静好&#xff0c;后方是各大企业的绞尽脑汁、争先恐后。人工智能时代&#xff0c;AI是挡不住的时代…

学习mysql记录

环境: macbookpro m1 1. 安装mysql 使用苹果自带的包管理工具brew进行安装 1. brew install mysql (安装) 2. brew services start mysql (启动mysql服务) 1.1 如果提示zsh: mysql command not found, 终端执行以下命令 1. cd ~ (切到根目录) 2. vi .bash_profile (进入编辑…

QxOrm 如何自定义主键?

默认情况下QxOrm的主键是long类型自增的&#xff0c;但是有时候我们不想使用这个主键&#xff0c;想使用比如string类型的主键。 可以使用QX_REGISTER_PRIMARY_KEY宏定义另一种类型&#xff08;例如&#xff0c;QString 类型&#xff09;的唯一 id&#xff08;主键&#xff09…

1.5 常用DCC软件

一、DCC软件的定义 所谓DCC&#xff0c;就是Digital Content Creation的缩写&#xff0c;即数字内容创作。DCC的范围包括二维/三维、音频/视频编辑合成、动态/互动内容创作、图像编辑等。 二、常用建模软件 3DS MAX 擅长&#xff1a;硬表面建模、静态物体建模。&#xff08;国…

视频相似度对比 python opencv sift flann

提取SIFT特征的代码&#xff0c;返回关键点kp及特征描述符des def SIFT(frame):# 创建SIFT特征提取器sift cv2.xfeatures2d.SIFT_create()# 提取SIFT特征kp, des sift.detectAndCompute(frame, None)return kp, des 这行代码是使用SIFT&#xff08;Scale-Invariant Feature…

扔掉sql语句,用 QxOrm 让你的数据库操作从来没有这么简单过!

ORM简介&#xff1a; ORM 全称是 Object Relational Mapping&#xff08;对象关系映射&#xff09;&#xff0c;是一种程序设计技术&#xff0c;用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说&#xff0c;它其实是创建了一个可在编程语言里使用的“虚拟…

基于ssm人事管理信息系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本人事管理信息系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…