Web在线聊天室(4) --- 详细设计

1. WebSocket

1.1 举例WebSocket应用

业务背景:张三要发送消息给李四

实现
(1)客户端点到点发送消息
(2)服务端转发消息(我们采取这种方式)

流程

  1. 张三发送消息给服务端
  2. 服务端发送消息给李四

在这里插入图片描述
这种是基于http协议的与服务端建立连接相互请求和响应

这种方式用http去实现是不行的

  1. 因为http是短连接,无状态的,一次请求完了服务器一次响应后就会断开连接。
  2. 服务器端的 ip 是开放在公网的,所有人能访问;而客户端的 ip 是不开放的(服务端不知道),所以服务器端不能主动给客户端发送消息

在这里插入图片描述
我们会采取这种服务器转发消息方式来实现消息发送。

我们这里用到 webSocket 技术

1.2 webSocket 实现的消息推送流程

(1)客户端和服务器端建立连接,只能客户端发起请求,然后双方建立连接(长连接)

客户端 js 代码:

websocket = new WebSocket("ws://localhost:8080/java_chatroom/test/1");

双方建立连接后:事件驱动的异步函数回调

(2)双方通信都是全双工的,客户端和服务端都可以主动的收发消息

客户端发消息websocket.send(message)

服务端发消息session.getBasicRemote().sendText(message)

这里的Session对象用来保持会话的,这是建立连接之后,就有的会话对象,只要我们有session引用,就可以发消息。

注意事项:session会话,是WebSocket的会话(长连接没关闭就是一个会话),和Servlet的session是不一样的

双方接收消息:被动接收(事件驱动的异步回调)

1.3 整个流程涉及到的主要代码

在这里插入图片描述

目前项目中,业务是需要把张三发送的消息转发到所有的客户端中,这里是由前端去过去某个消息频道的消息

前端保存有所有接收的消息,用户进入某个频道后,在接收的消息列表中,过滤并显示

张三的消息 + 渠道A —》发送到所有客户端 —》 李四在渠道C,接收到的消息,过滤只显示C渠道

在这里插入图片描述

2. 详细设计

2.1 前后端接口流程

用户相关接口:

  1. 注册
  2. 登录:输入账号密码,点击登录按钮后,调用的接口
  3. 检查是否已登录:页面初始化后,调用接口

分析以上接口和页面的执行流程(关联关系)
在这里插入图片描述
以上业务,客户端接收消息有两个场景:

  1. 上次登录之后 —》 数据库查询(发送的消息要保存在数据库)
    –》服务端建立连接事件
  2. 新的消息 --》 服务端接收消息事件中
    –》所有客户端转发消息

需要考虑:服务端在什么时候代码进行发送,客户端在什么地方接收
消息在服务端什么地方保存

2.2 前后端接口设计

2.2.1 用户管理

注册

请求:
POST /register
{
	name: xxx,
	password: xxx,
	nickName: "蔡徐坤",
	signature: "我擅长唱跳rap篮球",
}

响应:
HTTP/1.1 200 OK
{
	ok: true,
	reason: xxx
}

登录

请求:
POST /login
{
	name: xxx,
	password: xxx
}

响应:
HTTP/1.1 200 OK
{
	ok: true,
	reason: xxx,
	userId: xxx,
	name: xxx,
	nickName: xxx,
	signature: xxx
}

检测登陆状态

请求:
GET /login

响应:
HTTP/1.1 200 OK
{
	ok: true,
	userId: xxx,
	name: xxx,
	nickName: xxx,
	signature: xxx
}

注销

请求:
GET /logout

响应:
HTTP/1.1 200 OK
{
	ok: true,
	reason: xxx
}

2.2.2 频道管理

新增频道

请求:
POST /channel
{
	channelName: xxx
}

响应:
HTTP/1.1 200 OK
{
	ok: true,
	reason: xxx
}

查找频道信息

请求:
GET /channel

响应:
HTTP/1.1 200 OK
[
	{
		channelId: 1,
		channelName: xxx
	},
	{
		channelId: 2,
		channelName: xxx
	}
]

删除频道信息

请求:
DELETE /channel?channelId=xxx

响应:
HTTP/1.1 200 OK
{
	ok: true,
	reason: xxx
}

