项目__网页版聊天室

项目内容

使用开源websocket框架mongoose编写网页版本的群聊即时通信工具,使用http+mongoose+session+mysql+jsoncpp的技术构成,从而实现一个网页版的聊天室。

技术点:C++11 STL、http协议、websocket协议 、session和cookie理解、mysql等

项目的整个逻辑:

  1. 首先,设计基本框架
  2. 然后,先完成基本的聊天逻辑
  3. 在能够让我们访问数据库,访问我们之前所建立的表
  4. 最后,完成登录逻辑

这样就可以开始网页版聊天室的聊天了


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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值