基于Java+socket实现多线程聊天室-控制台版

news2024/11/20 12:32:29

基于Java+socket实现多线程聊天室-控制台版

  • 一、系统介绍
  • 二、功能展示
    • 1.运行效果
  • 三、代码展示
  • 四、其它
    • 1.其他系统实现
    • 2.获取源码

一、系统介绍

首先启动server端,然后启动client端。任意一个client发送给server的消息都将会被转发给所有在线的client,实现了一个聊天室功能。

client发送exit指令可以下线,所有的client端,以及server端都会收到它的下线通知。

原理
socket 通信是基于TCP/IP 网络层上的一种传送方式。

首先,服务端初始化ServerSocket,然后对指定的端口(这里是65000)进行绑定,接着对端口进行监听,通过调用accept方法阻塞,此时,如果客户端有一个socket连接到服务端,那么服务端通过监听和accept方法可以与客户端进行连接,就创建了一个客户端线程。

然后就是客户端的启动和连接了,在服务端socket启动之后,启动客户端连接ServerSocket,这里实现了多线程,可以同时连接多个客户端。这里多线程方面使用了线程池,线程池的作用是:

  • 线程复用,减少创建线程耗时;
  • 防止短时间内高并发,指定线程池大小,超过数量将等待,防止短时间创建

大量线程导致资源耗尽,服务挂掉。

二、功能展示

1.运行效果

在这里插入图片描述

三、代码展示

package wechat;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
 

import java.io.*;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;

public class WeChatClient {

    Socket clientSocket = null;
    BufferedReader reader = null;
    private static final int PORT = 65000;

    public static void main(String[] args) throws IOException {
        new TCPClient();
        System.exit(0);  //client退出后自动结束此进程
    }

