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

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

服务端:

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{
//服务端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.hqwc.cn/news/256794.html

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

相关文章

领域驱动架构(DDD)建模

一、背景 常见的软件开发方式是拿到产品需求后&#xff0c;直接考虑数据库中表应该如何设计&#xff0c;这种方式已经将设计与业务需求脱节&#xff0c;而更多的是直接考虑应该如何实现了&#xff0c;这有点本末倒置。而DDD是从领域(问题域)为出发点进行的设计方法。 领域驱动…

记账中心二开

系统预设了 这几种 FSubSystem 为子系统 T_VC_SubSystem 卡片显示的表 字段 FNeedRalteAccount 设置为1的话 &#xff0c;需要与总账连用系统将去查找 系统状态控制表。 如果系统状态 没有配置这个子系统 将无法显示数据 select sysStaCtr.fid from T_BD_SystemStatusCt…

统信UOS_麒麟KYLINOS上跨架构下载离线软件包

原文链接&#xff1a;统信UOS/麒麟KYLINOS上跨架构下载离线软件包 hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇在统信UOS/麒麟KYLINOS上跨架构下载离线软件包的实用教程。在我们的日常工作中&#xff0c;可能会遇到这样的情况&#xff1a;需要为不同架构的设备下…

STM32 cubeMX 呼吸灯实验

文章代码使用 HAL 库。 文章目录 一、1.PWM原理二、LED 原理图三、使用cubemx 配置 led四、PWM 相关函数五、PWM占空比占空比计算六、PWM 呼吸灯重要代码总结 呼吸灯 一、1.PWM原理 PWM全称为脉冲宽度调制&#xff08;Pulse Width Modulation&#xff09;&#xff0c;是一种常…

【软考】信息系统项目管理师论文方向猜想

报喜不报忧&#xff0c;每天都在为鸡零狗碎推诿扯皮&#xff0c;属实是有辱师门。 通过软考&#xff0c;目前算是真正有意义的事情。 虽然都说高项的论文是个玄学&#xff0c;但是道听途说了一些通关感想还是蛮有启发的。 文件要求 参考了一份广西省高级工程师评审的文件&am…

Linux 环境变量 与 命令行参数

什么是环境变量 从结构上来看&#xff0c;环境变量就是操作系统维护的一组&#xff1a;key-value 的键值对。 不知道你是否有一个疑问&#xff1a;为什么我们写代码编译链接 形成的可执行程序要运行起来需要带路径呢&#xff1f;Linux 内置的命令也是可执行程序&#xff0c;为…

用keepalived做mysql高可用

两台机器(centos7系统)安装mysql [rootmysql-keep-master ~]# wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm [rootmysql-keep-master ~]# rpm -ivh mysql80-community-release-el7-3.noarch.rpm [rootmysql-keep-master ~]# yum -y install yu…

【沐风老师】3dMax椅子建模教程

3dMax椅子建模详解 1.将系统单位设置为&#xff1a;毫米。在前视图创建一个矩形&#xff0c;并将四个角倒圆角。 2.开启二维图形可渲染功能&#xff0c;设置线条粗细。参数如图&#xff1a; 3.应用“FFD 2x2x2”修改器&#xff0c;在前视图中&#xff0c;选中右下角所有控制点&…

IntelliJ IDEA开启git版本控制的简单教程

这篇文章想要分享一下怎么在IntelliJ IDEA开启版本控制&#xff0c;博主使用的是gitee&#xff0c;首先需要安装git&#xff0c;关于git的安装这里就不介绍了&#xff0c;很简单。 目录 创建git仓库 创建项目 开启版本控制 拉取项目 创建git仓库 首先&#xff0c;需要登录…

uni-app 微信小程序之好看的ui登录页面(三)

文章目录 1. 页面效果2. 页面样式代码 更多登录ui页面 uni-app 微信小程序之好看的ui登录页面&#xff08;一&#xff09; uni-app 微信小程序之好看的ui登录页面&#xff08;二&#xff09; uni-app 微信小程序之好看的ui登录页面&#xff08;三&#xff09; uni-app 微信小程…

Hadoop3.x完全分布式环境搭建Zookeeper和Hbase

先在主节点上进行安装和配置&#xff0c;随后分发到各个从节点上。 1. 安装zookeeper 1.1 解压zookeeper并添加环境变量 1&#xff09;解压zookeeper到/usr/local文件夹下 tar -zxvf /usr/local2&#xff09;进入/usr/local文件夹将apache-zookeeper-3.8.0-bin改名为zookeep…

MongoDB的连接数据库,创建、删除数据库,创建、删除集合命令

本文主要介绍MongoDB的连接数据库&#xff0c;创建、删除数据库&#xff0c;创建、删除集合命令。 目录 MongoDB连接数据库连接到本地 MongoDB 实例连接到远程 MongoDB 实例 MongoDB创建和删除数据库MongoDB创建和删除集合创建集合删除集合 MongoDB连接数据库 连接 MongoDB 数…