java:基于TCP协议的网络聊天室

news2024/11/26 8:41:28

基于TCP协议的网络聊天室

简单用java写了一个基于TCP协议的网络聊天室

基本功能

多用户同时在线聊天

收到消息时服务端会向所有在线用户群发消息

用户加入连接和断开连接时会提示

服务端

 Socket socket;
    ArrayList<Socket> list;

    public ServerThread(Socket socket, ArrayList<Socket> list) {
        this.socket = socket;
        this.list = list;
    }

    @Override
    public void run() {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            InetAddress ip = socket.getInetAddress();
            int port = socket.getPort();
            System.out.printf("欢迎ip为%s,端口号为%d的用户进入聊天室\n", ip.getHostAddress(), port);
            while (true) {
                String s = br.readLine();
                System.out.println(s);
                System.out.println("开始广播");
                System.out.println(list);
                for (Socket socket1 : list) {
                    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket1.getOutputStream()));
                    bw.write(s);
                    bw.newLine();
                    bw.flush();
                }
            }
        }catch (SocketException e){
            System.out.println("有人直接关闭了客户端");
        }catch (IOException e) {
            e.printStackTrace();
        }
    }

基于网络编程和io流实现对客户端消息的接收

收到消息时会对所有在线用户群发消息,即类似qq群效果

当用户直接关闭客户端时,由于违反了TCP的挥手协议,需要捕获不然会出现异常

客户端

