Qt写websocketpp服务端
1、下载websocketpp,地址为https://github.com/zaphoyd/websocketpp,版本为0.7。
2、下载boost,地址为https://www.boost.org/,版本为1.6.3。
3、说明:websocketpp并不是必须需要boost,如果C++编译为C11以上,是可以不用的。
4、Qt创建一个console工程(如:websocketServer),将下载下来的websocket_master里面的websocket文件夹放到该工程目录下,在webSocketServer.pro文件中添加include(websocket/websocket.pri),
5、创建websocket_server类,头文件websocket_server.h内容如下:
#include <websocketpp/config/asio_no_tls.hpp>
#include <websocketpp/server.hpp>
#include <websocketpp/impl/connection_impl.hpp>
#include <websocketpp/config/core.hpp>
#include <websocketpp/connection.hpp>
#include <websocketpp/endpoint.hpp>
#include <websocketpp/close.hpp>
#include <websocketpp/uri.hpp>
#include <map>
#include <string>
#include <sstream>
#include <cstdlib>
#include <iostream>
#include <QDateTime>
using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;
using websocketpp::lib::bind;
using websocketpp::endpoint;
using websocketpp::connection;
typedef websocketpp::server<websocketpp::config::asio> server;
typedef server::message_ptr message_ptr;
/////////////////////////////////////////////////////////////////////
class connection_metadata
{
public:
typedef websocketpp::lib::shared_ptr<connection_metadata> ptr;
connection_metadata(websocketpp::connection_hdl hdl,std::string strRemote) :
m_hdl(hdl),strRemote(strRemote)
{}
void setDateTime()
{
dt = QDateTime::currentDateTime();
}
QDateTime getDateTime() const
{
return dt;
}
void sethdl(websocketpp::connection_hdl hdl)
{
m_hdl = hdl;
}
websocketpp::connection_hdl gethdl()
{
return m_hdl;
}
void update_time()
{
dt = QDateTime::currentDateTime();
}
void setRemote(std::string strRemote)
{
this->strRemote = strRemote;
} std::string getRemote() const
{
return strRemote;
}
private:
QDateTime dt;
std::string strRemote;
websocketpp::connection_hdl m_hdl;
};
/////////////////////////////////////////////////////////////////////
class websocket_server
{
public:
websocket_server();
~websocket_server(); static void on_open(server* s,websocket_server* pWebSocket,websocketpp::connection_hdl hdl);
static void on_close(server* s,websocket_server* pWebSocket,websocketpp::connection_hdl hdl);
static void on_message(server* s,websocket_server* pWebSocket,websocketpp::connection_hdl hdl,message_ptr msg);
void start(int port);
private:
typedef std::map<std::string,connection_metadata::ptr> con_list; server echo_server;
con_list m_connection_list;
websocketpp::lib::shared_ptr<websocketpp::lib::thread> m_thread;
};
6、websocket_server.cpp内容如下:
websocket_server::websocket_server()
{
m_connection_list.clear();
}
websocket_server::~websocket_server()
{
for(con_list::iterator iter = m_connection_list.begin();iter != m_connection_list.end();)
{
echo_server.close(iter->second->gethdl(),websocketpp::close::status::going_away,"");
m_connection_list.erase(iter++);
}
echo_server.stop_perpetual();
m_thread->join();
}
//连接
void websocket_server::on_open(server *s,websocket_server* pWebSocket,websocketpp::connection_hdl hdl)
{
server::connection_ptr con = s->get_con_from_hdl(hdl);
const std::string strRemote = con->get_remote_endpoint();
con_list::iterator iter = pWebSocket->m_connection_list.find(strRemote);
if(iter == pWebSocket->m_connection_list.end())
{
connection_metadata* pmetadata = new connection_metadata(hdl,strRemote);
pWebSocket->m_connection_list.insert(make_pair(strRemote,pmetadata));
}
else
{
iter->second->sethdl(hdl);
}
}
//断开
void websocket_server::on_close(server* s,websocket_server* pWebSocket,websocketpp::connection_hdl hdl)
{
server::connection_ptr con = s->get_con_from_hdl(hdl);
const std::string strRemote = con->get_remote_endpoint();
con_list::iterator iter = pWebSocket->m_connection_list.find(strRemote);
if(iter != pWebSocket->m_connection_list.end())
{
pWebSocket->m_connection_list.erase(iter);
}
}
//通信
void websocket_server::on_message(server* s,websocket_server* pWebSocket,websocketpp::connection_hdl hdl, message_ptr msg)
{
if(msg->get_opcode() == websocketpp::frame::opcode::text)
{
server::connection_ptr con = s->get_con_from_hdl(hdl);
const std::string strRemote = con->get_remote_endpoint();
std::cout << strRemote <<std::endl;
}
std::cout << "on_message called with hdl: " << hdl.lock().get() << " and message: " << msg->get_payload() << std::endl;
if(msg->get_payload() == "stop-listening")
{
s->stop_listening();
return;
}
try
{
s->send(hdl, msg->get_payload(),msg->get_opcode());//接收到的数据原路返回
}
catch (const websocketpp::lib::error_code& e)
{
std::cout << "Echo failed because: " << e << "(" << e.message() << ")" << std::endl;
}
}
void websocket_server::start(int port)
{
try
{
// Set logging settings
echo_server.set_access_channels(websocketpp::log::alevel::all);
echo_server.clear_access_channels(websocketpp::log::alevel::frame_payload);
// Initialize Asio
echo_server.init_asio();
echo_server.start_perpetual();
echo_server.set_open_handler(bind(&on_open,&echo_server,this,::_1));
echo_server.set_close_handler(bind(&on_close,&echo_server,this,::_1));
echo_server.set_message_handler(bind(&on_message,&echo_server,this,::_1,::_2));
// Listen on port 9002
echo_server.listen(port);
// Start the server accept loop
echo_server.start_accept();
// Start the ASIO io_service run loop
//echo_server.run();
m_thread = websocketpp::lib::make_shared<websocketpp::lib::thread>(&server::run,&echo_server);//用线程m_thread的run函数来跑echo_server的run,这样可以避免程序卡在echo_server的run里
}
catch (websocketpp::exception const & e)
{
std::cout << e.what() << std::endl;
}
catch (...)
{
std::cout << "other exception" << std::endl;
}
}
Qt写websocketpp服务端的更多相关文章
- PHP写webservice服务端
1) WebService技术介绍 WebService是一种跨编程语言和跨操作系统平台的远程调用技术.仅仅有通过Web Service,client和server才可以自由的用HTTP进行通信.不论 ...
- [原创]使用vscode+es6写nodejs服务端调试配置
前端的小伙伴们在babel等的加持下,已经可以愉快的使用es6来写代码了. 然后对于服务端的nodejs就有点坑爹了,虽然原生支持了es6,但是只是部分支持,一些不支持的特性(比如module)使用了 ...
- Golang写https服务端
1. 生成私钥openssl genrsa -out key.pem 20482. 生成证书openssl req -new -x509 -key key.pem -out cert.pem -day ...
- [转][C#]手写 Socket 服务端
private void OpenSocket(int port) { Task.Factory.StartNew(() => { server = new Socket(AddressFami ...
- socket手写一个简单的web服务端
直接进入正题吧,下面的代码都是我在pycharm中写好,再粘贴上来的 import socket server = socket.socket() server.bind(('127.0.0.1', ...
- (二)Netty源码学习笔记之服务端启动
尊重原创,转载注明出处,原文地址:http://www.cnblogs.com/cishengchongyan/p/6129971.html 本文将不会对netty中每个点分类讲解,而是一个服务端启 ...
- `fw服务端非完整` 工程开发初期的工作
前面写到了一些关于cocos2dx在开发中的一些模块以及一些解决方法,那些都属于本人的个人简介和个人倾向的解决方案.最近这几天我完善了一下ui解析的部分,当然也只是抽出一点点时间去做的这件事情.我添加 ...
- [笨木头FireFly01]入门篇1·最简单的服务端和客户端连接
原地址:http://www.9miao.com/question-15-53938.html 最近一直在写游戏,几乎没有来写教程了,打算放慢一下脚步,学学新东西.那为嘛我要学FireFly呢? 之前 ...
- 利用python多线程实现多个客户端与单个服务端的远程ssh
本次实验设计两个方面的代码,第一个是客户端,代码如下: import os from socket import * c = socket(AF_INET,SOCK_STREAM) c.connect ...
随机推荐
- 金融量化分析【day113】:布林带策略
一.布林带策略简介 1.简介 2.计算公式 3.图形 二.布林带策略代码 import jqdata def initialize(context): set_benchmark('0000 ...
- HTML(八)HTML meta标签&base标签
HTML meta元素 标签(meta-information)用于提供页面有关的元数据,除了提供文档字符集.使用语言.作者等基本信息外,还涉及对关键词和网页等级的设定.通过设置不同的属性,元数据可以 ...
- JGUI源码:Accordion兼容IE8实现(3)
本来不考虑IE8,但是还是有部分客户用的XP,有不代表没有,尽量做一下兼容处理1.before,after,要使用:不能使用:: 2.阻止冒泡 function stopPropagation(e) ...
- java Concurrent并发容器类 小结
Java1.5提供了多种并发容器类来改进同步容器的性能. 同步容器将所有对容器的访问都串行化,以实现他们的线程安全性.这种方法的代价是严重降低并发性,当多个线程竞争容器的锁时,吞吐量将严重减低. 一 ...
- 找不多控件, or 控件为null
组件化开发,命名要使用moudle区分, 同名,在最后合成的时候,会出现很多问题,
- django drf 基础学习3
一 简述 这里来谈下一些基本原理 二 汇总 1 restful规范 1 根据method不同做不同的操作 request.method=' get(获取) 返回完整 ...
- 2018-2019-1 20165234 实现mypwd
实现mypwd(选做,加分) 1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 实现mypwd 4 测试mypwd 提交过程博客的链接
- Why Random Initialization in Neural Network?
- JDBC连接MariaDB:数据传输加密
环境:win7+springboot+mybatis+mariadb 需求说明: 未做安全加固前用wireshark抓包: 可以很明显看到用户名.数据库和 SQL,这种情况是有安全风险的. 1.下载o ...
- vue中html模板使用绑定的全局函数
我们知道在script中使用vue绑定的全局函数时, 我们需要用这种方式使用: this.Util.Fun(e) 那在模板中, 比如v-if中想使用Fun函数怎么办呢?你应该这样做 <i v-i ...