# 基于Netty和WebSocket的Web聊天室
# 一、背景
伴随着Internet的发展与宽带技术的普及,人们可以通过Internet交换动态数据,展示新产品,与人进行沟通并进行电子商务贸易。作为构成网站的重要组成部分,留言管理系统为人们的交流提供了一个崭新的平台。同时,聊天室作为一个新型的Web应用程序,为互联网用户提供了一个实时信息交流的场所。
聊天室在早期的网络时代已经非常流行,例如BBS、IRC这些类似的机制。它为互联网用户提供了实时对话的功能,并因此成为了非常流行的网络服务。网络会议和网上聊天均可以通过聊天室来实现。聊天室为互联网用户提供了一个更好的交友环境,这种交友形式类似于互联网化的笔友,但是大大节省了信件传送时间。对于网站留言管理而言,目前非常受欢迎的做法是基于JAVA WEB和脚本语言,并结合动态网页和数据库,然后通过应用程序来处理信息。
网络聊天系统利用了现代的网络资源和技术,为人们的交流和联系提供了一个平台,用以加快信息化建设,促进人和人之间的交流和沟通。Internet存在于全球范围,它将世界各地大小的网络连接成了一个整体,万维网目前已经成为了世界上最大的信息资源宝库,它是一种更容易被人们接受的信息检索方式。根据估算,目前在Internet上存在数以万计的网站,内容包括文化、金融、教育科研、新闻出版、商业、娱乐等。它的用户群是非常庞大的,所以建立一个好的网站非常重要。
以前旧的联系方法已经不能满足现代人的生活。网上聊天系统因其方便的沟通方式而成为了重要且实用的计算机应用程序。系统管理者通过提供完整的网上聊天系统管理,来促进人们之间相互沟通与交流。
实时显示聊天者的谈话内容是聊天室最重要的特点之一。所谓的实时性与常的留言板和讨论区有很大的不同,它是指同一个聊天室内的用户可以在很短的时间内立即看到其他用户的留言。随着计算机技术的快速发展,现在可以使用Java Web+HTML方便快速地开发出一个典型的聊天室程序。但是还需要花费更多的心思,获得更强大的聊天功能来吸引更多的网络用户。
# 二、目的与要求
本程序实现一个基于Web的多人聊天室程序,访客可以自由加入聊天室,并设定自己的昵称。
开发要点:采用浏览器端和服务器端(B/S)的开发技术。利用浏览器解析HTML语言达到即时聊天作用,无需考虑操作系统环境等外部因素。服务器开发使用JAVA面向对象的开发方法进行开发与设计,通过采用高性能的Netty框架+WebSocket协议搭建即时聊天服务器,可以支持起高并发稳定交互。
# 三、开发环境
- 软件:
- 操作系统:Windows 10
- Java开发IDE:Intellij IDEA 2016.2.4
- HTML/JS/CSS开发IDE:Sublime Text 3
- 测试浏览器:Google Chrome 版本 58.0.3029.110 (64-bit)
- 测试服务器:Tomcat 8.0.22
- 硬件:
- 处理器:Intel® Core(TM) i5-5200U CPU @ 2.20GHz 2.19GHz
- 控制器:Intel® 9 Series Chipset Family SATA AHCI Controller
- 内存(RAM):8.00 G
# 四、框架介绍
## 4.1 Netty 5.X 框架
Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果。作为当前最流行的NIO框架,Netty在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,一些业界著名的开源组件也基于Netty的NIO框架构建。
Netty,为了尽可能提升性能,Netty采用了串行无锁化设计,在I/O线程内部进行串行操作,避免多线程竞争导致的性能下降。表面上看,串行化设计似乎CPU利用率不高,并发程度不够。但是,通过调整NIO线程池的线程参数,可以同时启动多个串行化的线程并行运行,这种局部无锁化的串行线程设计相比一个队列-多个工作线程模型性能更优。——摘取自《Netty高性能之道》
![](http://www.writebug.com/myres/static/uploads/2021/10/19/45eed43dcf00340bf51f18d56a46b71f.writebug)
## 4.2 WebSocket 协议
Websocket是html5提出的一个协议规范,是为解决客户端与服务端实时通信而产生的技术。websocket协议本质上是一个基于tcp的协议,是先通过HTTP/HTTPS协议发起一条特殊的http请求进行握手后创建一个用于交换数据的TCP连接,此后服务端与客户端通过此TCP连接进行实时通信。
WebSocket API最伟大之处在于服务器和客户端可以在给定的时间范围内的任意时刻,相互推送信息。 浏览器和服务器只需要要做一个握手的动作,在建立连接之后,服务器可以主动传送数据给客户端,客户端也可随时向服务器发送数据。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/80910987b7c0d65a8d7f4c8efb4c2ec9.writebug)
## 4.3 Bootstrap 框架
Bootstrap,来自 Twitter,是目前最受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加快捷。
Bootstrap框架的优点:
- 移动设备优先:自 Bootstrap 3 起,框架包含了贯穿于整个库的移动设备优先的样式
- 浏览器支持:所有的主流浏览器都支持 Bootstrap
- 容易上手:只要您具备 HTML 和 CSS 的基础知识,您就可以开始学习 Bootstrap
- 响应式设计:Bootstrap 的响应式 CSS 能够自适应于台式机、平板电脑和手机
- 其他优点:为开发人员创建接口提供了一个简洁统一的解决方案;包含了功能强大的内置组件,易于定制;还提供了基于 Web 的定制,并且是开源
# 五、功能流程图
![](http://www.writebug.com/myres/static/uploads/2021/10/19/c2e0f3ebcd76a8643dece3707dda46b7.writebug)
# 六、功能分析
## 6.1 支持昵称登录
用户通过浏览器访问服务器时,需要确定自己的昵称,便于交流。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/5a71af6ae0503a532996f152a918a253.writebug)
其次调用JS脚本代码来检查用户输入是否为空,代码如下:
```java
function userLogin() {
if (!userNick) {
userNick = $('#nick').val().trim();
}
if (userNick) {
//其他逻辑事务处理
…………………………
}
else
{
$('#tipMsg').text("连接没有成功,请重新登录");
$('#tipModal').modal('show');
}
```
若游客昵称验证成功,则进行是否支持WebSocket判断:
```java
if (window.WebSocket) {
window.socket = new WebSocket("ws://localhost:9090/websocket");
window.socket.onmessage = function (event) {
};
window.socket.onclose = function (event) {
console.log("connection close!!!");
closeInvake(event);
};
window.socket.onopen = function (event) {
console.log("connection success!!");
openInvake(event);
};
} else {
alert("您的浏览器不支持WebSocket!!!");
}
```
## 6.2 支持多人同时在线
聊天室支持多人登录而不轻易崩溃。由于Netty框架封装的高性能NIO特性,可以明显看到多用户同时在线时交流时的流畅性。相比较于SpringMVC、Jetty等框架,Netty在多线程交互这方面上有很大的优化。
利用测试软件Selenium模拟100位用户同时登录聊天,由于篇幅原因只展示前22位用户的列表。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/b8d1e7b9b9bbf34b1748ba1eb028c377.writebug)
## 6.3 同步显示在线人数和成员列表
聊天室支持多人