用Java代码实现一个简单的聊天室功能

article/2025/10/23 5:14:23

一.客户端的创建

1.我们可以用Socket来创建客户端

/***@类名 Client*@描述 TODO 客户端 1*@版本 1.0*@创建人 XuKang*@创建时间 2020/9/24 16:18**/
public class Client {public static void main(String[] args) throws UnknownHostException, IOException {System.out.println("-----Client1-----");BufferedReader br =new BufferedReader(new InputStreamReader(System.in));System.out.println("请输入用户名:");String name =br.readLine();//1、建立连接: 使用Socket创建客户端 +服务的地址和端口Socket client =new Socket("localhost",8888);//2、客户端发送消息new Thread(new Send(client,name)).start();  new Thread(new Receive(client)).start();}
}

2.这时我们需要接受其他客户端发送的数据,我们需要创建一个客户端的接收方法和发送方法,我可以用阻塞式的方式进行接收和发送,考虑到多线程的安全性,可以实现Runnable
1.Send发送端:

/***@类名 Send*@描述 TODO 使用多线程封装:发送端*@版本 1.0*@创建人 XuKang*@创建时间 2020/9/24 16:23**/
public class Send implements Runnable {private BufferedReader console ;private DataOutputStream dos;private Socket client;private boolean isRunning;private String name;public Send(Socket client,String name) {this.client =client;console =new BufferedReader(new InputStreamReader(System.in));this.isRunning = true;this.name = name;try {dos =new DataOutputStream(client.getOutputStream());//发送名称send(name);} catch (IOException e) {System.out.println("==1==");this.release();}	}@Overridepublic void run() {while(isRunning) {String msg = getStrFromConsole();if(!msg.equals("")) {send(msg);}}}	//发送消息private void send(String msg) {try {dos.writeUTF(msg);dos.flush();} catch (IOException e) {System.out.println(e);System.out.println("===3==");release();}}/*** 从控制台获取消息* @return*/private String getStrFromConsole() {try {return  console.readLine();} catch (IOException e) {e.printStackTrace();}return "";}//释放资源private void release() {this.isRunning = false;CloseUtils.close(dos,client);}}

2.接收端

/***@类名 Receive*@描述 TODO 使用多线程封装:接收端*@版本 1.0*@创建人 XuKang*@创建时间 2020/9/24 16:22**/
public class Receive implements Runnable {private DataInputStream dis ;private Socket client;private boolean isRunning;public Receive(Socket client) {this.client = client;this.isRunning = true;try {dis =new DataInputStream(client.getInputStream());} catch (IOException e) {System.out.println("====离开一位=====");release();}}//接收消息private String receive() {String msg ="";try {msg =dis.readUTF();} catch (IOException e) {System.out.println("====接收消息异常====");release();}return msg;}@Overridepublic void run() {		while(isRunning) {String msg =receive();if(!msg.equals("")) {System.out.println(msg);}}}//释放资源private void release() {this.isRunning = false;CloseUtils.close(dis,client);}}

3.统一释放资源的方法可以提出,服务的也用得上

/***@类名 CloseUtils*@描述 TODO 工具类,统一释放资源*@版本 1.0*@创建人 XuKang*@创建时间 2020/9/24 16:20**/
public class CloseUtils {/*** 释放资源*/public static void close(Closeable... targets ) {for(Closeable target:targets) {try {if(null!=target) {target.close();}}catch(Exception e) {}}}
}

二客户端的创建

服务端用ServerSocket创建,如果我们吧服务的和客户端看成事一个通信通道(Channel),那么每个客户端的接入都会创建一个通信通道,那么通信通道的创建也需要实现多线程,可以实现Runnable接口,我们存放通道可以用线程容器CopyOnWriteArrayList来存放通道。

/***@类名 Chat*@描述 TODO Socket服务端(测试类)*@版本 1.0*@创建人 XuKang*@创建时间 2020/9/24 16:17**/
public class Chat {private static CopyOnWriteArrayList<Channel> all =new CopyOnWriteArrayList<Channel>();public static void main(String[] args) throws IOException {System.out.println("-----Server-----");// 1、指定端口 使用ServerSocket创建服务器ServerSocket server =new ServerSocket(8888);// 2、阻塞式等待连接 acceptwhile(true) {Socket  client =server.accept(); System.out.println("一个客户端建立了连接");Channel c =new Channel(client);all.add(c); //管理所有的成员new Thread(c).start();			}		}//一个客户代表一个Channelstatic class Channel implements Runnable{private DataInputStream dis;private DataOutputStream dos;private Socket  client;			private boolean isRunning;private String name;public Channel(Socket  client) {this.client = client;try {dis = new DataInputStream(client.getInputStream());dos =new DataOutputStream(client.getOutputStream());isRunning =true;//获取名称this.name =receive();//退出出聊天室//欢迎你的到来this.send("欢迎你的到来");sendOthers(this.name+"来了徐康聊天室",true);//暂时固定为私聊} catch (IOException e) {System.out.println("---1------");release();					}			}//接收消息private String receive() {String msg ="";try {msg =dis.readUTF();} catch (IOException e) {System.out.println("---2------");release();}return msg;}//发送消息private void send(String msg) {try {dos.writeUTF(msg);dos.flush();} catch (IOException e) {System.out.println("---3------");release();}}/*** @方法名 sendOthers* @描述 TODO 群聊:获取自己的消息,发给其他人,需要设置isSys为false* 		 TODO 私聊: 约定数据格式: @xxx:msg* @参数 msg 发送内容* @返回值* @创建人 XuKang* @创建时间 2020/9/24 16:28*/private void sendOthers(String msg,boolean isSys) {boolean isPrivate = msg.startsWith("@");if(isPrivate) { //私聊int idx =msg.indexOf(":");//获取目标和数据String targetName = msg.substring(1,idx);msg = msg.substring(idx+1);for(Channel other: all) {if(other.name.equals(targetName)) {//目标other.send(this.name +"悄悄地对您说:"+msg);break;}}}else {				for(Channel other: all) {if(other==this) { //自己continue;}if(!isSys) {other.send(this.name +"对所有人说:"+msg);//群聊消息}else {other.send(msg); //系统消息}}}}//释放资源private void release() {this.isRunning = false;CloseUtils.close(dis,dos,client);//退出all.remove(this);sendOthers(this.name+"离开大家庭...",true);}@Overridepublic void run() {while(isRunning) {String msg = receive() ;if(!msg.equals("")) {//send(msg);sendOthers(msg,false);}}}}
}

三、效果如下

1.启动服务端

在这里插入图片描述

2.启动客户端

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.发送消息

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

此案例只能用来打发时间,入门网络编程可以参考一下,真正的开发不会这么弄


http://chatgpt.dhexx.cn/article/PyGQDMRT.shtml

相关文章

Java在线聊天室(客户端+服务器)

Java在线聊天室&#xff08;客户端服务器&#xff09;基于webSocket实现模拟在线聊天系统 运行环境&#xff1a; JDK1.8version 开发环境&#xff1a;Eclipse 一、结构 以下是系统主要结构&#xff1a; 1.用户&#xff08;均实现部分可能会有bug&#xff09; &#xff08;…

apiDay09整理笔记(笔记优化)

目录 1.聊天室&#xff08;续&#xff09; &#xff08;1&#xff09;实现服务端发送消息给客户端 &#xff08;2&#xff09;服务端转发消息给所有客户端 &#xff08;3&#xff09;客户端解决收发消息的冲突问题 &#xff08;4&#xff09;服务端完成处理客户端断开连接…

JAVA简单聊天室的实现

目录 界面效果图 一、聊天室功能介绍&#xff1f; 二、功能代码 1.服务端 2.客户端 界面效果图 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、聊天室功能介绍&#xff1f; 1. 、对于聊天室就是处理多个客户端发送的请求与信息&#xff0c;从…

Java网络聊天室---个人博客

Java网络聊天室 ———个人博客 一、项目简介 功能描述&#xff1a; 使用图形用户界面和socket通信&#xff0c;能实现一个聊天室中多人聊天&#xff0c;可以两人私聊&#xff0c;可以发送文件。 实现类似QQ用户注册、登录、聊天等功能。 参考git地址或博客地址&#xff1a…

Java实现ChatRoom

基于连接通信Socket、多线程的Java聊天室 1、开发环境&#xff1a; IDEA2018.1JDK1.8 2、实现功能&#xff1a; 实现了模拟登录注册、群聊、私聊、显示当前在线人数列表&#xff1b; 在发送信息时&#xff0c;会向对方发送者及显示发送时间&#xff1b; 显示在线人数列表…

Java聊天室

项目介绍&#xff1a; Java聊天室是期末设计&#xff0c; 阿里巴巴druidmysql多线程GUImvn项目java Socket 服务端模块&#xff1a;踢出聊天室&#xff1a;管理员可以踢出发言不当的用户。只有当开启服务端的时候&#xff0c;客户端才能起到作用。 客户端模块&#xff1a; 注册…

用Java实现简易聊天室

说明&#xff1a;如果一个 类&#xff0c;需要有界面的显示&#xff0c;那么该类就需要继承自JFrame&#xff0c;此时&#xff0c;该类就可以被称为一个“窗体类"。 服务端代码&#xff1a; package cn.qy.chat;import javax.swing.*; import java.awt.*; import java.aw…

微信小程序购物车功能实现(干货满满)

微信小程序定制好看的购物车页面&#xff0c;实现购物车功能&#xff0c;希望对您有所帮助&#xff01; 1. 应用场景 2. 思路分析 3. 代码分析 4. 具体实现代码 效果截图&#xff1a; 1.应用场景 适用于商城、秒杀、商品购买等类型的小程序&#xff0c;负责将顾客浏览的商…

微信小程序微商城(八):缓存实现商品购物车功能

IT实战联盟博客&#xff1a;http://blog.100boot.cn 上一篇&#xff1a;微信小程序微商城&#xff08;七&#xff09;&#xff1a;动态API实现商品分类 看效果 购物车.gif 开发计划 1、商品详情页将商品信息放入缓存 2、购物车页面读取缓存获取商品信息 3、购物车商品计算…

微信小程序开发一个小型商城(六、购物车页面)

上一篇文章&#xff1a;微信小程序开发一个小型商城&#xff08;五、商品详情&#xff09; 当我们在商品详情界面中点击添加购物后&#xff0c;会跳转到购物车界面&#xff0c;购物车界面是一个tabbar&#xff0c;在跳转的时候需要加上ope-type。看下购物车的静态页面把&#x…

微信小程序实现一个购物车页面的简易列表效果

本文只是简单的模仿天猫APP的购物车列表的样式效果&#xff0c;并实现了部分事件功能&#xff0c;功能并不完善&#xff0c;请降低期待观看。 天猫APP的购物车效果&#xff1a; 小程序模仿的实现效果&#xff1a; wxml部分的代码&#xff1a; <view wx:if"{{!isCartEmp…

【Python之pymysql库学习】一、分析fetchone()、fetchmany()、fetchall()(保姆级图文+实现代码)

目录 实现效果实现思路实现代码总结 欢迎关注 『Python之pymysql库学习』 系列&#xff0c;持续更新中 欢迎关注 『Python之pymysql库学习』 系列&#xff0c;持续更新中 实现效果 实现思路 其实有半数代码是创建数据库和创建数据表并插入数据这些环境配置部分我都写好了&…

fetchone、fetchall

fetchone(): 该方法获取下一个查询结果集。结果集是一个对象,读取一行结果&#xff0c;读取完指向下一行&#xff0c;到空为止 fetchall():接收全部的返回结果行&#xff0c;到空为止 fetchone() &#xff1a; 返回单个的元组&#xff0c;也就是一条记录(row)&#xff0c;如果没…

python fetchall方法_Python连接MySQL并使用fetchall()方法过滤特殊字符

python3.3从mysql里取出的数据莫名其妙有括号和逗号每天跟自己喜欢的人一起&#xff0c;通电话&#xff0c;旅行&#xff0c;重复一个承诺和梦想&#xff0c;听他第二十八次提起童年往事&#xff0c;每年的同一天和他庆祝生日&#xff0c;每年的情人节圣诞节除夕&#xff0c;也…

pdo fetchAll

作用 fetchAll()方法是获取结果集中的所有行.其返回值是一个包含结果集中所有数据的二维数组。 PDOStatement::fetchAll ([ int $fetch_style [, mixed $fetch_argument[, array$ctor_args array() ]]] ) fetch_style:控制结果的返回方式 PDO::FETCH_ASSOC 关联数组形式 PD…

记录一个常用函数fetchall()的使用过程

fetchall() 作用是返回多个元组&#xff0c;即对应数据库里的多条数据概念&#xff1b; 常见用法是 cursor.execute(‘select * from table’) value cursor.fetchall() 此时&#xff0c;print(value)则会输出以下二维元组&#xff0c;如下图 拓展&#xff1a; 同类函数fet…

Python从Oracle数据库中获取数据——fetchall(),fetchone(),fetchmany()函数功能分析

Python从Oracle数据库中获取数据——fetchall(),fetchone(),fetchmany()函数功能分析 一、fetchall()&#xff0c;fetchone()&#xff0c;fetchmany()简单介绍 1、fetchall()函数,它的返回值是多个元组,即返回多个行记录,如果没有结果,返回的是() 2、fetchone()函数,它的返回…

KITTI数据集可视化(一):点云多种视图的可视化实现

如有错误&#xff0c;恳请指出。 在本地上&#xff0c;可以安装一些软件&#xff0c;比如&#xff1a;Meshlab&#xff0c;CloudCompare等3D查看工具来对点云进行可视化。而这篇博客是将介绍一些代码工具将KITTI数据集进行可视化操作&#xff0c;包括点云鸟瞰图&#xff0c;FOV…

KITTI数据集的点云格式转PCD格式

参考文章&#xff1a;https://blog.csdn.net/xinguihu/article/details/78922005 KITTI数据集应该不用多做介绍了&#xff0c;基本上做自动驾驶的都知道这个东西。最近本人用到这个数据集想看看里面的点云长什么模样&#xff0c;却发现有点别扭&#xff0c;没有直接可以看的工…

使用kitti数据集实现自动驾驶——发布照片、点云、IMU、GPS、显示2D和3D侦测框

本次内容主要是使用kitti数据集来可视化kitti车上一些传感器&#xff08;相机、激光雷达、IMU&#xff09;采集的资料以及对行人和车辆进行检测并在图像中画出行人和车辆的2D框、在点云中画出行人和车辆的3D框。 首先先看看最终实现的效果&#xff1a; 自动驾驶视频 看了上面的…