热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

“畅聊”

“畅聊”1:名字解释首先畅聊就是相当于现在的群发功能,然后可以在相关频道中接收发消息,也可以查看历史消息2:需求分析1:打开主页,进行登录功能2:登陆成功之后,进入主页面

“畅聊”

1:名字解释
首先畅聊就是相当于现在的群发功能,然后可以在相关频道中接收发消息,也可以查看历史消息
2:需求分析


1:打开主页,进行登录功能
2:登陆成功之后,进入主页面
3:主页面显示的是当前具有的频道列表(当前用户所关注的频道)
4:点击某个频道之后,就能看见频道里面的消息内容(某个用户在该频道中发消息,所有在线的用户都能看到)
5:每个用户都能发送消息
6:还有就是历史消息功能,用户登录上线之后,能够看见从上次下线之后发送的所有历史消息记录,也就是这段之间内错过的消息


3:核心技术:websocket
websocket是一个应用层的协议,刚开始学的服务器都是典型的 “一问一答” 模型,也就是说客户端给服务器发送一个请求,服务器处理请求并将响应结果写回给浏览器,使用的都是http协议;重要的是 在聊天的场景中,客户端是没有发送求的,但是服务器却主动的给你发送了数据,这样就叫做 “消息推送”

服务器端


1:在创建类时,使用@ServerEndpoint注释来指定该类所对应的URL路径
2:实现类的一些方法
2.1:onOpen:连接建立调用
2.2:onMessage:收到消息时调用
2.3:onError:连接异常时调用
2.4:onClose:连接关闭时调用
注意: 以上的方法都是不用程序员自己调用,在合适的时机由Tomcat自己进行调用
session.getBasicRemote().sendText(): 这个方法是需要程序员自己调用的,服务器给客户端发送消息的接口:这个方法只要连接建立好,调用这个方法就能写回数据给客户端,无须客户端先发送请求


客户端


1:创建websocket对象,同时指定连接服务器的url
2:给websocket对象注册一些方法
2.1:onOpen:连接建立成功是调用
2.2:onMessage:收到消息时调用
2.3:onError:连接异常时调用
2.4:onClose:连接关闭时调用
websocket.send():给服务器发送消息


4:数据库的设计:设计好表的结构并创建好实体类
User: 用户信息,本来是用户(User)和频道(Channel)之间的是多对多的关系,在这里我设计成一个用户都关联到了所有的频道,所以是没关系
在这里插入图片描述

Channel: 频道
在这里插入图片描述

Message: 消息,用来实现历史消息功能
在这里插入图片描述

5:实现数据库相关代码:
5.1:创建一个DBUtil类管理获取数据库连接


1:DBUtil工具类实际上是实现了DataSource类的单例版本
2:对于一个简单的应用程序来说,DataSource只需要有一个就好了(正好就可以使用单例模式-—懒汉模式)就可以了


5.2:封装数据库操作—用户DAO


1:新增用户(注册功能)
2:按用户名查找信息(登录功能)
3:按用户ID查找用户信息(把userId转换成昵称的时候使用)
4:更新用户的lastLogout时间,用户下线时更新,为了实现历史记录功能


5.3:封装数据库操作—频道DAO


1:新增频道
2:删除频道
3:查看频道列表
我实现的比较简单,所以就没有实现用户关注频道的功能


5.4:封装数据库操作—消息DAO
主要目的:就是将上次下线到这次上线的消息都查出来


1:新增消息
2:按时间段(mysql中datetime类型是可以直接比较大小的)进行查询消息(把用户上次下线时间点到下次上线的时间点,这两个时间间隔的消息都查出来)


5.5:封装数据库操作—消息中心
主要目的:管理消息记录和用户列表,实现消息转发


1:主要的两个数据结构:
阻塞队列:用来保存消息的队列
哈希表:(ConcurrentHashMap)用来保存在线用户列表
2:实现几个操作这两个数据结构的方法
新增在线的用户
用户下线,要将该用户从在线用户列表中删除
新增消息:就把消息放进阻塞队列中
3:在消息中心构造方法中创建一个线程一直用来扫描消息队列(为了在构造消息中心实例的时候就启动线程),把队列里面存的消息全部转发给所有在线用户


6:设计前后端交互接口(API设计)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:


1:确定好客户端给服务器发送的那些种类的请求
2:服务器收到请求之后应该返回啥样的响应
3:客户端发的大多数请求,都是服务器不能处理的,只有咱们约定好的格式请求,才能正确处理,在这里我们约定的是json格式(它是一种比较常见的数据组织方式) 提前写好将客户端的输入数据转成String类型的
4:同路径下,服务器怎么区分不同的功能,是通过http请求方法来区分的,这种设计叫做restful风格的API,是当下比较流行一种API设计风格
5:以上的都是HTTP接口,使用servlet进行实现就可以了


7:简历websocket连接(传输消息准备),每个登录用户中,都需要有自己的连接,把连接之间使用userId进行区分
7:然后就是代码的实现
在这就不一一展示了


推荐阅读
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
author-avatar
dsalkj08_789
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有