在线聊天室
一、项目简介
该聊天室项目使用的是B/S架构,实现一个在线聊天室, 实现注册、登录、在线用户群聊、不同频道等功能。
后端技术
后端使用Java语言,主要的技术有servlet、websocket、JDBC、json等;
- servlet:配置资源映射
- websocket:websocket是一个应用层的协议,使用websocket来实现“消息推送”
- JDBC:实现数据库连接管理
- json:解析和封装数据,使用Gson库
使用的开发工具是idea,项目构建/部署工具:maven,项目服务器:tomcat
项目需求
项目需求分析:
- 打开主页,看到登陆页面
- 登陆成功后,进入主页面.
- 主页面显示当前具有的频道列表(当前用户关注了哪些频道)
- 点击某个频道到之后,可以看到该频道中的消息、(有某个用户在该频道中发的消息。所有在线用户就都能看到)
- 每个用户都能发送消息
- 历史消息功能,用户登陆之后,能够查看到之前自己错过的消息(从用户上次下线开始到这次上线这段时间累积的消息)
数据库设计
用户表(user):
- 用户id:userId ---->int 主键:primary key(不为空,不能重复),自增:auto_increment(数据库自己自增,不需要开发人员设置)
- 用户名:name ----->varchar(50) 不唯一:unique
- 密码:password ---->varchar(50)
- 昵称:nickName ----->vaichar(50)
- 上次退出时间:lastlogout ---->datetime
消息表(message):
- 消息id:messageId ------>int 主键:primary key(不为空,不能重复),自增:auto_increment
- 用户id:userId ------>int
- 频道id:channelid ------>int
- 消息正文:context -------->text
- 消息发送时间:sendTime----->datetime
频道表(channel):
- 频道id:channelId----->主键:primary key(不为空,不能重复),自增:auto_increment
- 频道名字:chanellName---->varchar(50)
项目结构
二、项目具体实现
1、前后端交互数据
前端
前端请求后端如何获取数据?
我们知道,前端请求数据的格式有很多,常见的请求体数据格式:
- text/html
- image/png
- text/css
- applocation/javascript
- application/json
我们采取 application/json;通过读取请求body内容:请求体的内容也就是一个字符串串,从前端接收的是json格式的数据;
后端
作为后端,我们应该如何解析这个请求体的数据呢?主要分为以下三步:
1)首先,需要通过字节流的方式读取body的内容,返回一个字符串
/*我们要拿到请求体的数据(body):
* body中的数据是一个字符串,对于这个字符串我们按照他的长度进行读取 ,单位是字节
* 所以通过字节流来读取
* */
public class Util {
public static String readBody(HttpServletRequest request)
{
//使用字节流读取
//读取body的长度,单位是字节(多少字节)
int contentLength=request.getContentLength();
//buffer来保存读到的body的内容
byte[] buffer=new byte[contentLength];
//使用 语法就不需要手动调用close方法来关闭流
try(InputStream inputStream=request.getInputStream())
{
inputStream.read(buffer,0,contentLength);
}catch (IOException e)
{
e.printStackTrace();
}
return new String(buffer);
}
}
2)然后借助json的工具将json字符串数据(也就是请求体的数据)转为Java的对象(自己封装的Request对象)
我们这里以注册模块接收数据为例:
定义Java类:
//请求的数据内容
static class Request{
public String name;
public String password;
public String nickName;
}
//响应的数据内容
//要把这个对象再转为json字符串,并写回给客户端
static class Response{
public int ok;//是否表示响应成功:1表示成功;0表示失败
public String reason;
}
创建一个gson对象:
我们借助第三方库GSON(Google的库)来完成(json的第三方库有很多,例如fastjson、jackson等)
Gson gson=new GsonBuilder().create();
3)设置服务器给前端的响应
//返回一个注册成功的响应结果
response.ok=1;
response.reason="注册成功";
//设置服务器给前端的响应:application/json:json格式
resp.setContentType("application/json;charset=utf-8");
String jsonString=gson.toJson(response);//将Java对象转化为json的字符串
resp.getWriter().write(jsonString);//通过响应对象写回
详细代码:
@WebServlet
public class RegisterServlet extends HttpServlet {
//创建一个gson对象
Gson gson=new GsonBuilder().create();
//这个类以内部类的形式组织,这个request类只针对HttpServlet类来使用
//其他servlet对于的request类结构可能不相同,所以使用内部类
//从body的json中转换过来
static class Request{
public String name;
public String password;
public String nickName;
}
//响应的数据内容
//要把这个对象再转为json字符串,并写回给客户端
static class Response{
public int ok;//是否表示响应成功:1表示成功;0表示失败
public String reason;
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Response response=new Response();
try {
//1.读取body中的信息(json格式的字符串)------>通过Util类里边封装的方法按字节读取请求体的数据,并以字符串形式返回
String bodyImfomation=Util.readBody(req);
//2.把json数据转成Java中的对象
// 创建一个Request类来表示这次请求的结构,把bodyImfomation----->Requestd对象
// 此处借助第三方库GSON(Google的库)来完成(json的第三方库有很多,例如fastjson、jackson等)
Request request=gson.fromJson(bodyImfomation,Request.class);
//3.在数据库中查一下看看用户名是否已经存在,如果存在就认为注册失败
UserDao userDao=