一对多聊天

服务端

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

结果

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

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

相关文章

两种做法——判断是否是二叉搜索树

https://leetcode.cn/problems/validate-binary-search-tree/description/?envTypestudy-plan-v2&envIdtop-interview-150 方法一&#xff1a;中序遍历 考虑只有两个节点和一个结点的情况&#xff0c;可以头尾各加一个最大最小值&#xff0c;不用特判了&#xff0c;也可…

流量分析1--菜刀666

1&#xff1a;菜刀666&#xff1a; 题目描述 分析流量包&#xff0c;过滤http数据流 追踪TCP数据流 对比第5个流和第7个流发现&#xff0c;同样的目录下 多出了6666.jpg。猜测是由攻击者上传&#xff0c;直接在请求包里搜索FFD8--FFD9 保存为1.jpg 利用foremost工具对1.jpg进…

Vis.js教程(四):给关系图的节点设置Image背景

1、引言 在Vis.js教程三中我们介绍了如何给关系图设置关系指向以及关系标签。 本节我们计划给关系图节点设置背景&#xff0c;拿菲尼克斯太阳队关系图的例子来说&#xff0c;如果给每一个球员节点都加上图片&#xff0c;这样看起来远远比名称更直观。 2、添加节点背景图片 …

phpStudy本地快速搭建网站,实现无公网IP固定地址远程访问

文章目录 [toc]使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点&#xff0c;测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中&#xff0c;查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2…

【无线网络技术】——无线局域网(学习笔记)

&#x1f4d6; 前言&#xff1a;本章首先介绍无线局域网的基本概念&#xff0c;然后详细介绍IEEE 802.11的基本工作原理&#xff0c;侧重于媒体访问控制和一跳范围内的通信技术。 目录 &#x1f552; 1. 概述&#x1f558; 1.1 覆盖范围&#x1f558; 1.2 特点&#x1f558; 1.…

设计新手利器!10款Windows免费设计软件推荐

1.即时设计 即时设计是国内首款协作式 UI 设计工具&#xff0c;更是同类产品中首先实现百万用户的设计软件。作为国产软件&#xff0c;即时设计的全中文操作系统和多设备平台的使用支持让它更加符合国内设计师的使用习惯。同时&#xff0c;即时设计也为用户提供了强大的功能支…

HarmonyOS开发(十):通知和提醒

1、通知概述 1.1、简介 应用可以通过通知接口发送通知消息&#xff0c;终端用户可以通过通知栏查看通知内容&#xff0c;也可以点击通知来打开应用。 通知使用的的常见场景&#xff1a; 显示接收到的短消息、即使消息...显示应用推送消息显示当前正在进行的事件&#xff0c…

Apache+mod_jk模块代理Tomcat容器

一、背景介绍 最近在看Tomcat运行架构原理, 正好遇到了AJP协议(Apache JServ Protocol). 顺道来研究下这个AJP协议和具体使用方法. 百度百科是这么描述AJP协议的: AJP&#xff08;Apache JServ Protocol&#xff09;是定向包协议。因为性能原因&#xff0c;使用二进制格式来传输…

剧本杀小程序搭建:打造线上剧本杀新体验

剧本杀是一款以角色扮演为主的游戏&#xff0c;一度成为了年轻人的最喜爱的社交游戏。在剧本杀市场需求下&#xff0c;剧本杀规模也迅速上升。今年第一季度&#xff0c;剧本杀市场规模环比增长47%&#xff0c;市场整体消费水平逐渐呈上升趋势。 随着剧本杀的不断发展&#xff…

通用plantuml 时序图(Sequence Diagram)模板头

通用plantuml文件 startuml participant Admin order 0 #87CEFA // 参与者、顺序、颜色 participant Student order 1 #87CEFA participant Teacher order 2 #87CEFA participant TestPlayer order 3 #87CEFA participant Class order 4 #87CEFA participant Subject order …

Google官方推广工具及其用法

