Java-多人聊天

 
  1. 
    
    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();
    
    }
    
    }
    
    }

客户端

 
  1. 
    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{
    
    //服务端ip
    
    public 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");
    
    }
    
    }
    
    }

运行结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值