# 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 =
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
用 Java 图形用户界面编写聊天室服务器端和客户端, 支持多个客户端连接到一个服务器。每个客户端能够输入账号,包括注册功能。 可以实现群聊(聊天记录显示在所有客户端界面)。 完成好友列表在各个客户端上显示,包括头像和用户名。 可以实现私人聊天,用户可以选择某个其他用户,单独发送信息,同时实现了文件传输,还能发送窗口振动。 服务器能够群发系统消息,能够对用户私发消息,能够强行让某些用户下线。 客户端的上线下线要求能够在其他客户端上面实时刷新。
资源推荐
资源详情
资源评论
收起资源包目录
100012620-基于Java Socket 通信实现的(图形界面)聊天室.zip (47个子文件)
jsocket
ChatRoom
user.db 300B
src
client
ClientThread.java 8KB
ClientMain.java 2KB
DataBuffer.java 2KB
model
entity
OnlineUserListModel.java 2KB
MyCellRenderer.java 1KB
ui
LoginFrame.java 6KB
ChatFrame.java 19KB
RegisterFrame.java 7KB
util
ClientUtil.java 2KB
JFrameShaker.java 3KB
common
model
entity
FileInfo.java 2KB
Message.java 1KB
ResponseStatus.java 250B
ResponseType.java 1KB
Request.java 2KB
Response.java 2KB
User.java 3KB
util
SocketUtil.java 1KB
IOUtil.java 1KB
serverconfig.properties 37B
server
OnlineClientIOCache.java 1KB
controller
RequestProcessor.java 14KB
DataBuffer.java 2KB
model
service
UserService.java 3KB
entity
OnlineUserTableModel.java 2KB
RegistedUserTableModel.java 2KB
ui
ServerInfoFrame.java 9KB
MainServer.java 2KB
images
10.png 3KB
9.png 4KB
3.png 3KB
0.png 2KB
logo.png 22KB
shake.png 675B
1.png 2KB
sendFace.png 819B
6.png 3KB
5.png 3KB
4.png 3KB
8.png 3KB
font.png 766B
7.png 3KB
2.png 3KB
sendPic.png 786B
LICENSE 1KB
README.md 43KB
共 47 条
- 1
资源评论
- 为梦想而努力8692023-06-28资源是宝藏资源,实用也是真的实用,感谢大佬分享~
神仙别闹
- 粉丝: 4131
- 资源: 7483
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功