java实现聊天室(GUI界面+私聊+群聊)

article/2025/10/23 5:24:09

登录界面的用户名和端口号不能重复!
登录界面的用户名和端口号不能重复!
登录界面的用户名和端口号不能重复!

java的socket编写的聊天室,GUI的界面,可以私聊和群聊,
聊天信息保存为txt

有需要的可以自行下载,可以先观看教学视频再决定是否购买

下载链接:
https://download.csdn.net/download/qq_52889967/20065491

教学视频:
https://v.qq.com/x/page/u3258g37y8s.html

java学生成绩管理系统(GUI界面):
https://blog.csdn.net/qq_52889967/article/details/118581246

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
保存结果:在D盘
“D:\私聊记录.txt”
“D:\群聊记录.txt”

部分源代码展示:
在这里插入图片描述

部分源代码如下:
服务端:

package myproject;import java.awt.Font;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.ArrayList;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;public class UI {//	定义文本区public static JTextArea text_area=new JTextArea();
//	定义存储从客户端接受到的客户用户名、IP和端口号public static ArrayList<String> all_userArrayList=new ArrayList<String>();public static ArrayList<String> all_userArrayList_IP=new ArrayList<String>();public static ArrayList<String> all_userArrayList_Port=new ArrayList<String>();//	定义存储客户端IP的Stringpublic static String IP =null;public static void main(String[] args) {// TODO Auto-generated method stubUI ui=new UI();ui.init_1();}//	定义服务器界面public void init_1() {
//		定义窗口JFrame jframe_1=new JFrame("服务器");//		服务器关闭时,保存分割线(防止不同的txt保存混在一起)jframe_1.addWindowListener(new WindowListener() {@Overridepublic void windowOpened(WindowEvent e) {}@Overridepublic void windowClosing(WindowEvent e) {// 此处加入操作动作
//            	保存群聊的分割线Save.save_1("-----------分割线-----------", "-----------分割线-----------");
//            	保存私聊的分割线Save.save_2("-----------分割线-----------", "-----------分割线-----------",null);}@Overridepublic void windowClosed(WindowEvent e) {}@Overridepublic void windowIconified(WindowEvent e) {}@Overridepublic void windowDeiconified(WindowEvent e) {}@Overridepublic void windowActivated(WindowEvent e) {}@Overridepublic void windowDeactivated(WindowEvent e) {}});//		设置窗口大小jframe_1.setSize(400,400);
//		窗口不能调整jframe_1.setResizable(false);
//		空布局jframe_1.setLayout(null);
//		退出则关闭程序jframe_1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//		定义按钮JButton jbutton_1=new JButton("开启服务器");
//		设置按钮位置和大小jbutton_1.setBounds(130,0,130,40);
//		将按钮添加到窗口jframe_1.add(jbutton_1);//		设置文本区位置和大小text_area.setBounds(0,50,385,310);
//		设置文本区不可编辑text_area.setEditable(false);
//		定义滚动面板JScrollPane sp_3=new JScrollPane(text_area);sp_3.setLocation(0,50);sp_3.setSize(385,310);
//		定义字体Font font=new Font("宋体",Font.BOLD,16);sp_3.setFont(font);jframe_1.add(sp_3);//		注册开启服务器按钮的监听EventListener e=new EventListener(jbutton_1);jbutton_1.addActionListener(e);
//		窗口居中jframe_1.setLocationRelativeTo(null);
//		显示窗口jframe_1.setVisible(true);	}}
package myproject;import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;import javax.swing.JOptionPane;// 开启服务器的server(多线程)
// 每个客户端与服务器连接后,都会将自己的用户名和端口号发送过来(只接收客户端用户名、IP和端口号)
public class Server_1 extends Thread {public static ServerSocket server_1=null;public static Socket socket_1=null;
//	定义输入流,用于接收客户端发送的消息public static InputStream input_1=null;public static DataInputStream dinput_1=null;
//	定义字符串用于暂时存储信息String s=null;//启动线程的方法public void run() {
//		死循环,当有客户端连接时,循环等待下一个客户端while(true) {
//			异常捕获try {
//				开放2021端口server_1=new ServerSocket(2021);
//				调用获取socket方法,等待连接socket_1=server_1.accept();
//				获取输入流input_1=socket_1.getInputStream();dinput_1=new DataInputStream(input_1);//				读取用户名并添加s =dinput_1.readUTF();UI.all_userArrayList.add(s);//				读取IPUI.IP=dinput_1.readUTF();
//				处理接收到的IP,接收的IP格式为主机名/ip,我们只需要后面的部分(通过正则表达式匹配数据)String str[]=UI.IP.split("/");
//				str[1]为我们需要的数据UI.IP=str[1];UI.all_userArrayList_IP.add(UI.IP);
//				System.out.println("IP:"+UI.all_userArrayList_IP);//				读取端口号并添加UI.all_userArrayList_Port.add(dinput_1.readUTF());
//				System.out.println("端口号:"+UI.all_userArrayList_Port);
//				提示用户上线UI.text_area.append("用户->"+s+" 上线了!\n");}catch (Exception e) {System.out.println(e);JOptionPane.showMessageDialog(null, "Server_1服务器异常!!!","错误提示",JOptionPane.WARNING_MESSAGE);break;}finally {if(dinput_1!=null) {try {dinput_1.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(input_1!=null) {try {input_1.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(socket_1!=null) {try {socket_1.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}if(server_1!=null) {try {server_1.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}}	}
}
package myproject;import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;import javax.swing.JOptionPane;//只用于将当前在线人数传递到客户端
public class Server_3 extends Thread {public static ServerSocket server_1=null;public static Socket socket_1=null;
//	定义输出流public static OutputStream output_1=null;public static DataOutputStream doutput_1=null;//启动线程的方法public void run() {
//		死循环,当有客户端连接时,循环等待下一个客户端while(true) {
//			异常捕获try {
//				开放2023端口server_1=new ServerSocket(2023);
//				调用获取socket方法,等待连接socket_1=server_1.accept();
//				获取输出流output_1=socket_1.getOutputStream();doutput_1=new DataOutputStream(output_1);
//				发送用户数量doutput_1.writeUTF(""+UI.all_userArrayList.size());
//				发送用户名for(int i=0;i<UI.all_userArrayList.size();i++) {doutput_1.writeUTF(UI.all_userArrayList.get(i));
//					System.out.println(UI.all_userArrayList);}
//				System.out.println(UI.all_userArrayList.size());
//				System.out.println("服务端:"+UI.all_userArrayList);}catch (Exception e) {System.out.println(e);JOptionPane.showMessageDialog(null, "Server_3服务器异常!!!","错误提示",JOptionPane.WARNING_MESSAGE);break;}finally {if(doutput_1!=null) {try {doutput_1.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(output_1!=null) {try {output_1.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(socket_1!=null) {try {socket_1.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}if(server_1!=null) {try {server_1.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}}	}
}

客户端:

package myproject;import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.util.ArrayList;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;public class UI {
//	窗口public static JFrame jframe_1 = new JFrame("聊天小程序");
//	定义容器public static JFrame jframe_2=new JFrame("登录");
//	设置面板public static JPanel p_1 = new JPanel(null);public static JPanel p_2 = new JPanel(null);public static JPanel p_3 = new JPanel(null);
//	按钮public static JButton jbutton_1 = new JButton("发送");
//	文本框public static JTextField text_1 = new JTextField();
//	文本区public static JTextArea text_area_1 = new JTextArea();public static JTextArea text_area_2 = new JTextArea();
//	注册用户名public static String user;
//	定义从客户端接受到的客户用户名,用于私聊展示public static ArrayList<String> all_userArrayList=new ArrayList<String>();public static void main(String[] args) {UI ui = new UI();ui.init();}//	登录界面public void init() {
//		流式布局jframe_2.setLayout(new FlowLayout());
//		设置窗口大小jframe_2.setSize(250,150);
//		居中显示jframe_2.setLocationRelativeTo(null);
//		退出后程序结束jframe_2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//		定义标签JLabel l_1=new JLabel("用户名: ");JLabel l_2=new JLabel("服务器IP: ");
//		定义字体(宋体,加粗)Font font_1=new Font("宋体",Font.BOLD,20);l_1.setFont(font_1);l_2.setFont(font_1);
//		定义文本框JTextField text_2=new JTextField(10);JTextField text_3=new JTextField(10);text_2.setText("192.168.1.3");
//		定义按钮JButton jbutton_2=new JButton("注册并登录");jframe_2.add(l_2);jframe_2.add(text_2);jframe_2.add(l_1);jframe_2.add(text_3);jframe_2.add(jbutton_2);
//		注册监听EventListener_1 e_2=new EventListener_1(text_2,text_3);jbutton_2.addActionListener(e_2);
//		显示窗口jframe_2.setVisible(true);}//	主界面public static void init_1() {
//		空布局jframe_1.setLayout(null);;
//		窗口大小jframe_1.setSize(600,400);
//		窗口居中jframe_1.setLocationRelativeTo(null);
//		窗口不能调整jframe_1.setResizable(false);
//		退出后程序结束jframe_1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//		设置面板p_1.setLocation(0,0);p_2.setLocation(320,0);p_3.setLocation(0,300);p_1.setSize(280,280);p_2.setSize(280,400);p_3.setSize(280,100);p_2.setSize(280,400);p_1.setBackground(Color.LIGHT_GRAY);p_2.setBackground(Color.LIGHT_GRAY);p_3.setBackground(Color.LIGHT_GRAY);jframe_1.add(p_1);jframe_1.add(p_2);jframe_1.add(p_3);
//		设置按钮和文本框text_1.setBounds(0,0,180,30);jbutton_1.setBounds(220,0,60,30);p_3.add(text_1);p_3.add(jbutton_1);
//		定义服务器开启或关闭按钮JButton jbutton_2= new JButton("连接服务器");JButton jbutton_3= new JButton("查看在线人数");jbutton_2.setBounds(0,0,100,40);jbutton_3.setBounds(155,0,110,40);
//		设置文本区text_area_1.setBounds(0,0,280,280);text_area_2.setBounds(0,50,280,280);
//		设置文本区不可编辑text_area_1.setEditable(false);text_area_2.setEditable(false);
//		定义字体(宋体,加粗)Font font_1=new Font("宋体",Font.BOLD,16);//将text_area_1作为可滚动面板sp的显示区域JScrollPane sp_1=new JScrollPane(text_area_1);JScrollPane sp_2=new JScrollPane(text_area_2);sp_1.setLocation(0,0);sp_2.setLocation(0,50);sp_1.setSize(280,280);sp_2.setSize(280,280);
//		设置文本区字体text_area_1.setFont(font_1);text_area_2.setFont(font_1);p_1.add(sp_1);p_2.add(sp_2);
//		将服务器开启和查看在线人数按钮添加到p_2p_2.add(jbutton_2);p_2.add(jbutton_3);jframe_1.setVisible(true);//		注册 发送按钮 监听EventListener e_1 = new EventListener(text_area_1,text_1);jbutton_1.addActionListener(e_1);
//		注册连接服务器按钮的监听EventListener_2 e_2=new EventListener_2(jbutton_2);jbutton_2.addActionListener(e_2);}}

http://chatgpt.dhexx.cn/article/27U6PuiN.shtml

相关文章

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

一.客户端的创建 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(…

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;没有直接可以看的工…