Google的官方推广工具是一系列强大的在线广告工具&#xff0c;也就是说在帮助企业主通过Google搜索引擎和其他合作伙伴网站上展示他们的广告&#xff0c;吸引更多的潜在客户。本文小编讲一些常用的Google官方推广工具及其用法。 1、Google Ads Google Ads是最受欢迎和广泛使用的…

一次显著的性能提升,从8s到0.7s

前言 最近我在公司优化了一些慢查询SQL&#xff0c;积累了一些SOL调优的实战经验。 这篇文章从实战的角度出发&#xff0c;给大家分享一下如何做SQL调优。 经过两次优化之后&#xff0c;慢SQL的性能显著提升了&#xff0c;耗时从8s优化到了0.7s。 现在拿出来给大家分享一下…

数据结构与算法编程题50

假设不带权有向图采用邻接矩阵G存储&#xff0c;设计实现以下功能的算法。 &#xff08;1&#xff09;求出图中每个顶点的出度。 &#xff08;2&#xff09;求出图中出度为0的顶点数。 &#xff08;3&#xff09;求出图中每个顶点的入度。 //参考博客&#xff1a;https://blog.…

Java程序员,你掌握了多线程吗?

文章目录 01 多线程对于Java的意义02 为什么Java工程师必须掌握多线程03 Java多线程使用方式04 如何学好Java多线程写作末尾 摘要&#xff1a;互联网的每一个角落&#xff0c;无论是大型电商平台的秒杀活动&#xff0c;社交平台的实时消息推送&#xff0c;还是在线视频平台的流…

想转行IT,有前途嘛?30个详细理由中会得到你想要的答案

目录 前言&#xff1a; 一、转行IT的前景 二、IT行业的情况 三、技能需求 四、如何准备转行IT 如果你想转行IT&#xff0c;以下是一些建议&#xff1a; 前言&#xff1a; 转行IT是一个颇具吸引力的选择&#xff0c;尤其在当前社会&#xff0c;IT行业的需求非常广泛。然而…

自动化测试中几种常见验证码的处理方式及如何实现?

UI自动化测试时&#xff0c;需要对验证码进行识别处理&#xff0c;有很多方式&#xff0c;每种方式都有自己的特点&#xff0c;以下是一些常用处理方法&#xff0c;仅供参考。 1 去掉验证码 从自动化的本质上来讲&#xff0c;主要是提升测试效率等&#xff0c;但是为了去研究验…

Pytorch线性回归教程

import torch import numpy as np import torch.nn as nn import matplotlib.pyplot as plt生成测试数据 # 长期趋势 def trend(time, slope0):return slope * time# 季节趋势 def seasonal_pattern(season_time):return np.where(season_time < 0.4,np.cos(season_time * …

视频监控管理平台/智能监测/检测系统EasyCVR智能地铁监控方案,助力地铁高效运营

近日&#xff0c;关于全国44座城市开通地铁&#xff0c;却只有5座城市赚钱的新闻冲上热搜。地铁作为城市交通的重要枢纽&#xff0c;是人们出行必不可少的一种方式&#xff0c;但随着此篇新闻的爆出&#xff0c;大家也逐渐了解到城市运营的不易&#xff0c;那么&#xff0c;如何…

高速风筒解决方案,基于高性价比的普冉单片机开发

高速风筒也就是高速吹风机&#xff0c;与传统的吹风机相比&#xff0c;高速吹风机具有更强大的风力和更快的干燥速度&#xff0c;可以更快地干燥头发或其他物体表面的水分。它通常由一个电动机驱动&#xff0c;并通过旋转的叶片来产生气流。高速风筒广泛应用于个人护理、美容、…

Unity链接MySql数据库

一、连接准备 1. MySql.Data插件 Visual Studio中下载打开Visual Studio_项目_管理NuGet程序包在浏览中搜索MySql.Data并下载 2.MySql官网下载插件 前提已经安装mysql&#xff0c;然后到官网下载以下三个东西&#xff08;最好不要使用最新版本&#xff09; MySQL Connector…