2.2.3 消息管理

建立连接

请求:
ws://[ip]:[port]/message/{userId}

发送/接收消息格式

{
	"userId": 1,
	"nickName": "蔡徐坤",
	"channelId": 1,
	"content": "这是消息正文"
}

2.3 数据库表设计

数据库名称设置为java_chatroom

drop database if exists java_chatroom;
create database java_chatroom character set utf8mb4;

use java_chatroom;

2.3.1 用户表

create table user (userId int primary key auto_increment,
                   name varchar(50) unique,
                   password varchar(50),
                   nickName varchar(50),   -- 昵称
                   iconPath varchar(2048), -- 头像路径
                   signature varchar(100),-- 个性签名
                   lastLogout DateTime -- 上次登录时间
); 

insert into user values(null, 'test', '123', '阿星', '', '我擅长java', now());
insert into user values(null, 'test2', '123', '阿甜', '', '我擅长唱歌', now());
insert into user values(null, 'test3', '123', '阿琦', '', '我擅长前端', now());
insert into user values(null, 'test4', '123', '阿库', '', '我擅长篮球', now());

2.3.2 频道表

create table channel (channelId int primary key auto_increment,
                      channelName varchar(50)
);
insert into channel values(null, '体坛赛事');
insert into channel values(null, '娱乐八卦');
insert into channel values(null, '时事新闻');
insert into channel values(null, '午夜情感');

2.3.3 消息表

create table message (messageId int primary key auto_increment,
                      userId int, -- 谁发的
                      channelId int, -- 发到哪个频道中
                      content text, -- 消息内容是啥
                      sendTime DateTime default now()    -- 发送时间
);

insert into message values (null, 1, 1, 'hehe1', now());
insert into message values (null, 1, 1, 'hehe2', now());
insert into message values (null, 1, 1, 'hehe3', now());
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 1. 介绍 5 1.1 项目概述 5 1.2 范围 5 1.3 参考 5 2. 用例视图 6 2.1 WAS - SAP R/3 集成用例 6 2.1.1 车辆列表功能 6 2.1.2 车辆订购申请单的创建功能 7 2.1.3 车辆订购申请单查询功能 7 2.1.4 车辆订购申请单的修改功能 7 2.1.5 索赔单的创建 8 2.1.6 数据交换需求 8 2.2 PORTAL集成的用例 8 2.2.1 经销商 Portal 框架 9 2.2.2 车辆销售系统和Portal的整合 9 2.2.3 Nadcon system 和Portal系统的整合 10 2.2.4 车辆销售系统和Nadcon 的整合 10 3. 逻辑视图 10 3.1 兼容性 10 3.2 系统架构 10 3.2.1 逻辑架构 10 3.2.2 Web 应用的包设计 12 3.3 组件设计 - J2EE WEB APPLICATION 13 3.3.1 MVC 框架 – Struts 13 3.3.2 日志 14 3.3.3 BAPI代理结构 15 3.3.4 销售商用户信息组件和安全组件 16 3.3.5 页面表现框架 17 3.3.6 车辆列表功能 18 3.3.7 车辆订购请求单创建 24 3.3.8 车辆订购申请单查询列表 32 3.3.9 车辆订购申 请单修改 37 3.3.10 索赔单创建 43 3.3.11 数据交换 50 3.3.12 登录 & 退出 53 4. 数据视图 56 4.1 车辆列一表 57 4.2 车辆订购申请单创建 58 4.3 车辆订购申请单列表 59 4.4 车辆订购申请单修改 60 4.5 索赔单创建 61 5. 实现视图 62 5.1 缓存策略 62 5.2 会话管理 62 5.3 连接管理 62 5.4 集成的需要 62 5.4.1 WAS – SAP 集成 63 5.4.2 单点登陆 63 5.4.3 Vehicle Sale 系统 和 Nadcon的集成 63 6. 部署视图 64 6.1 安装需求 64 6.1.1 服务器的安装 64 6.2 服务支持的考虑 64 6.2.1 安全 64 6.2.2 服务器管理 64 7. 实现环境视图 64 7.1 开发环境 64 7.2 测试环境 64 7.3 生产环境 65 7.3.1 网络 65 7.4 域信息 65
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值