当前位置: 首页 > news >正文

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

运行结果如下:

相关文章:

  • MySQL注入入门简述
  • 安防视频监控系统EasyNVR平台集成后无法播放的原因与解决步骤
  • 如何将CAD图纸导入Revit软件?
  • 五、HotSpot细节实现
  • Python数值类型(整形、浮点型和复数)及其用法
  • 【鸿蒙开发】第五章 ArkTS基础知识 - 声明变量、常量、类型和函数
  • 软件工程之需求分析
  • 利用R语言heatmap.2函数进行聚类并画热图
  • LeetCode 每日一题 Day 9 ||简单dp
  • OpenVINS学习2——VIRAL数据集eee01.bag运行
  • 【C++11】lambda表达式及包装器
  • 通俗易懂,什么是.NET Core以及.NET Core能做什么
  • Rxjs 学习笔记 - 简化版
  • openssl的x509命令工具
  • Kubernetes入门笔记——(2)k8s设计文档
  • __proto__ 和 prototype的关系
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 2018一半小结一波
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • es6
  • javascript 总结(常用工具类的封装)
  • node学习系列之简单文件上传
  • oschina
  • passportjs 源码分析
  • python3 使用 asyncio 代替线程
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 对JS继承的一点思考
  • 优秀架构师必须掌握的架构思维
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • (003)SlickEdit Unity的补全
  • (16)Reactor的测试——响应式Spring的道法术器
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (九十四)函数和二维数组
  • (四)JPA - JQPL 实现增删改查
  • (四)库存超卖案例实战——优化redis分布式锁
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (轉貼) UML中文FAQ (OO) (UML)
  • ****三次握手和四次挥手
  • .apk 成为历史!
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET Core 中插件式开发实现
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET企业级应用架构设计系列之应用服务器
  • .NET中使用Redis (二)
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • @EventListener注解使用说明
  • [ C++ ] STL_list 使用及其模拟实现
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [BZOJ 1040] 骑士
  • [BZOJ 3282] Tree 【LCT】
  • [BZOJ1877][SDOI2009]晨跑[最大流+费用流]
  • [C++]命名空间等——喵喵要吃C嘎嘎