	//客户端逻辑写在构造方法中
    public TCPClient() {
        clientSocket = new Socket();
        try {
            clientSocket.connect(new InetSocketAddress("localhost", PORT));
            new getInputStream().start();
            System.out.println("Client started!");
            reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            String receiveStr = null;
            while ((receiveStr = reader.readLine()) != null) {
                //接收服务端发来的数据
                if (receiveStr.equals("exit")) {
                //如果发送exit,服务端会回传exit,这里判断回传的是不是exit。是的话就结束此线程
                    break;
                }
                System.out.println(receiveStr);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        	//exit -> 关闭客户端套接字、线程、BufferReader
            try {
                if (reader != null) {
                    reader.close();
                }
                if (clientSocket != null) {
                    clientSocket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

	//客户端线程,用于向服务端写入从客户端控制台输入的数据
    class getInputStream extends Thread {
        @Override
        public void run() {
            BufferedReader is = null;
            PrintWriter os = null;
            try {
                is = new BufferedReader(new InputStreamReader(System.in));
                os = new PrintWriter(new BufferedOutputStream(clientSocket.getOutputStream()));
                String str = null;
                while ((str = is.readLine()) != null) {
                    os.println(str);
                    os.flush();
                }

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (is != null) {
                        is.close();
                    }
                    if (os != null) {
                        os.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

四、其它

1.其他系统实现

Java+Swing实现学生选课管理系统
Java+Swing实现学校教务管理系统
Java+Swing+sqlserver学生成绩管理系统
Java+Swing用户信息管理系统
Java+Swing实现的五子棋游戏
基于JavaSwing 银行管理系统
Java+Swing+mysql仿QQ聊天工具
Java+Swing 聊天室
Java+Swing+dat文件存储实现学生选课管理系统
Java+Swing可视化图像处理软件
Java+Swing学生信息管理系统
Java+Swing图书管理系统
Java+Swing图书管理系统2.0
基于java+swing+mysql图书管理系统3.0
大作业-基于java+swing+mysql北方传统民居信息管理系统

2.获取源码

点击下载
基于Java+socket实现多线程聊天室-控制台版

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

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

相关文章

C++基础(16)——STL常用算法(排序、拷贝和集合)

前言 本文介绍了C中STL常用排序、拷贝和集合算法 9.3:常见的排序算法(sort、random_shuffle、merge、reverse) 9.3.1:sort 9.3.2:random_shuffle 将容器中的数据位置重新打乱,可以配合随机数种子使用 9…

【Java】Java核心要点总结 69

文章目录 1. BIO NIO AIO2. 多线程3. 线程的生命周期和状态4. sleep() ⽅法和 wait() ⽅法对比5. 为什么 wait() ⽅法不定义在 Thread 中? 1. BIO NIO AIO 在Java中,BIO、NIO和AIO是针对网络编程的不同I/O模型: BIO(Blocking I/O…

【kotlin】使用MPAndroidChart实现PieChart(饼图)并设置每个数据的颜色、标签等属性

概述 MPAndroidChart 是 Android 上一个非常流行的开源图表库,它提供了多种类型的图表,包括折线图、柱状图、饼图等。 MPAndroidChart 实现饼图 下面是一个使用 MPAndroidChart 实现饼图的示例代码: 首先,需要在项目的 build.…

Makerbase CANable V2.0 产品简介

一、产品介绍 MKS CANable V2.0模块为MKS CANable V1.0升级版本。CANable 2.0是一款小型低成本开源 USB转CAN分析仪。CANable枚举为您计算机上的虚拟串行端口,并充当 CAN总线接口的串行线路。使用candleLight固件时,CANable在Linux上枚举为本地CAN接口。…

MySQL中float、double以及decimal的用法

1、浮点型和定点型 1.1 浮点型: 浮点型能够表示更大的数据范围,但是容易发生精度的问题 float和double属于浮点型,其取值范围与java中的浮点类型的取值范围相同,float占用4字节,double占用8字节 1.2 定点型&#xf…

springboot校园疫情防控管理与数据可视化系统-计算机毕设 附源码84534

springboot校园疫情防控管理与数据可视化系统 摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针…

实战之如何在VUE中播放RTSP实时推流播放解决方案

一、知识点 常见的直播协议有以下几种 RTMP(Real-Time Messaging Protocol)实时消息传输协议:是一种用于互联网应用中的协议,最初由 Adobe 公司设计,用于 Flash Player 向 Flash Media Server 或其他支持 RTMP 的服务…

三、Docker命令及基本使用

学习参考:尚硅谷Docker实战教程、Docker官网、其他优秀博客(参考过的在文章最后列出) 目录 前言一、帮助启动类命令1.1 启动docker1.2 停止docker1.3 重启docker1.4 查看docker状态1.5 开机启动1.6 查看docker概要信息1.7 查看docker总体帮助文档1.8 查看docker命令…

模板文件导出Excel【EasyPoi实战系列】- 第478篇

​历史文章(文章累计470) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 …

慎投!6月有3本SCIE期刊被剔除!(附SCI/SSCI目录下载)

期刊动态:2023年6月SCI、SSCI期刊目录更新 2023年6月20日,科睿唯安更新了WOS期刊目录,继上次5月WOS期刊目录剔除4本SCIE&SSCI期刊之后,此次6月更新又有3本SCIE期刊发生变动,其中有1本期刊被踢出SCIE数据库&#x…

Python基础(18)——Python推导式

Python基础(18)——Python推导式 文章目录 Python基础(18)——Python推导式目标一. 列表推导式1.1 快速体验1.2 带if的列表推导式1.3 多个for循环实现列表推导式 二. 字典推导式1 快速体验 三. 集合推导式四. 总结 目标 列表推导…

PowerShell系列(七)PowerShell当中的Provider介绍

往期回顾PowerShell系列(一):PowerShell介绍和cmd命令行的区别 PowerShell系列(二):PowerShell和Python之间的差异介绍 PowerShell系列(三):PowerShell发展历程梳理 P…

管理类联考——写作——素材篇——论说文——写作素材05——志篇:奉献·公益06——制篇:原则·准则

管理类专业学位联考 (写作能力) 论说文素材 05——志篇:奉献公益 论文说材料: 自己活着,就是为了使别人过得更美好。 ——雷锋 一:道理论据 成人善事,其功更倍;动人善愿,其量无涯。——陈龙正 凡人为善…

谷歌tryOnDiffusion实现了高度逼真的虚拟试穿;ChatGPT 或将推出 AI 应用商店

🦉 AI新闻 🚀 ChatGPT Plus 用户已支持联网和插件功能,OpenAI 或将推出 AI 应用商店 摘要:OpenAI 宣布 ChatGPT Plus 用户已支持联网和插件功能。据外媒 The Information 报道,OpenAI 正考虑为 AI 软件创建一个应用商…

postgresql snapshot快照源码解析, 快照内容生成规则, 可见性是这样判断的

postgresql snapshot快照源码解读 ​专栏内容:postgresql内核源码分析 个人主页:我的主页 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 概述 本文主要介绍数据库事务快照,分别从源码实…

VisualSVN Server 5.1.5 Crack

特征 VisualSVN Server 提供以下主要功能。 Active Directory 单点登录 允许用户使用他们当前的 Active Directory 域凭据访问 VisualSVN Server。使用安全 Kerberos V5 或 NTLM 身份验证协议。支持双因素身份验证和智能卡。 多站点存储库复制 使用 VisualSVN 分布式文件系统…

【FPGA入门】第七篇、FPGA实现VGA接口驱动

目录 第一部分、实验结果 1、横的三色彩条效果 2、竖的三色彩条效果 第二部分、VGA驱动基本知识 1、VGA分辨率问题 2、VGA驱动波形 2.1、工业标准的时序波形图 2.2、比上面那张图更容易理解的图 2.3、每个区域对应的时间 2.4、不同分辨率的表格 3、VGA扫描范…

【NeRF大总结】基于NeRF的三维视觉年度进展报告

基于NeRF的三维视觉年度进展报告 清华大学:刘烨斌 原文链接:【NeRF大总结】基于NeRF的三维视觉年度进展报告–清华大学刘烨斌 (by 小样本视觉与智能) 目录 文章目录 基于NeRF的三维视觉年度进展报告01 背景介绍NeRFNeRF与三维视觉三维表征与可微渲染…

信号与系统与MATLAB应用(一)

文章目录 前言一、基本信号表示1、周期方波信号2、周期锯齿波信号3、指数函数信号4、抽样函数信号5、单位阶跃信号 二、信号的基本运算1、信号的相加和相乘2、信号的平移3、信号的反折4、信号的尺度变换(缩展)5、信号的微分和积分未完待续... 前言 说起…

WEBGIS系统整体设计

城市地下电力管线管理系统是一个基于B/S 架构的应用系统。系统的网络拓扑结构如 PostgreSQL 数据库以及文件系统作为数据服务器。另外,使用GeoServer 作为GIS 服务器,提供符合OpenGIS 规定的WFS 、WMS 等协议的GIS 服务。 遵循MVC 的分层设计思想&#x…