基于Java的在线聊天室
概述
详细
一、项目功能
本项目使用java socket编程,实现一个具有GUI界面的在线聊天室:
该项目具有以下几项功能:
构建一个服务器 S 和若干个客户机 C;
每一台客户机 C 都可以与服务器 S 和其他客户机连接;
每一台客户机 C 都可以通过 S 获得其他客户机发来的信息,并显示哪一台客户机在线,使用的是什么 IP 等;
群聊功能:每一台客户机 C 可以通过服务器 S 的群聊天室与其他客户机通信,即既可接收信息也可发送信息;
私聊功能:客户机 C 通过选择在线的用户并进行连接,进行私聊;
支持文件传输
二、项目文件结构
项目目录结构如下:
youliao │ │ 1-双击编译.bat │ 2-双击运行服务端.bat │ 3-双击运行客户端.bat │ beautyeye_lnf.jar // 图形界面用到的库 │ ClientMain.java // 客户端启动文件 │ ServerMain.java // 服务端启动文件 │ ├─client │ chat.png │ ChatClient.java │ Client.java │ ClientView.java │ FileClient.java │ └─server ChatServer.java FileServer.java
客户端client和服务端server分离,其中beautyeye_lnf.jar是GUI用到的第三方库, 客户端包括聊天客户端和文件客户端, 服务端也包括这两种, 另外客户端还实现了GUI界面ClientView. 项目中附带了三个bat脚本, 可用于快速编译运行, 也可自己使用IDE创建项目.
三、项目运行
注意, 该项目不兼容最新版版的Java10, 使用Java10运行会出现客户端界面显示不完整的问题, 在Java8 (jdk1.8)下能完美运行, 推荐使用Java8.
这里主要介绍两种运行方法:
方法一:
1. 不需要新建项目, 只需将压缩包解压, 先 双击编译.bat
2. 编译成功后, 双击运行服务端.bat, 这是会启动服务端, 服务默认会监听8080端口
3. 双击运行客户端.bat, 会打开聊天窗口, 输入服务器ip和端口进行连接. 客户端可运行多个, 模拟多人登录, 并可进行群聊.
方法二:
在Java IDE中新建项目, 将 beautyeye_lnf.jar, client文件夹, server文件夹添加到 BuildPath 中, 运行ServerMain 和 ClientMain, 注意运行ServerMain的时候需要输入命令行参数, 或者修改main函数, 手动设置port.
四、项目实现
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 与服务器的交互过程。
四、其他说明
评论有时不能及时看到, 该项目内容较多, 有疑问的直接联系我