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服务端的更多相关文章

  1. PHP写webservice服务端

    1) WebService技术介绍 WebService是一种跨编程语言和跨操作系统平台的远程调用技术.仅仅有通过Web Service,client和server才可以自由的用HTTP进行通信.不论 ...

  2. [原创]使用vscode+es6写nodejs服务端调试配置

    前端的小伙伴们在babel等的加持下,已经可以愉快的使用es6来写代码了. 然后对于服务端的nodejs就有点坑爹了,虽然原生支持了es6,但是只是部分支持,一些不支持的特性(比如module)使用了 ...

  3. Golang写https服务端

    1. 生成私钥openssl genrsa -out key.pem 20482. 生成证书openssl req -new -x509 -key key.pem -out cert.pem -day ...

  4. [转][C#]手写 Socket 服务端

    private void OpenSocket(int port) { Task.Factory.StartNew(() => { server = new Socket(AddressFami ...

  5. socket手写一个简单的web服务端

    直接进入正题吧,下面的代码都是我在pycharm中写好,再粘贴上来的 import socket server = socket.socket() server.bind(('127.0.0.1', ...

  6. (二)Netty源码学习笔记之服务端启动

    尊重原创,转载注明出处,原文地址:http://www.cnblogs.com/cishengchongyan/p/6129971.html  本文将不会对netty中每个点分类讲解,而是一个服务端启 ...

  7. `fw服务端非完整` 工程开发初期的工作

    前面写到了一些关于cocos2dx在开发中的一些模块以及一些解决方法,那些都属于本人的个人简介和个人倾向的解决方案.最近这几天我完善了一下ui解析的部分,当然也只是抽出一点点时间去做的这件事情.我添加 ...

  8. [笨木头FireFly01]入门篇1·最简单的服务端和客户端连接

    原地址:http://www.9miao.com/question-15-53938.html 最近一直在写游戏,几乎没有来写教程了,打算放慢一下脚步,学学新东西.那为嘛我要学FireFly呢? 之前 ...

  9. 利用python多线程实现多个客户端与单个服务端的远程ssh

    本次实验设计两个方面的代码,第一个是客户端,代码如下: import os from socket import * c = socket(AF_INET,SOCK_STREAM) c.connect ...

随机推荐

  1. openstack项目【day24】:OpenStack mitaka部署

    前言: openstack的部署非常简单,简单的前提建立在扎实的理论功底,本人一直觉得,玩技术一定是理论指导实践,网上遍布个种搭建方法都可以实现一个基本的私有云环境,但是诸位可曾发现,很多配置都是重复 ...

  2. NOI-OJ 1.13 ID:34 确定进制

    整体思路 对于任意的p,q,r,可能使得p*q=r的最小进制应该是p,q,r三个数的所有数位中最大的数字+1,例如,6,9,42三个数中所有数位中最大的数字是9,故可能成立的最小进制是9+1,即10. ...

  3. linux下安装与配置Redis

    1.安装 (1)获取源代码 wget http://download.redis.io/releases/redis-4.0.8.tar.gz (2)解压 tar xzvf redis-4.0.8.t ...

  4. 第六节:反射(几种写法、好处和弊端、利用反射实现IOC)

    一. 加载dll,读取相关信息 1. 加载程序集的三种方式 调用Assembly类下的三个方法:Load.LoadFile.LoadFrom. //1.1 Load方法:动态默认加载当前路径下的(bi ...

  5. django - 总结 - 跨域请求

    script ->jsonp跨域 浏览器的同源策略:不能跨越网站请求信息: XMLHttpRequests遵循这个规定. 因此ajax等基于XML的都不能进行跨站请求 而我们知道img,ifra ...

  6. ORACLE升级PSU&OJVM注意的问题及遇到问题解决思路

    [环境介绍] 系统环境:Solaris + Oracle 11R2 + OGG + 脚本定时任务统计信息收集 [背景描述] 基于集团的安全检查,需要对数据库版本进行漏洞扫描,漏洞扫描中存在RBDMS和 ...

  7. Groovy 设计模式 -- 责任链模式

    Chain of Responsibility Pattern http://groovy-lang.org/design-patterns.html#_chain_of_responsibility ...

  8. Stm32 GPIO复习

    地点:中图四楼. 1.七个寄存器 配置寄存器:GPIOx_CPL.GPIOx_CPH; 数据寄存器:GPIOx_IDR.GPIOx_ODR: 置位/复位寄存器:GPIOx_BSRR 复位寄存器:GPI ...

  9. HDU - 1013

    wa了两遍: (1)没有弄清楚输入数据的范围,实际上是字符串输入,数字很大. (2)此题太水,没有标数据范围. #include<iostream> #include<cstdio& ...

  10. HTTP协议08-请求首部字段

    请求首部字段 请求首部字段是从客户端往服务器端发送请求报文中所使用的字段,用于补充请求的附加信息.客户端信息,对响应内容相关的优先级等内容 1)Accept 通知服务器,用户代理能够处理的媒体类型及媒 ...