zoukankan      html  css  js  c++  java
  • socket.ioclientcpp compile and test with VS2019 win10

    socket.io 官网的C++版的客户端。https://github.com/socketio/socket.io-client-cpp

    并不依赖boost了,所以相对比较好安装,但是还是有不少明坑,暗坑。还是得写下来

    自带的example太复杂了,一个简单的控制台程序塞进大量没P用的东西,什么mutex都来了。https://github.com/socketio/socket.io-client-cpp/blob/master/examples/Console/main.cpp

    自己写1个精简版的控制台,特定windows平台下VS2019。

    一、编译

    1.1 openssl

    参考 https://www.cnblogs.com/dshvv/p/12271280.html

    1.1.1 直接下载windows x64的编译好的版本:http://slproweb.com/products/Win32OpenSSL.html

    1.1.2 安装到 D:\lib\OpenSSL-Win64

    1.1.3 建立2个环境变量,以后似乎是openssl自用,1个是下面cmake编译socket.io-client-cpp需要的。这里全都设置好

    OPENSSL_HOME

    D:\lib\OpenSSL-Win64\bin

    OPENSSL_ROOT_DIR

    D:\lib\OpenSSL-Win64

    1.2 下载编译

    基本就是按官网 https://github.com/socketio/socket.io-client-cpp/blob/master/INSTALL.md#with-cmake

    1.2.1 下载

    git clone --recurse-submodules https://github.com/socketio/socket.io-client-cpp.git

    一旦遇到任何433 Time out 

    请直接设置代理。

    注意直接全局设置代理:

    git config --global http.proxy 127.0.0.1:1080

    不要只在这一个语句设置代理。

    $ git clone --recurse-submodules https://github.com/socketio/socket.io-client-cpp.git --config "http.proxy=127.0.0.1:1080"

    否则只是下载socket.io-client-cpp时用到了代理,而下载依赖工程的时候,还是不用代理。

    或者10053 啥的错误,

     git config --global http.sslVerify "false"

     1.2.2 编译

    安装cmake。win10越搞越麻烦 https://www.cnblogs.com/xuanmanstein/p/15637571.html

    cd 到 clone下来的源码 路径 :比如 D:\lib\socket.io-client-cpp

    cmake ./

    会在这里产生vs2019版本的 sln

    注意不要直接打开。而是要在开始菜单,找到vs2019的图标,右键,"更多"-> "以管理员身份运行" (否则会在INSTALL时报错 setlocal,没有管理员权限就不能在C盘创建文件夹)

    然后再选这个sln,选择,release x64 

    然后就简单了,在项目管理器里先生成 ALL_BUILD 再 INSTALL。

    会在C:/Program Files (x86) 创建出1个sioclient文件夹

    里面include里3个.h文件:

    sio_client.h

    sio_message.h

    sio_socket.h

    lib里2个静态库lib

    sioclient.lib

    sioclient_tls.lib

    把sioclient文件夹整体复制到d:/lib里,作为自己demo使用的依赖项。

    至此编译完毕。

    二、测试

     用py写一个测试用的server

    from gevent import monkey
    monkey.patch_all()
    from flask_socketio import SocketIO
    from flask_socketio import send, emit
    from flask_cors import CORS
    
    from flask import Flask, render_template, session, request, jsonify
    
    app = Flask(__name__)
    app.config['SECRET_KEY'] = 'secret!'
    app.config['JSON_AS_ASCII'] = False
    CORS(app)
    #socketio = SocketIO(app, async_mode="gevent", ping_timeout=10, cors_allowed_origins='*', cors_credentials=False)
    socketio = SocketIO(app, ping_timeout=10, cors_allowed_origins='*', cors_credentials=False)
    
    @app.route('/', methods=['GET'])
    def handle_target_kind():
        return 'hello world'
        emit('m1')
    
    
    #-------------socketio---------------------
    
    @socketio.on('connect')
    def handle_connect():
        print('connect')
        emit('from server', '哈哈哈')
    
    @socketio.on('disconnect')
    def handle_disconnect():
        print('Client disconnected', request.sid)
    
    
    @socketio.on('message_empty')
    def handle_message_empty():
        print('message_empty')
    
    @socketio.on('message_str')
    def handle_message_str(data):
        print('message_str ', data)
    
    @socketio.on('message_two')
    def message_two(d1, d2):
        print('message_two ', d1, d2)
    
    # @sio.event
    # def message_list(sid, data):
    #     print('message_list ', data)
    
    # @sio.event
    # def message_list(sid, data):
    #     print('message_list ', data)
    
    
    
    
    
    if __name__ == '__main__':
        print('flask socketio start')
        socketio.run(app, host='0.0.0.0', port=5000)

    cpp客户端

    #include <iostream>
    #include <sio_client.h>
    #include <sio_message.h>
    #include <sio_socket.h>
    
    using namespace sio;
    using namespace std;
    
    int main()
    {
        socket::ptr current_socket;
        sio::client h;
    
        h.connect("http://127.0.0.1:5000");
    
        current_socket = h.socket();
        //测试发送消息
        current_socket->emit("message_empty");
    
        message::list li("sports");
        li.push(string_message::create("economics"));
    
        current_socket->emit("message_two", li);
        //current_socket->on("connect", &OnMessage);
        while (true) {
    
        }
    
        std::cout << "Hello World!\n";
        h.sync_close();
        h.clear_con_listeners();
        return 0;
    }

    这是最简单版本的demo了,连接上不用等待,就可以直接emit,但是必须后面跟1个whie 死等,这样就能收发到。

    —————————————
  • 相关阅读:
    POJ 1611 The Suspects
    POJ 2001 Shortest Prefixes(字典树)
    HDU 1251 统计难题(字典树 裸题 链表做法)
    G++ C++之区别
    PAT 乙级 1013. 数素数 (20)
    PAT 乙级 1012. 数字分类 (20)
    PAT 乙级 1009. 说反话 (20)
    PAT 乙级 1008. 数组元素循环右移问题 (20)
    HDU 6063 17多校3 RXD and math(暴力打表题)
    HDU 6066 17多校3 RXD's date(超水题)
  • 原文地址:https://www.cnblogs.com/xuanmanstein/p/15637643.html
Copyright © 2011-2022 走看看