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

WebSocket多人聊天室

项目背景现在的年轻人,大多都有“社交恐惧症”,但其实随着通信技术的日益发展,网络聊天在当今已不算新鲜事物,聊天可以方便大家交

项目背景

  现在的年轻人,大多都有“社交恐惧症”,但其实随着通信技术的日益发展,网络聊天在当今已不算新鲜事物,聊天可以方便大家交流,帮助大家克服“社恐”。以此为契机,我仿照QQ开发了一款 WebSocket多人聊天室 ,以供同一局域网下多名小伙伴相互聊天,增进彼此感情,共同战胜“社恐”。


实现功能

本聊天室具有以下功能:
  1) 简单的注册登录功能
  2) 用户发送消息,所有在线用户都能收到消息
  3) 不在线用户在上线后能收到历史消息(第一次注册用户不会收到历史消息)
  4) 右侧动态的显示 在线用户/总人数
  5) 支持 ctrl+enter 快捷键发送消息


所用技术


WebSocket , HTTP, COOKIE + Session, TCP, Servlet, 前端内容(HTML、CSS、Javascript)



项目流程

首先登录主界面,会提示需要先登录,点确定跳转到登录界面进行登陆
在这里插入图片描述

如没有账号,则需先注册账号
在这里插入图片描述
注册完成后会显示 注册成功并登录
在这里插入图片描述

如有账号,进行登录,完成后会显示登陆成功
在这里插入图片描述

在这里插入图片描述

这时进入主界面,会发现在左侧用户列表显示用户在线
在这里插入图片描述

这时就可以发送消息,在线的用户会收到消息
在这里插入图片描述

离线的用户上线后会受到历史消息推送


项目结构

  一直以来,HTTP协议都是无状态、单向通信的,即客户端请求一次,服务器回复一次。如果想让服务器消息及时下发到客户端,需要采用类似于轮询的机制,即客户端定时频繁的向服务器发出请求,这样效率很低,并且浪费服务器资源
  为提高效率,HTML5推出了WebSocket技术,它使客户端和服务器之间能通过HTTP协议建立TCP连接,之后便可以随时随地进行双向通信
  初次连接以HTTP协议作为承载,客户端主动向服务器发送一个服务器可以处理的请求方法,建立WebSocket连接,一旦建立连接,之后会产生成一个全双工的信道,实现客户端和服务器的双向通信
在这里插入图片描述

  服务端的 WebSocket 提供的连接点被称为 Endpoint,通过onopen、onmessage、onclose、onerror四个事件的实现来处理Socket的响应

在这里插入图片描述

                      整体结构图

Endpoint 负责 WebSocket的接入工作

OnlineUser负责用户,里面存着 用户 和其对应的 Session

MessageEndpoint与OnlineUser绑定,每建立一次WebSocket连接就会实例化一次,生成该User独有的一份信息

service 负责业务工作(用户的上线下线、注册登录)

dao 负责数据库处理

usercenter 负责在线用户管理(维护在线用户)

MessageEncoder 负责消息的编解码工作


库表设计

用户表


uid 、username(notnull)、nickname、password、logoutAt


消息表


mid、uid、content、publishedAt



遇到的问题&解决方案


  • 进行消息转发时User没有其对应的Session,无法转发 ——》 创建OnlineUser对象,将User和其对应Session存入OnlineUser中
  • 初版中Endpoint任务过多,功能淤积 ——》 进行代码重构,后端进行职责划分
  • service、dao、usercenter与用户绑定,每个用户都实例化,对象重复过多,造成代码冗余 ——》将其设置为单例对象,首次实例化后不用重复实例化

优势和不足

优势:


  • 利用轮询实现在线用户的动态维护
  • 采用WebSocket技术建立连接,提高效率,减少资源浪费
  • 实现快捷键发送消息

不足:


  • TODO&大致的解决方法

测试情况


