title: chatroom_websocket
date: 2019-07-27 10:51:22
tags: [project,java]


项目讲解,基于websocket实现的聊天室

业务

开发从dao层开始写

dao:数据库CURD
  1. 获取数据源
  2. 获取连接
  3. sql语句
  4. 关闭
  • 各个数据操作只是sql语句不同,1,2,4为公共操作封装在父类BaseDao中
  • 数据库操作在子类AccountDao中实现
service:处理业务

调用dao层

  • 登录验证
  • 注册验证
controller:
  • 调用service获取数据返回给客户端
  • 从客户端获得数据调用业务处理

JDBC(Java程序连接数据库标准)

JDBC:Java操作数据库的接口(OS)

所有数据库厂商必须实现此接口
Java DataBase Connector

JDBC操作格式
  • 数据源

    类似线程池,创建好已连接的数据库直接拿来使用

    • c3p0
    • druid(阿里数据源)
    • Hakari
    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/chatroom_websocket?charset=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
    username=root
    password=root
    filters=stat
    initialSize=5//初始化数量
    maxActive=30//最大数量
    maxWait=60000//创建后等待时间
    timeBetweenEvictionRunsMillis=60000
    minEvictableIdleTimeMillis=300000
    validationQuery=SELECT 1
    testWhileIdle=true
    testOnBorrow=false
    testOnReturn=false
    poolPreparedStatements=false
    
  • 线程池优点

    • **提高响应速度 :**因为当线程池中的线程没有超过线程池的最大上限时,有的线程处于等待分配任务状态,当任务到来时,无需创建线程就能被执行。
    • **提高资源利用率:**线程池可以重复利用已经创建了的线程
    • **方便线程管理:**线程池会根据当前系统特点对池内的线程进行优化处理,减少创建和销毁线程带来的系统开销
  • 1.加载驱动或加载数据源
    Class.forName(“com.mysql.jdbc.Driver”);

  • 2.获取连接 Connection

    • **url:**jdbc:mysql://localhost:3306/db_name
    • username
    • password
  • 3.使用连接执行SQL CURD

    • 执行sql Statement
    • 获取查询返回值 ResultSet
    select : statement.executeQuery(sql) : ResultSet
    insert,delete,update
    statement.executeUpdate(sql) : int
    
  • 4.关闭资源

    • Connection
    • Statement
    • ResultSet
配置文件方式
  • 将数据库的配置信息存放到配置文件(*.properties)
  • 将信息从配置文件读到程序中
Junit单元测试 : 白盒测试
  • 创建测试类

    1. 创建测试文件夹,test与main同目录,将test文件夹标记为测试文件夹
    2. 要测试的类选中,ctrl+shift+T 创建测试类
    3. 使用断言Assert
SQL注入漏洞

Statement语句通过字符串拼接,黑客只需改变参数的值即可改变sql语句的正确性

  • userName为正确值password拼接为 or 1 = 1成为一个永真式就可以获得这个用户的连接

    connection = getConnection();
    String sql = "select * from user where username = ' " + username + " ' and" + "password = '" + password "'";
    statement = connection.createStatement();
    resultSet = statement.executeQuery(sql);
    
  • 通过PreparedStatement用通配符替换字符串拼接可以检查语法错误

    connection = getConnection();
    String sql = "select * from user where username = ? and" + "password = ?";
    statement = connection.prepareStatement(sql);
    statement.setString(1, userName);
    statement.setString(2, DigestUtils.md5Hex(password));
    resultSet = statement.executeQuery();
    

WebSocket

单边通信 - http协议
  • 浏览器
  • 服务端
全双工通信(应用层协议) - tcp/ip
  • websocket -(c/s)
  • 多线程聊天

服务端可以主动向浏览器发送信息

协议
  • **http协议:**http://域名:端口号

  • websocket://域名:端口号

    浏览器版本的socket

模板引擎 - FreeMarker

获取后端传的参数,也可以用jsp,html,但是这个比较方便,要想用模板引擎后端必须要加载模板引擎

  • 配置tomcat加载ftl页面路径
  • 配置监听器,项目启动的时候监听器就执行了,所以可以将全局配置放在里面,各个Servlet都能用了
package com.epochong.chatroom.config;import freemarker.template.Configuration;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;/*** @author epochong* @date 2019/8/6 10:03* @email epochong@163.com* @blog epochong.github.io* @describe 预加载配置,相当于类的static静态块* WebListener:这个类具备监听器的能力*/
@WebListener
public class FreeMarkerListener implements ServletContextListener {/*** 读取配置的时候通过k,v的方式* k:_template_* v:cfg (freemarker.template.Configuration)*/public static final String TEMPLATE_KEY = "_template_";/*** 当项目启动的时候tomcat会自动调用* @param sce*/@Overridepublic void contextInitialized(ServletContextEvent sce) {//配置版本Configuration cfg = new Configuration(Configuration.VERSION_2_3_0);//配置加载ftl路径try {cfg.setDirectoryForTemplateLoading(new File("F:\\Program\\Java\\Maven\\chatroom_websocket\\src\\main\\webapp"));} catch (IOException e) {e.printStackTrace();}// 配置页面编码cfg.setDefaultEncoding(StandardCharsets.UTF_8.displayName());//将配置写入上下文中,设置k,vsce.getServletContext().setAttribute(TEMPLATE_KEY,cfg);}/*** 项目快要终止的时候调用* 可以放一些全局的资源释放* @param sce*/@Overridepublic void contextDestroyed(ServletContextEvent sce) {}
}

项目:chatroom_websocket、网页聊天室相关推荐

