基于Java的在线聊天室
概述
详细
一、项目功能
本项目使用java socket编程,实现一个具有GUI界面的在线聊天室:
该项目具有以下几项功能:
-
构建一个服务器 S 和若干个客户机 C;
-
每一台客户机 C 都可以与服务器 S 和其他客户机连接;
-
每一台客户机 C 都可以通过 S 获得其他客户机发来的信息,并显示哪一台客户机在线,使用的是什么 IP 等;
-
群聊功能:每一台客户机 C 可以通过服务器 S 的群聊天室与其他客户机通信,即既可接收信息也可发送信息;
-
私聊功能:客户机 C 通过选择在线的用户并进行连接,进行私聊;
-
支持文件传输
二、项目文件结构
项目机构图如下:
客户端和服务器分离,其中beautyeye_lnf.jar是GUI用到的第三方库,compile.sh是编译的脚本,里面的内容是编译的命令,如下图
1 2 3 4 5 6 7 | rm -f *. class client/*. class server/*. class cd server javac *.java cd ../client javac *.java -classpath .:beautyeye_lnf.jar cd .. javac *.java |
需要注意的是编译客户端的java文件时classpath为 .:beautyeye_lnf.jar ,编译之后先运行服务器,端口号可换为其他端口
1 | java ServerMain 8080 |
然后运行客户端,可同时运行多个客户端,在客户端的GUI界面,填写服务器IP和端口以及用户姓名即可连接。
1 | java -classpath .:client /beautyeye_lnf .jar ClientMain |
三、实验设计
1. 服务器设计思路
一共有两台服务器,一台聊天服务器 ChatServer 和一台文件服务器 FileServer。
ChatServer
ChatServer 主要负责转发聊天内容和用户信息给所有用户,用于支持跟进用户信息功能和群聊功能。用户 A 连接服务器的时候,首先向服务器发送一个用户名,服务器收到之后搭建 socket 连接,然后记录用户 A 的 IP 和端口号,接着服务器将所有当前在线的用户的名字、IP 和端口信息发送给这位刚上线的用户 A,最后服务器向其他在线的用户群发用户 A 的名字、IP 和端口号以提示新用户上线,这里IP 和端口号的作用是方便客户端进行私聊。用户 A 要下线的时候,发送一个命令"[OFFLINE]"给服务器提示下线,服务器清除相关资源并关闭连接,同时将用户 A 要下线的消息转发给其他在线用户。在使用群聊功能时,某个客户端发起群聊消息给服务器,服务器会把该消息转发给其他在线用户,从而实现群聊的功能。私聊时,客户端向服务器发送私聊消息,由服务器转发给指定的接收用户。
下面是服务器与客户端的交互的过程以及发送数据的格式:
FileServer
FileServer 主要为整个应用提供传输文件服务器,包括群发文件和私发文件。客户端想要发送文件的时候,将文件发送给服务器并附加相关信息(群发/私发), 服务器根据客户端的需求将文件转发给其他在线⽤户。下面是文件服务器和客户端的交互过程:
2. 客户端设计思路
群聊和私聊
与服务器交互,直接按照前面所述的格式向服务器发送数据,并且接受来自服务器的数据即可。发送数据时,将相关的数据按照相应的格式封装好再进行发送, 接收数据时,将来自服务器的数据按照"[#]"进行切割,提取相关字段的数据之后呈递给 GUI 层使用。
文件传输
客户端不管是私聊还是群聊的文件都直接发送给服务器,再由服务器完成相应的转发。通信过程在前面已经有所阐述,这里不再重复。
与 GUI 层的交互
客户端和 GUI 分别是两个线程,GUI 负责用户界面的渲染和相关操作的响应,客户端则是负责跟服务器进行数据交互或者私聊的时候跟其他客户端进行交互,并且将交互的数据呈递给 GUI 使用。下面简单描述 GUI 与服务器的交互过程。
四、其他说明
第一次发布,有疑问的可以评论或联系我
另外,说明一点:
本项目代码不是直接的eclipse项目形式,不能直接导入eclipse运行,放入到eclipse运行,需要自己建java项目。
注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?