推荐阅读
  • HTML5 Web存储技术是许多开发者青睐本地应用程序的重要原因之一,因为它能够实现在客户端本地存储数据。HTML5通过引入Web Storage API,使得Web应用程序能够在浏览器中高效地存储数据,从而提升了应用的性能和用户体验。相较于传统的Cookie机制,Web Storage不仅提供了更大的存储容量,还简化了数据管理和访问的方式。本文将从基础概念、关键技术到实际应用,全面解析HTML5 Web存储技术,帮助读者深入了解其工作原理和应用场景。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 本指南详细介绍了如何在CentOS 6.6 64位系统上以root用户身份部署Tomcat 8服务器。系统环境为CentOS 6.6 64位,采用源码安装方式。所需软件为apache-tomcat-8.0.23.tar.gz,建议将软件下载至/root/opt目录。具体下载地址请参见官方资源。本指南涵盖了从环境准备到服务启动的完整步骤,适用于需要在该系统环境下搭建高性能Web应用服务器的技术人员。 ... [详细]
  • 本文深入探讨了ASP.NET中ViewState、Cookie和Session三种状态管理技术的区别与应用场景。ViewState主要用于保存页面控件的状态信息,确保在多次往返服务器过程中数据的一致性;Cookie则存储在客户端,适用于保存少量用户偏好设置等非敏感信息;而Session则在服务器端存储数据,适合处理需要跨页面保持的数据。文章详细分析了这三种技术的工作原理及其优缺点,并提供了实际应用中的最佳实践建议。 ... [详细]
  • HTTP协议作为互联网通信的基础,其重要性不言而喻。相比JDK自带的URLConnection,HttpClient不仅提升了易用性和灵活性,还在性能、稳定性和安全性方面进行了显著优化。本文将深入解析HttpClient的使用方法与技巧,帮助开发者更好地掌握这一强大的工具。 ... [详细]
  • SQLmap自动化注入工具命令详解(第28-29天 实战演练)
    SQL注入工具如SQLMap等在网络安全测试中广泛应用。SQLMap是一款开源的自动化SQL注入工具,支持12种不同的数据库,具体支持的数据库类型可在其插件目录中查看。作为当前最强大的注入工具之一,SQLMap在实际应用中具有极高的效率和准确性。 ... [详细]
  • 在 Android 开发中,`android:exported` 属性用于控制组件(如 Activity、Service、BroadcastReceiver 和 ContentProvider)是否可以被其他应用组件访问或与其交互。若将此属性设为 `true`,则允许外部应用调用或与之交互;反之,若设为 `false`,则仅限于同一应用内的组件进行访问。这一属性对于确保应用的安全性和隐私保护至关重要。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 该大学网站采用PHP和MySQL技术,在校内可免费访问某些外部收费资料数据库。为了方便学生校外访问,建议通过学校账号登录实现免费访问。具体方案可包括利用学校服务器作为代理,结合身份验证机制,确保合法用户在校外也能享受免费资源。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 在 Axublog 1.1.0 版本的 `c_login.php` 文件中发现了一个严重的 SQL 注入漏洞。该漏洞允许攻击者通过操纵登录请求中的参数,注入恶意 SQL 代码,从而可能获取敏感信息或对数据库进行未授权操作。建议用户尽快更新到最新版本并采取相应的安全措施以防止潜在的风险。 ... [详细]
  • POJ 2482 星空中的星星:利用线段树与扫描线算法解决
    在《POJ 2482 星空中的星星》问题中,通过运用线段树和扫描线算法,可以高效地解决星星在窗口内的计数问题。该方法不仅能够快速处理大规模数据,还能确保时间复杂度的最优性,适用于各种复杂的星空模拟场景。 ... [详细]
  • 为了评估精心优化的模型与策略在实际环境中的表现,Google对其实验框架进行了全面升级,旨在实现更高效、更精准和更快速的在线测试。新的框架支持更多的实验场景,提供更好的数据洞察,并显著缩短了实验周期,从而加速产品迭代和优化过程。 ... [详细]
  • 在PHP的设计中,预定义了9个超级全局变量、8个魔术变量和13个魔术函数,这些变量和函数无需声明即可在脚本的任意位置使用。这些特性在PHP开发中极为常见,能够显著提升开发效率和代码的灵活性。相比之下,Java并没有类似的内置机制,但通过其他方式如上下文对象和反射机制,也可以实现类似的功能。本文将详细探讨这两种语言中这些特殊变量和函数的使用方法及其应用场景。 ... [详细]
author-avatar
手机用户2602913291
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有