- 使用开源websocket和mongoose框架编写网页版本的群聊即时通信工具
- 使用HTTP+mongoose+session+MySQL+jsoncpp的技术构成,完成IM工具
- C++11 STL
- HTTP协议
- websocket协议
- session和cookie理解
- MySQL c connect
- 登录注册,session管理
- mongoose框架框架理解
- jsoncpp
了解websocket
WebSocket是一种协议,与HTTP协议一样位于应用层,都是TCP/IP协议的子集。HTTP协议是单向通信协议,只有客户端发起HTTP请求,服务端才会返回数据,那我们来考虑一下,我们在聊天的时候向服务器主动发送信息能够通过HTTP协议实现,但是我们没有办法通过HTTP协议让服务器向我们发送信息,这样就达不到我们想要的聊天效果,因此我就需要借助WebSocket协议了。因为WebSocket协议是双向通信协议,在建立连接之后,客户端和服务器都可以主动向对方发送或接受数据。
WebSocket协议建立的前提需要借助HTTP协议,建立连接之后,持久连接的双向通信就与HTTP协议无关了。
WebSocket协议的目标是在一个独立的持久连接上提供全双工双向通信。客户端和服务器可以向对方主动发送和接受数据。在JS中创建WebSocket后,会有一个HTTP请求发向浏览器以发起请求。在取得服务器响应后,建立的连接会使用HTTP升级将HTTP协议转换为WebSocket协议。也就是说,使用标准的HTTP协议无法实现WebSocket,只有支持那些协议的专门浏览器才能正常工作。
WebSocket是应用层协议,是TCP/IP协议的子集,通过HTTP/1.1协议的101状态码进行握手。也就是说,WebSocket协议的建立需要先借助HTTP协议,在服务器返回101状态码之后,就可以进行websocket 全双工双向通信了,就没有HTTP协议什么事情了
协议升级格式:
- 客户端请求
- 服务器回应
解释一下几个关键词
- Connection:Connection必须设置为Upgrade,表示客户端希望连接升级
- Upgrade:Upgrade必须设置为WebSocket,表示在取得服务器响应之后,使用HTTP升级将HTTP协议转换(升级)为WebSocket协议。
- Sec-WebSocket-key:随机字符串,用于验证协议是否为WebSocket协议而非HTTP协议
- Sec-WebSocket-Version:表示使用WebSocket的哪一个版本
- Sec-WebSocket-Accept:根据Sec-WebSocket-Accept和特殊字符串计算。验证协议是否为WebSocket协议
- Sec-WebSocket-Location:与Host字段对应,表示请求WebSocket协议的地址
- HTTP/1.1 101 Switching Protocols:101状态码表示升级协议,在返回101状态码后,HTTP协议完成工作,转换为WebSocket协议。此时就可以进行全双工双向通信了。
具体HTTP升级为WebSocket可参考博客 HTTP升级为WebSocket
其实我的项目为了能够简单一些,并没有自己写将HTTP升级为WebSocket协议的请求,而是借助mongoose框架中的接口进行实现,说到这我们就简单介绍一下mongoose框架
mongoose
Mongoose是c语言写成的网络库。它为TCP、UDP、HTTP、WebSocket、CoAP、MQTT实现了事件驱动型的非阻塞api。其具有以下特性:
- 跨平台:可在linux/unix macos QNX eCos Windows Android Iphone FreeRtos上运行
- 原生支持PicoTCP的嵌入式tcp/ip协议栈,支持LWIP嵌入式tcp/ip协议栈
- 单线程,异步,非阻塞核心与简单的基于事件的API
在运行和占用很小的内存,源代码符合ISO C 和ISO c++规范,使用时,仅需要包含mongoose.c mongoose.h 到我们的项目即可完成整合。Mongoose使嵌入式网络编程快速,健壮,轻松。
项目代码编写
这里我想分为四部分来介绍项目的代码实现
- 首先是实现我们网页的聊天功能
- 将数据库接入,让我们能够通过代码访问我们的数据库
- 准备前端页面,为前端页面添加Ajax,使前后端数据json交互
- 最后就是给我们的项目添加session和cookie
网页聊天功能
在实现之前,我们得来想一想实现一个网页聊天功能我们到底需要做些什么,无非我们需要处理的事情就是4件事:
- 第一个就是处理客户端发起的HTTP请求,请求能够在我们的网页进行聊天
- 第二就是客户端发起的将HTTP协议升级为WebSocket协议的请求
- 第三就是处理客户端发送的聊天信息,由于我们是群聊系统,肯定得让所有在线的客户都收到聊天信息
- 第四个就是处理有客户端退出,要断开连接的请求