在线聊天室(B/S、servlet、websocket、JDBC)

一、项目简介

该聊天室项目使用的是B/S架构,实现一个在线聊天室, 实现注册、登录、在线用户群聊、不同频道等功能。

后端技术

后端使用Java语言,主要的技术有servlet、websocket、JDBC、json等;

  • servlet:配置资源映射
  • websocket:websocket是一个应用层的协议,使用websocket来实现“消息推送”
  • JDBC:实现数据库连接管理
  • json:解析和封装数据,使用Gson库

使用的开发工具是idea,项目构建/部署工具:maven,项目服务器:tomcat

项目需求

项目需求分析:

  1. 打开主页,看到登陆页面
  2. 登陆成功后,进入主页面.
  3. 主页面显示当前具有的频道列表(当前用户关注了哪些频道)
  4. 点击某个频道到之后,可以看到该频道中的消息、(有某个用户在该频道中发的消息。所有在线用户就都能看到)
  5. 每个用户都能发送消息
  6. 历史消息功能,用户登陆之后,能够查看到之前自己错过的消息(从用户上次下线开始到这次上线这段时间累积的消息)

数据库设计

用户表(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=
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值