项目:即时聊天室

项目简介

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值