客户端包含两个线程,一个用于接收服务端返回的群发数据,一个用于发送客户端发出的消息

 public static void main(String[] args) {
        try {
//            Socket socket = new Socket("127.0.0.1", 8000);
            Socket socket = new Socket("192.168.36.98", 8000);
            BufferedWriter bos = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            new Thread(new Receive(socket)).start();
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入您的昵称");
            String nickname = sc.next();
            while (true) {
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                LocalDateTime ldt = LocalDateTime.now();
                String time = ldt.format(formatter);
                System.out.println(nickname + "要说些什么?");
                bos.write(time + " " + nickname + "说:" + sc.next());
                bos.newLine();
                bos.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

基于网络编程和IO流实现消息的发送

基于java时间类描述消息

 Socket socket;

    public Receive(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        while (true) {
            try {
                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                System.out.println(br.readLine());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

接收服务端群发的消息并打印

主线程

static ArrayList<Socket> list = new ArrayList<>();
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(8000);
        System.out.println("聊天室启动!!!");
        ThreadPoolExecutor tpe = new ThreadPoolExecutor(
                3,
                10,
                60,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(20),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );
        while(true){
            Socket acp = server.accept();
            list.add(acp);
            tpe.submit(new Thread(new ServerThread(acp,list)));
        }
    }

主线程中创建了一个线程池并死循环接收新客户端的连接递交给线程池处理

实现演示

请添加图片描述

客户端发送消息,服务端接收并群发

请添加图片描述
请添加图片描述

多用户同时发送和接收消息

请添加图片描述
服务端对数据进行处理和收发

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

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

相关文章

使用Docker,【快速】搭建个人博客【WordPress】

目录 1.安装Mysql&#xff0c;创建&#xff08;WordPress&#xff09;用的数据库 1.1.安装 1.2.创建数据库 2.安装Docker 3.安装WodPress&#xff08;使用Docker&#xff09; 3.1.创建文件夹 3.2.查看镜像 3.3.获取镜像 3.4.查看我的镜像 3.5.使用下载的镜像&#xf…

产品创新领域中的生产率:以新产品销售额与研发支出的关系为视角

一、摘要 在当今日新月异的商业环境中&#xff0c;产品创新已成为企业获取竞争优势、实现持续增长的关键因素。而如何衡量产品创新的成效&#xff0c;即产品创新的生产率&#xff0c;则是众多企业所关注的焦点。本文将探讨产品创新领域中的生产率概念&#xff0c;并以新产品销…

Windows的Tensorrt的安装

Tensorrt的下载 确定自己的CUDA版本,匹配的去下载Tensorrt。 Tensorrt的下载 下载完成之后,直接解压到文件夹即可。 环境变量配置 最重要的一部就是环境变量的配置。 官方的安装指导文件给出了两种方法: (1)要么直接将/lib 添加到环境变量 PATH 中 (诶,windows没有LD_L…

时序预测 | Transformer时间序列预测 Matlab代码

文章目录 效果一览文章概述源码设计参考资料 效果一览 文章概述 1.时序预测 | Transformer时间序列预测 Matlab代码 2.单变量时间序列预测&#xff1b; 3.多指标评价&#xff0c;评价指标包括&#xff1a;R2、MAE、MBE等&#xff0c;代码质量极高&#xff1b; 4.excel数据&…

QTableView获取可见的行数

场景 当我们需要实时刷新QTableView时&#xff0c;而此时tableView的数据量较大&#xff0c;如果全部刷新显然不合理&#xff0c;如果可以只对用户看的到的数据进行刷新那就最好了&#xff0c;经过一番摸索找到了几种方式&#xff0c;可供参考 代码 方法1 QVector<int>…

护眼台灯怎么选看哪些指标?五款性价比高的照明品牌综合对比

鉴于儿童近视率的不断攀升&#xff0c;为孩子打造一个优质的学习环境变得愈发关键。在这其中&#xff0c;护眼台灯无疑占据了举足轻重的地位。那么&#xff0c;护眼台灯怎么选看哪些指标&#xff1f;本文将详尽解析与护眼台灯密切相关的核心指标&#xff0c;帮助大家在选购时能…

数据结构中的顺序表的删除和查找

对于顺序表&#xff0c;它包括&#xff1a;初始化&#xff0c;取值&#xff0c;查找&#xff0c;插入&#xff0c;以及删除。接下来就讲一讲删除和查找。 删除&#xff1a;它包括头删和尾删&#xff0c;为什么顺序表中要用到删除呢&#xff1f;按我的理解就是&#xff1a;为插入…

Linux服务器硬件及RAID配置

一、服务器硬件 塔式服务器&#xff1a;最初的服务器形态之一&#xff0c;类似于传统的台式电脑&#xff0c;但具有更强的处理能力和稳定性&#xff0c;适合小型企业或部门使用。 机架式服务器&#xff1a;设计为可安装在标准化机架内的模块化单元&#xff0c;可以有效地节省空…

上位机图像处理和嵌入式模块部署(树莓派4b固件功能设计)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;上位机的功能都是基于插件进行开发的。但是上位机的成本比较贵&#xff0c;一般的企业不一定愿意接接受。这个时候另外一…

Notion 开源替代品 AFFINE 部署和使用教程

AFFiNE 是一款完全开源的 Notion Miro 替代品&#xff0c;与 Notion 相比&#xff0c;AFFiNE 更注重隐私安全&#xff0c;优先将笔记内容保存到本地。 GitHub 地址&#xff1a;https://github.com/toeverything/AFFiNE AFFiNE 使用 Rust 和 Typescript 构建&#xff0c;只需…

重生奇迹mu怎么卡智力的方法

1、准备3个号A打手,B智力MM,C随意。 2、使用C匹配组队,但是不能选择自动进入队伍。 3、用A申请C的队伍,但是C不做通过处理。 4、用A组B,用快捷键D的方式。 5、所谓的卡智力就是智力MM可以给打手加属性加血&#xff0c;但是并不在一个队伍里享受经验&#xff0c;适用于MM不是…

Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】

什么是Serlvet&#xff1f; Servlet其实就是一个遵循Servlet开发的java类。Serlvet是由服务器调用的&#xff0c;运行在服务器端。 为什么要用到Serlvet&#xff1f; 我们编写java程序想要在网上实现 聊天、发帖、这样一些的交互功能&#xff0c;普通的java技术是非常难完成…

【深度学习】最强算法之:Transformer

Transformer 1、引言2、Transformer2.1 引言2.2 核心概念2.3 应用2.4 算法公式2.5 代码示例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c;昨天的感受咋样 小鱼&#xff1a;啥感受啊&#xff1f; 小屌丝&#xff1a;你确定不知道&#xff1f; 小鱼&#xff1a;我… 小屌…

软考 - 系统架构设计师 - 设计模式

概念 每一个设计模式描述了一个在我们周围不断重复发生的问题&#xff0c;以及该问题解决方案的核心&#xff0c;这样&#xff0c;就可以在遇到相同的问题时使用该解决方案进行解决&#xff0c;不必进行重复的工作&#xff0c;设计模式的核心在于提供了问题的解决方案&#xff…

代码学习记录25---单调栈

随想录日记part45 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.04.17 主要内容&#xff1a;今天开始要学习单调栈的相关知识了&#xff0c;今天的内容主要涉及&#xff1a;每日温度 &#xff1b;下一个更大元素 I 739. 每日温度 496.下一个更大元素 I Topic…

数仓建模—逻辑数据模型

数仓建模—逻辑数据模型 逻辑数据模型 (LDM Logical Data Model) 是一种详细描述数据元素的数据模型,用于开发对数据实体、属性、键和关系的直观理解。 这种模型独特地独立于特定的数据库,以便为数据管理系统中语义层的组件建立基础结构。将 LDM 视为一个蓝图:它代表在整个…

软件无线电安全之GNU Radio基础 -上

GNU Radio介绍 GNU Radio是一款开源的软件工具集&#xff0c;专注于软件定义无线电&#xff08;SDR&#xff09;系统的设计和实现。该工具集支持多种SDR硬件平台&#xff0c;包括USRP、HackRF One和RTL-SDR等。用户可以通过GNU Radio Companion构建流程图&#xff0c;使用不同…

记录Windows XP系统安装详细图文版安装日志

一、准备工作 一、下载镜像文件 我用的镜像文件在网盘可自行下载&#xff1a; 点击下载OSI镜像文件提取码&#xff1a;888999 系统安装介质准备&#xff1a;首先&#xff0c;你需要准备一个Windows XP的安装介质。这可以是光盘&#xff0c;也可以是U盘。确保你的安装介质是…

MyBatis 源码分析 - SQL 的执行过程

MyBatis 源码分析 - SQL 的执行过程 * 本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程。该过程本身比较复杂&#xff0c;牵涉到的技术点比较多。包括但不限于 Mapper 接口代理类的生成、接口方法的解析、SQL 语句的解析、运行时参数的绑定、查询结果自动映射、延…

Linux(磁盘管理与文件系统)

目录 1. 磁盘基础 1.1 磁盘结构 1.2 MBR 1.3 磁盘分区结构 2. 文件系统类型 2.1 XFS文件系统 2.2 SWAP 2.3 fdisk命令 2.4 创建新硬盘 3.创建文件系统 3.1 mkfs 3.2 挂载、卸载文件系统 3.3 查看磁盘使用情况 1. 磁盘基础 1.1 磁盘结构 磁盘的物理结构 盘片:硬…