项目内容
使用开源websocket框架mongoose编写网页版本的群聊即时通信工具,使用http+mongoose+session+mysql+jsoncpp的技术构成,从而实现一个网页版的聊天室。
技术点:C++11 STL、http协议、websocket协议 、session和cookie理解、mysql等
项目的整个逻辑:
- 首先,设计基本框架
- 然后,先完成基本的聊天逻辑
- 在能够让我们访问数据库,访问我们之前所建立的表
- 最后,完成登录逻辑
这样就可以开始网页版聊天室的聊天了
WebSocket是一种协议,与HTTP协议一样位于应用层,都是TCP/IP协议的子集。HTTP协议是单向通信协议,只有客户端发起HTTP请求,服务端才会返回数据。而WebSocket协议是双向通信协议,在建立连接之后,客户端和服务器都可以主动向对方发送或接受数据。WebSocket协议建立的前提需要借助HTTP协议,建立连接之后,持久连接的双向通信就与HTTP协议无关了。
WebSocket属于服务端推送技术,本质是一种应用层协议,可以实现持久连接的全双工双向通信。
项目目录
IMServer.cc
IMServer.hpp
Util.hpp //工具类
Makefile
mongoose //mongoose框架
mysql
web //前端页面
temp_file //保存临时语音文件目录
主要的逻辑框架
struct session{ //登录用户的session信息数据结构,有部分内容是要写到客户端cookie中的
};
class IM_MysqlClient{
//访问数据库客户端,使用C connect封装 };
class IM_Controller{
//控制器 };
class IM_Server{
//服务器功能 };
下面是源代码:
IMServer.hpp
#pragma once
#include <iostream>
#include <string>
#include <sstream>
#include "Util.hpp"
#include "mongoose.h"
#include "mysql.h"
#define IM_DB "im_db" //数据库
#define IM_PORT 3306 //数据库端口号
#define SESSION_TTL 600.0
#define SESSION_CHECK_INTERVAL 5.0
#define NUM 128 //必须是确定大小的数组,不能超过
#define SESSION_COOKIE_NAME "IM"
#define SESSION_COOKIE_USER "NAME"
struct mg_serve_http_opts s_http_server_opts;
struct session{
uint64_t id;
double created;
double last_used;
std::string name;
};
class Session{
private:
session sessions[NUM];
public:
Session()
{
for(auto i = 0; i < NUM; i++)
{
sessions[i].id = 0;
sessions[i].name = "";
sessions[i].created = 0.0;
sessions[i].last_used = 0.0;
}
}
bool IsLogin(http_message *hm)
{
return GetSession(hm);
}
bool GetSession(http_message *hm)
{
uint64_t sid;
char ssid[64];
char *ssid_p = ssid;
struct mg_str *cookie_header = mg_get_http_header(hm, "cookie");
if(nullptr == cookie_header)
{
return false;
}
if(!mg_http_parse_header2(cookie_header, SESSION_COOKIE_NAME, &ssid_p, sizeof(ssid))){
return false;
}
//字符串转长整型,16进制
sid = strtoull(ssid, NULL, 16);
sid = strtoull(ssid, NULL, 10);
for(auto i = 0; i < NUM; i++)
{
if(sessions[i].id == sid)
{
sessions[i].last_used = mg_time();
return true;
}
}
return false;
}
bool CreateSession(string name, uint64_t &id)
{
int i = 0;
for(; i < NUM