项目简介
1.使用开源的websocket框架mongoose编写网页版本的群聊即时通信工具。
2.使用http+moogoose+session+mysql+jsoncpp的技术构成,完成IM(即时通信)工具。
项目技术点
1.C++11 STL
2.http协议
3.websocket协议
4.session和cookie理解
5.mysql c connect
6.登录注册,session管理
7.moogoose框架理解
8.jsoncpp
准备开发项目
1.http协议
http请求由四部分组成,分别是:请求行、消息报头、空行、请求正文
HTTP(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。
1、常用的HTTP方法有哪些?
GET: 用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器。
POST:用于传输信息给服务器,主要功能与GET方法类似,但一般推荐使用POST方式。 PUT:
传输文件,报文主体中包含文件内容,保存到对应URI位置。 HEAD:
获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效。
DELETE:删除文件,与PUT方法相反,删除对应URI位置的文件。 OPTIONS:查询相应URI支持的HTTP方法。
在这个项目中我们使用GET\POST方法。
webSocket协议
其实通过日常生活中,你如果不去访问浏览器,浏览器是不会主动给你发送数据的;但是我们又可以发现当我们没有访问浏览器时,我们还可以看到一些浏览器推送的消息。
现在,很多的网站为了完成推送技术,所用的技术都是轮询技术。轮询就是在特定的时间间隔,由浏览器向服务器发起http请求,然后服务器返回数据给浏览器。
而我们今天要了解的websocket就属于服务端推送技术,本质上是一种应用层协议,可以实现持久连接的全双工双向通信,在建立连接后,客户端和服务器都可以主动的向双方发送或者接受数据。
webSocket协议建立的前提是先借助http协议建立连接,在服务器返回101状态码之后,持久连接的双向通信就与http协议无关了。
客户端请求
GET /HTTP/1.1
Upgrade:websocket
Connection:Upgrade
Host:example.com
Origin:http://example.com
Sec-WebSocket-Key:sN9ccfkJHGjde3idj=
Sec-WebSocket-Version:13
服务器端回应
HTTP/1.1 101 Switching Protocols
Upgrade:websocket
Sec-WebSocket-Accept:fGhoounSN3uIgjkla=
Sec-WebSocket-Location:1ws://example.com/
开始开发
1.moogoose基本使用
#include "mongoose.h"
static sig_atomic_t s_signal_received = 0;
static const char *s_http_port = "8000";
static struct mg_serve_http_opts s_http_server_opts;
static void signal_handler(int sig_num) {
signal(sig_num, signal_handler); // Reinstantiate signal handler
s_signal_received = sig_num;
}
static int is_websocket(const struct mg_connection *nc) {
return nc->flags & MG_F_IS_WEBSOCKET; //检测链接是否是websocket的长链接
}
static void broadcast(struct mg_connection *nc, const struct mg_str msg) {
//将消息msg通过链接*nc发送出去。
struct mg_connection *c;
char buf[500];
char addr[32];
mg_sock_addr_to_str(&nc->sa, addr, sizeof(addr),MG_SOCK_STRINGIFY_IP | MG_SOCK_STRINGIFY_PORT);//我们不用
snprintf(buf, sizeof(buf), "%s %.*s", addr, (int) msg.len, msg.p);//字符串格式化输出
printf("%s\n", buf); /* Local echo. */
for (c = mg_next(nc->mgr, NULL); c != NULL; c = mg_next(nc->mgr, c)) {
//遍历事件管理器链接的头部
//if (c == nc) continue; //这里是不会发给自己,我们要将消息推送给自己,注释掉即可
mg_send_websocket_frame(c, WEBSOCKET_OP_TEXT, buf, strlen