0. 前言

决定以Netty为核心,以WebSocket为应用层通信协议做一个互联网聊天系统,整体而言就像微信网页版一样,但考虑到这个聊天系统的功能非常多,因此只打算实现核心的聊天功能,包括单发、群发、文件发送,然后把项目与Spring整合做成开源、可拓展的方式,给大家参考、讨论、使用,欢迎大家的指点。

关于Netty

Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。

关于WebSocket通信协议

WebSocket是为了解决HTTP协议中通信只能由客户端发起这个弊端而出现的,WebSocket基于HTTP5协议,借用HTTP进行握手、升级,能够做到轻量的、高效的、双向的在客户端和服务端之间传输文本数据。

1、技术准备

  • IDE:MyEclipse 2016

  • JDK版本:1.8.0_121

  • 浏览器:谷歌浏览器、360浏览器(极速模式)(涉及网页前端设计,后端开发表示很苦闷)

  • 涉及技术:
    • Netty 4

    • WebSocket + HTTP

    • Spring MVC + Spring

    • JQuery

    • Bootstrap 3 + Bootstrap-fileinput

    • Maven 3.5

    • Tomcat 8.0

2. 整体说明

2.1 设计思想

整个通信系统以Tomcat作为核心服务器运行,其下另开一个线程运行Netty WebSocket服务器,Tomcat服务器主要处理客户登录、个人信息管理等的HTTP类型请求(通常的业务类型),端口为8080,Netty WebSockt服务器主要处理用户消息通信的WebSocket类型请求,端口为3333。用户通过浏览器登录后,浏览器会维持一个Session对象(有效时间30分钟)来保持登录状态,Tomcat服务器会返回用户的个人信息,同时记录在线用户,根据用户id建立一条WebSocket连接并保存在后端以便进行实时通信。当一个用户向另一用户发起通信,服务器会根据消息内容中的对话方用户id,找到保存的WebSocket连接,通过该连接发送消息,对方就能够收到即时收到消息。当用户注销或退出时,释放WebSocket连接,清空Session对象中的登录状态。(插播一条广告:需要开通正版IDEA的可以联系我,56元一年,正版授权激活,官网可查有效期,有需要的加我微信:poxiaozhiai6,备注:914。)

事实上Netty也可以用作一个HTTP服务器,而这里使用Spring MVC处理HTTP请求是出于熟悉的缘故,也比较接近传统开发的方式。

2.2 系统结构

系统采用B/S(Browser/Server),即浏览器/服务器的结构,主要事务逻辑在服务器端(Server)实现。借鉴MVC模式的思想,从上至下具体又分为视图层(View)、控制层(Controller)、业务层(Service)、模型层(Model)、数据访问层(Data Access)

2.3 项目结构

项目后端结构:

项目前端结构:

2.4 系统功能模块

系统只包括两个模块:登录模块和聊天管理模块。

  • 登录模块:既然作为一个系统,那么登录的角色认证是必不可少的,这里使用简单、传统的Session方式维持登录状态,当然也有对应的注销功能,但这里的注销除了清空Session对象,还要释放WebSocket连接,否则造成内存泄露。

  • 聊天管理模块:系统的核心模块,这部分主要使用Netty框架实现,功能包括信息、文件的单条和多条发送,也支持表情发送。

  • 其他模块:如好友管理模块、聊天记录管理、注册模块等,我并没有实现,有兴趣的话可以自行实现,与传统的开发方式类似。

由于本系统涉及多个用户状态,有必要进行说明,下面给出本系统的用户状态转换图。

2.5 系统界面

系统聊天界面如下:

3. 核心编码

这里只说明需要注意的地方,详细的请看源码

3.1 Netty服务器启动与关闭

当关闭Tomcat服务器时,也要释放Netty相关资源,否则会造成内存泄漏,关闭方法如下面的close(),如果只是使用shutdownGracefully()方法的话,关闭时会报内存泄露Memory Leak异常(但IDE可能来不及输出到控制台)

/*** 描述: Netty WebSocket服务器*      使用独立的线程启动* @author Kanarien* @version 1.0* @date 2018年5月18日 上午11:22:51*/
public class WebSocketServer implements Runnable{/*** 描述:启动Netty Websocket服务器*/public void build() {// 略,详细请看源码}/*** 描述:关闭Netty Websocket服务器,主要是释放连接*     连接包括:服务器连接serverChannel,*     客户端TCP处理连接bossGroup,*     客户端I/O操作连接workerGroup**     若只使用*         bossGroupFuture = bossGroup.shutdownGracefully();*         workerGroupFuture = workerGroup.shutdownGracefully();*     会造成内存泄漏。*/public void close(){serverChannelFuture.channel().close();Future<?> bossGroupFuture = bossGroup.shutdownGracefully();Future<?> workerGroupFuture = workerGroup.shutdownGracefully();try {bossGroupFuture.await();workerGroupFuture.await();} catch (InterruptedException ignore) {ignore.printStackTrace();}}}

4. 效果及操作演示

4.1 登录操作

登录入口为:http://localhost:8080/WebSocket/login 或 http://localhost:8080/WebSocket/ 当前系统用户固定为9个,群组1个,包括9人用户。

