事件上的 C++ 侦听器未使用套接字 io C++ 客户端获取事件

Posted

技术标签:

【中文标题】事件上的 C++ 侦听器未使用套接字 io C++ 客户端获取事件【英文标题】:C++ listener on event is not getting event using socket io C++ client 【发布时间】:2020-07-26 17:40:58 【问题描述】:

我创建了示例应用程序,用于在作为 socket.io 服务器和 C++ 客户端运行的 node.js 应用程序之间发送/接收消息,下面是我的 C++ 客户端代码:

sio::client io;
socket::ptr current_socket;
string w = "harshil";
io.set_open_listener([&]() 
    io.socket()->emit("message", w); // Can able to send message to server
);
io.socket()->on("server", sio::socket::event_listener([&](event &e)
               
                        cout << __LINE__ << endl; // Can not print line :(
               ));
io.connect("http://127.0.0.1:8081");

在这里您可以看到,该客户端可以向服务器发送消息,但它无法接收基于“服务器”事件名称的消息,有人可以帮助我吗?

【问题讨论】:

【参考方案1】:

对于那些像我一样坚持的人,下面的示例代码将对他们有所帮助。 为node.js创建不同的示例代码充当socket.io服务器,main.cpp文件充当客户端,

'use strict';

const express     = require('express');
const app         = express();
const serverHttp  = require('http').Server(app); 
const io = require('socket.io')(serverHttp);

const port = 8081;

io.on('connection', function (socket)    
    socket.on('message', function (data) 
        console.log("key received!!!" + data);
    socket.emit('server', 'hello socket io');
        console.log("sent server msg");
    );
);

serverHttp.listen(port, function()   
    console.log("init!!!");    
);

示例服务器应用程序,它接收来自客户端的请求并向客户端发送消息。

#include "sio_client.h"

#include <unistd.h>
#include <functional>
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <string>
#define HIGHLIGHT(__O__) std::cout<<"\e[1;31m"<<__O__<<"\e[0m"<<std::endl
#define EM(__O__) std::cout<<"\e[1;30;1m"<<__O__<<"\e[0m"<<std::endl

#define MAIN_FUNC int main(int argc ,const char* args[])

using namespace sio;
using namespace std;
std::mutex _lock;

std::condition_variable_any _cond;
bool connect_finish = false;

class connection_listener

    sio::client &handler;

public:
    
    connection_listener(sio::client& h):
    handler(h)
    
    
    

    void on_connected()
    
        _lock.lock();
        _cond.notify_all();
        connect_finish = true;
        _lock.unlock();
    
    void on_close(client::close_reason const& reason)
    
        std::cout<<"sio closed "<<std::endl;
        exit(0);
    
    
    void on_fail()
    
        std::cout<<"sio failed "<<std::endl;
        exit(0);
    
;

socket::ptr current_socket;
void bind_events()

    current_socket->on("server", sio::socket::event_listener_aux([&](string const& name, message::ptr const& data, bool isAck,message::list &ack_resp)
                       
                           _lock.lock();
              cout << name << endl;
              cout << data->get_string() << endl;
                          _lock.unlock();
                       ));
    


MAIN_FUNC


    sio::client h;
    connection_listener l(h);
    
    h.set_open_listener(std::bind(&connection_listener::on_connected, &l));
    h.set_close_listener(std::bind(&connection_listener::on_close, &l,std::placeholders::_1));
    h.set_fail_listener(std::bind(&connection_listener::on_fail, &l));
    h.connect("http://127.0.0.1:8081");
    _lock.lock();
    if(!connect_finish)
    
    cout << "wait\n";
        _cond.wait(_lock);
    

    _lock.unlock();
    current_socket = h.socket();
    string nickname;
    while (nickname.length() == 0) 
        HIGHLIGHT("Type your nickname:");
        
        getline(cin, nickname);
    
    current_socket->emit("message", nickname);
    bind_events();
    sleep(10);
    h.sync_close();
    h.clear_con_listeners();
    return 0;

示例客户端应用程序,它向服务器发送消息,并从服务器接收消息,

【讨论】:

以上是关于事件上的 C++ 侦听器未使用套接字 io C++ 客户端获取事件的主要内容,如果未能解决你的问题,请参考以下文章

C++ UDP Socket端口复用

为啥没有调用android端的socket.io监听器?

在 C++ 中的 UDP 套接字编程中获取“传输端点未连接”

Linux 上的 C++:设置套接字和数据包以最小化 RTP 流延迟

C++ CreateProcess 无法从 Windows 7 上的套接字接收路径 (64)

使用来自另一个客户端的广播发射从节点服务器发送的数据无法被 c++ 套接字 io 客户端读取