  1. 项目总结 -网页聊天室

    项目名称:网页聊天室 项目地址:http://101.37.14.113:8888/ 一.项目简介 本项目是基于WebSocket和Socket实现的网页聊天室.使用到的技术包括:MVC编程思想.We ...

  2. 基于SSM的Web网页聊天室系统设计与实现 毕业论文+项目源码及数据库文件、

    下载地址:https://download.csdn.net/download/ouyangxiaobai123/22679732 项目介绍: 基于SSM的Web网页聊天室系统设计与实现 毕业论文+项 ...

  3. WebSocket 网页聊天室的实现(服务器端:.net + windows服务,前端:Html5)

    websocket是HTML5中的比较有特色一块,它使得以往在客户端软件中常用的socket在web程序中也能轻松的使用,较大的提高了效率.废话不多说,直接进入题. 网页聊天室包括2个部分,后端服务器 ...

  4. Java和WebSocket开发网页聊天室

    一.项目简介 WebSocket是HTML5一种新的协议,它实现了浏览器与服务器全双工通信,这里就将使用WebSocket来开发网页聊天室,前端框架会使用AmazeUI,后台使用Java,编辑器使用U ...

  5. 基于flask的网页聊天室(一)

    基于flask的网页聊天室(一) 基于flask的网页聊天室(一) 基本目标 基于flask实现的web聊天室,具有基本的登录注册,多人发送消息,接受消息 扩展目标 除基本目标外添加当前在线人数,消息 ...

  6. 使用WebSocket实现网页聊天室

    使用WebSocket实现网页聊天室 一.文章导读 服务器推送你还在使用轮询吗?本文将带你领略WebSocket的魅力,轻松实现服务器推送功能.本文将以下面两方面让你理解WebSocket并应用到具体 ...

  7. 基于WebSocket实现网页聊天室

    背景 在浏览器中通过http仅能实现单向的通信,comet可以一定程度上模拟双向通信,但效率较低,并需要服务器有较好的支持; flash中的socket和xmlsocket可以实现真正的双向通信,通过 ...

  8. Nodejs+socket.io 搭建个人的网页聊天室

    Nodejs+socket.io 搭建个人的网页聊天室 最近看到别人搭建了自己的实时聊天室便产生了兴趣,于是乎自己也着手搭建了一个.在socket这里我选用了socket.io这个模块,在网上看了很多 ...

  9. Spring Boot WebChat 网页聊天室

    使用Spring Boot +Spring Security+Spring Data Jpa+Thymeleaf+Spring websocket 搭建的简易网页聊天室. 项目源码参考:http:// ...

  10. 如何使用WebSocket实现网页聊天室?

    一.文章导读 服务器推送你还在使用轮询吗?本文将带你领略WebSocket的魅力,轻松实现服务器推送功能.本文将以下面两方面让你理解WebSocket并应用到具体的开发中 WebSocket概述 使用 ...

最新文章

  1. php中const和static的区别和联系
  2. 软件工程第一周开课博客
  3. OAM K8s 标准实现 Crossplane 项目进入 CNCF Sandbox
  4. 高斯拟合 vc++代码_NMA2020W1 极大似然法模型拟合与bootstrap
  5. 【数据结构与算法】单链表的Java实现
  6. Javascript 判断 object 的特定类
  7. BZOJ.1029.[JSOI2007]建筑抢修(贪心)
  8. 帆软报表重要Activator之DesignerInitActivator之一
  9. assoc fetch mysql 用法_mysql_fetch_assoc、mysql_fetch_object、mysql_fetch_row、mysql_fetch_array用法学习...
  10. ef codefirst字段类型与sqlserver表字段类型对应概要
  11. LaTeX 中常用的导数符号命令
  12. 湖北省2021年高考成绩查询日期,湖北2021年高考查分及志愿填报时间公布!
  13. HTML前端连接go语言后段,一次完整的浏览器请求响应过程-Go语言中文社区
  14. Raster Map光栅图 VS Vector Map矢量图
  15. 计算机专业毕业论文选哪方面,计算机专业毕业论文格式有哪些要求
  16. 太极自定义diy名片模板_没有合适的手帐本?拿走这些电子模板,自制属于自己的手帐本...
  17. 常用的mysql存储引擎及其特点
  18. HBase(一):概述
  19. 360 VS QQ:一场精心策划的西安事变(下)
  20. 驱动级的特征码修改——终级免杀之PcShare

热门文章

  1. Android获取网络图片的宽高
  2. UINO优锘科技助力银行业开启智慧运维,踏入智慧金融时代
  3. 优锘科技:数字孪生为何大爆发?
  4. 查看Linux系统版本的命令总结
  5. 记录一下需要优化的东西
  6. 2022-2027年中国半导体整流设备市场竞争态势及行业投资前景预测报告
  7. H3C 路由器智能选路NQA策略
  8. java modify的使用方法图解,经过JDT修改(Modify)Java代码的流程步骤
  9. GPS卫星同步时钟(GPS授时服务器)在校园网络里的应用
  10. EZ-USB CY7C68013A固件Slave FIFO初始化