# Java Socket 通信实现的聊天室
## 前言
自从开始弄起数据挖掘之后,已经很久没写过技术类的博客了,最近学校 Java 课设要求实现一个聊天室,想想去年自己已经写了一个了,但是有些要求到的功能我也没实现,但看着原有的代码想了想加功能好像有那么点点难,于是就想着重构,也正好之前有看到别人写的 CS 架构的代码,感觉扩展性还不错,就试着写了写,写完这个聊天室后,还同时写了一个教学白板,那个白板基于这个聊天室的代码仅仅花了三四个小时就完成了!所以,有一个好的架构还是很重要的。下面就开始介绍我重构后的聊天室([代码已上传到 github](https://github.com/leo6033/Chat_Room))
## 功能介绍
1. 用 Java 图形用户界面编写聊天室服务器端和客户端, 支持多个客户端连接到一个服务器。每个客户端能够输入账号,包括注册功能。
2. 可以实现群聊(聊天记录显示在所有客户端界面)。
3. 完成好友列表在各个客户端上显示,包括头像和用户名。
4. 可以实现私人聊天,用户可以选择某个其他用户,单独发送信息,同时实现了文件传输,还能发送窗口振动。
5. 服务器能够群发系统消息,能够对用户私发消息,能够强行让某些用户下线。
6. 客户端的上线下线要求能够在其他客户端上面实时刷新。
7.服务器能够查看在线用户和注册用户
(加了下划线的是课设要求之外的)
## 整体思路
数了数,总共写了 27 个类,看起来还是蛮多的,但是仔细看一看还是很简单的,我将在下面对其中部分进行解释
### 工具类
[![](https://www.writebug.com/myres/static/uploads/2021/11/24/48cb9111b12b2218c882d9d5b8cd7f94.writebug)](https://img2018.cnblogs.com/blog/1413964/201906/1413964-20190605173457919-618512007.png)
在我之前写的几个 socket 通信有关的项目里,客户端和服务器传输的都是字符串,而这次,我把要传输的内容封装成了两个类 Response 和 Request,客户端向服务器发起请求,服务器向客户端回应,通过两个类中包含的请求类型来判断需要进行的操作,传输采用 ObjectStream。仔细以看其实会发现,这两个类内容很相似
### Request
```
1 public class Request implements Serializable {
2 private static final long serialVersionUID = -1237018286305074249L;
3 /** 请求传送的数据类型 */
4 private ResponseType type;
5 /** 请求动作 */
6 private String action;
7 /** 请求域中的数据,name-value */
8 private Map<String, Object> attributesMap;
9
10 public Request(){
11 this.attributesMap = new HashMap<String, Object>();
12 }
13
14 public ResponseType getType() {
15 return type;
16 }
17
18 public void setType(ResponseType type) {
19 this.type = type;
20 }
21
22 public String getAction() {
23 return action;
24 }
25
26 public void setAction(String action) {
27 this.action = action;
28 }
29
30 public Map<String, Object> getAttributesMap() {
31 return attributesMap;
32 }
33
34 public Object getAttribute(String name){
35 return this.attributesMap.get(name);
36 }
37
38 public void setAttribute(String name, Object value){
39 this.attributesMap.put(name, value);
40 }
41
42 public void removeAttribute(String name){
43 this.attributesMap.remove(name);
44 }
45
46 public void clearAttribute(){
47 this.attributesMap.clear();
48 }
49 }
```
### Response
```
1 public class Response implements Serializable {
2 private static final long serialVersionUID = 1689541820872288991L;
3 /** 响应状态 */
4 private ResponseStatus status;
5 /** 响应数据的类型 */
6 private ResponseType type;
7
8 private Map<String, Object> dataMap;
9
10 /** 响应输出流 */
11 private OutputStream outputStream;
12
13 public Response(){
14 this.status = ResponseStatus.OK;
15 this.dataMap = new HashMap<String, Object>();
16 }
17
18
19 public ResponseStatus getStatus() {
20 return status;
21 }
22
23 public void setStatus(ResponseStatus status) {
24 this.status = status;
25 }
26
27 public ResponseType getType() {
28 return type;
29 }
30
31 public void setType(ResponseType type) {
32 this.type = type;
33 }
34
35 public Map<String, Object> getDataMap() {
36 return dataMap;
37 }
38
39 public void setDataMap(Map<String, Object> dataMap) {
40 this.dataMap = dataMap;
41 }
42
43 public OutputStream getOutputStream() {
44 return outputStream;
45 }
46
47 public void setOutputStream(OutputStream outputStream) {
48 this.outputStream = outputStream;
49 }
50
51 public void setData(String name, Object value){
52 this.dataMap.put(name, value);
53 }
54
55 public Object getData(String name){
56 return this.dataMap.get(name);
57 }
58
59 public void removeData(String name){
60 this.dataMap.remove(name);
61 }
62
63 public void clearData(){
64 this.dataMap.clear();
65 }
66 }
```
在以上两个类中,传输的内容会包括文件和消息,对于文件和消息,我们需要直到发送者和接受者是谁,需要知道发送时间等等,所以同样封装成了两个类
### FileInfo
```
1 public class FileInfo implements Serializable {
2 private static final long serialVersionUID = -5394575332459969403L;
3 /** 消息接收者 */
4 private User toUser;
5 /** 消息发送者 */
6 private User fromUser;
7 /** 源文件名 */
8 private String srcName;
9 /** 发送时间 */
10 private Date sendTime;
11 /** 目标地IP */
12 private String destIp;
13 /** 目标地端口 */
14 private int destPort;
15 /** 目标文件名 */
16 private String destName;
17 public User getToUser() {
18 return toUser;
19 }
20 public void setToUser(User toUser) {
21 this.toUser = toUser;
22 }
23 public User getFromUser() {
24 return fromUser;
25 }
26 public void setFromUser(User fromUser) {
27 this.fromUser = fromUser;
28 }
29 public String getSrcName() {
30 return srcName;
31 }
32 public void setSrcName(String srcName) {
33 this.srcName = srcName;
34 }
35 public Date getSendTime() {
36 return sendTime;
37 }
38 public void setSendTime(Date sendTime) {
39 this.sendTime = sendTime;
40 }
41 public String getDestIp() {
42 return destIp;
43 }
44 public void setDestIp(String destIp) {
45 this.destIp = destIp;
46 }
47 public int getDestPort() {
48 return destPort;
49 }
50 public void setDestPort(int destPort) {
51 this.destPort = destPort;
52 }
53 public String getDestName() {
54 return destName;
55 }
56 public void setDestName(String destName) {
57 this.destName = destName;
58 }
59 }
```
### Message
```
1 public class Message implements Serializable {
2 private static final long serialVersionUID = 1820192075144114657L;
3 /** 消息接收者 */
4 private User toUser;
5 /** 消息发送者 */
6 private User fromUser;
7 /** 消息内容 */
8 private String message;
9 /** 发送时间 */
10 private Date sendTime;
11
12
13 public User getToUser() {
14 return toUser;
15 }
16 public void setToUser(User toUser) {
17 this.toUser = toUser;
18 }
19 public User getFromUser() {
20 return fromUser;
21 }
22 public void setFromUser(User fromUser) {
23 this.fromUser =
![avatar](https://profile-avatar.csdnimg.cn/fbed2db386fd4018b8f2474d6651545d_s1t16.jpg!1)
神仙别闹
- 粉丝: 4601
- 资源: 7559
最新资源
- Matlab机械臂七次B样条轨迹规划程序:带速度加速度约束的八个点优化解决方案,基于NSGA-II遗传算法的时间、能量、冲击最优策略,Matlab机械臂七次B样条轨迹规划程序:带速度加速度约束的八个点
- 基于MATLAB的交流电机动态分析程序:输入参数预测转速与力矩变化,基于MATLAB的交流电机动态方程分析与模拟程序:输入参数预测转速、力矩变化,基于matlab的交流电机动态方程,用于交流电机动态分
- 21个直播间礼物svga资源
- COMSOL模拟锌离子电池:锌离子沉积浓度场的源文件解析,深入探究COMSOL模拟锌离子电池中锌离子沉积浓度场源文件的技术与应用,comsol模拟锌离子电池锌离子沉积浓度场源文件 ,comsol模拟
- 多策略增强版三角拓扑聚合优化器-基于数学模型的连续优化与工程应用优化器的新发展,基于多策略改进的三角拓扑聚合优化器(ITTAO):一种数学启发式算法,解决连续优化问题与工程应用中的全局与局部最优平衡
- Simulink仿真模型光伏储能VSG与电容融合运行展示:波形完美展现光储一次调频、削峰填谷与直流母线电压控制功能,Simulink仿真模型下的光伏储能VSG运行及功能特点:光储一次调频、削峰填谷、直
- COMSOL电弧模拟与等离子体特性研究,COMSOL电弧模拟技术:探索等离子体行为与物理机制,comsol电弧模拟 等离子体 ,comsol电弧模拟; 等离子体模拟; 仿真建模; 物理现象模拟,COM
- 采用STC89C54RD设计的智能家居控制系统【含系统程序、系统PPT、设计报告、电路图等】
- MATLAB仿真的夫琅禾费衍射强度图:圆孔、圆环、矩形孔定制研究,MATLAB仿真:夫琅禾费衍射强度图的可定制性-以圆孔、圆环及矩形孔为例的研究分析,MATLAB夫琅禾费衍射强度图仿真 圆孔,圆环
- 基于CarSim与Matlab的ABS模糊控制策略联合仿真研究:优化制动效能与滑移率控制,汽车ABS模糊控制策略与逻辑门限值控制的联合仿真研究:提升制动效能与滑移率优化,基于CarSim和Matlab
- matlab实现FFT算法线性调频多目标仿真研究-LFM-FFT-目标识别-matlab
- COMSOL模拟锌离子电池锌负极电场模型教程:初学者友好版,附详细制作过程与多种模型源文件参考,COMSOL模拟锌离子电池锌负极电场模型源文件详解与教程:从初学者的角度出发,掌握电场模型制作全流程及多
- 30KW储能双向变流器PCS逆变器设计方案:高效能量转换与存储技术,优质高效 30KW储能PCS逆变器双向变流器设计方法与解析资料大全,30KW储能PCS逆变器双向变流器设计方案资料, ,核心关键词:
- 无感FOC技术解析:基于磁链观测器的零速带载闭环启动与力矩保持算法资料及MDK项目源码详解,无感FOC算法资料:磁链观测器、零速带载闭环启动、堵转力矩保持与直接正反转控制技术详解-含Cubemx配置
- AC DC DC模拟EV充电仿真系统:前后级交错PFC Boost与移相全桥隔离技术实现与matlab Simulink环境下模拟实践,AC DC转换与DC模拟EV充电仿真:PFC Boost与移相全
- matlab实现FXLMS主动噪声控制算法研究-自适应滤波器-噪声污染-噪音消除-matlab
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)