  • 用户1 用户名:Member001 密码:001

  • 用户2 用户名:Member002 密码:002

  • ······

  • 用户9 用户名:Member009 密码:009

4.2 聊天演示

5. 源码下载

下载链接: https://download.csdn.net/download/qq_41701956/86843609

Java互联网实时聊天系统(附源码)相关推荐

  1. 视频教程-手把手实现Java图书管理系统(附源码)-Java

    手把手实现Java图书管理系统(附源码) 南京大学软件工程硕士,曾就职于擎天科技.中软国际.华为等上市公司,擅长Java开发.Web前端.Python爬虫.大数据等领域技术. 全栈工程师,从事软件开发 ...

  2. 手把手搭建Java在线商城系统【附源码】(毕设)

    一.项目简介 本课程演示的是一套基于Java的SSM框架实现的在线商城系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的java人群. 详细介绍了在线商城系统的实现,包括: 1.项目介 ...

  3. 一款仿网易云音乐Java开源系统(附源码)

    嗨喽!Java后端编程的各位小伙伴们,由于公众号做了乱序推送改版,为了保证公众号的推文能够第一时间及时送达到大家手上,大家记得将公众号 加星标置顶 ,公众号每天会送上Java技术干货推文 ! 上篇推文 ...

  4. 【Java十大热门游戏合集】Java经典游戏项目(附源码课件

    家人们,我又来啦,今天我们来看一下学Java必练的10款游戏项目! 大家都知道学习编程必须要做的就是敲代码和做项目练手了,那项目有难有易,很多小伙伴不知道从哪里找项目来练习,今日我们来看一下初级项目中 ...

  5. JAVA飞机大战游戏附源码

    JAVA飞机大战附源码 java飞机大战 效果图如下 java飞机大战 话不多说 直接上源码 窗体部分 package UI; //自定义窗体 //创建类 继承JFrame //创建构造方法,设置窗体 ...

  6. Java实践课程设计附源码和sql脚本(物流管理系统)

    声明:本课程设计比较简陋,系统功能模块也相较简单,仅供参考学习哦. 需要源码的可联系本博主QQ:194242960: 需要其他课程设计项目可以关注VX公众号:"学长源码" 课程选题 ...

  7. 一个简单的Java计时器项目,附源码

    学Java开发的小伙伴都会想着做一些项目来检验自己的学习成果,今天小千就来分享一个简单的Java计时器项目,源码也放在文中,大家可以参考一下. Java计时器项目 开发环境:win8+eclipse+ ...

  8. 抖音直播流实时下载附源码

    介绍: 源码介绍: 使用RTMP协议实时传输,可以在线观看,简单加工下 可以实现在电脑上看抖音直播的效果,另外附带保存效果, libeay32.dll和ssleay32.dll是协议必须要的dll! ...

  9. Java实现捕鱼达人附源码

    1,游戏原理 swing+多线程+事件监听 swing实现的界面的绘制; 多线程实现产生多种鱼,实现鱼的游动,以及网的移动; 事件监听实现鼠标捕鱼事件的捕获; ==================== ...

最新文章

  1. 2022年度BCI奖 |THE ANNUAL BCI AWARD
  2. 基于【CentOS-7+ Ambari 2.7.0 + HDP 3.0】HAWQ数据仓库 使用之 gpfdist协议
  3. 华为服务器显示红色的心跳,服务器心跳检查
  4. javascript字符串方法总结
  5. 使用C#把Tensorflow训练的.pb文件用在生产环境
  6. c语言程序停止正常工作,C语言 由于出现问题,程序停止正常工作。如果帮我解决这个问题即可获得悬赏...
  7. LeetCode 125. Valid Palindrome
  8. this指向 - 总结
  9. 数据库异常---ORA-01436: 用户数据中的 CONNECT BY loop in user data 循环
  10. 普华基础软件笔试_【2019更新版】中国人民大学计算机软件考研信息汇总
  11. NetCore控制台实现自定义CommandLine功能
  12. shell基础--1
  13. android studio for android learning (九) android之Adapter用法
  14. idea调代码时返回到上一步的快捷键
  15. 考研英语近义词与反义词·十三
  16. 【防诈骗】QQ账号安全检测工具-腾讯出品
  17. Codeforces Round #714 (Div. 2) B. AND Sequences (思维)
  18. 轻量级简约的自动采集小说程序源码
  19. 企业提高客户保持率基本方法
  20. StreamX(1):StreamX概述

热门文章

  1. PS中光芒四射游戏效果
  2. js函数中的with用法
  3. 重磅消息Apache Flink 1.9.0隆重发布
  4. C# !(null包容)运算符的使用
  5. hammer实现拖拽旋转缩放功能
  6. Unity颜色带有一种荧光光晕效果
  7. JS 省市区三级联动
  8. css3中绚丽的图片翻转特效
  9. 约德尔测试--Bash
  10. openjudge3344 冷血格斗场 解题报告