首页 > 解决方案 > Node js服务器和c ++客户端套接字io连接,无法发出或读取数据

问题描述

我无法完成这个简单的测试工作。我用 C++ 写给客户端,用 NodeJS 写给服务器,两者都在我的计算机上运行。当我执行客户端应用程序时,控制台会输出此文本......但事件'key'从未在服务器上触发!

客户端控制台输出:

Error: No active session
[2019-11-21 17:30:11] [connect] Successful connection
[2019-11-21 17:30:11] [connect] WebSocket Connection 127.0.0.1:8081 v-2 "WebSocket++/0.8.1" /socket.io/?EIO=4&transport=websocket&t=1574353811 101

C++ 客户端

#include "pch.h"
#include <iostream>

#include <sio_client.h>

using namespace sio;
using namespace std;

int main()
{
    sio::client io;
    io.connect("http://127.0.0.1:8081");

    string command = "w";

    io.socket()->emit("key", command );

}

NodeJS 服务器

'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) {   
    // Never fired :(
    socket.on('key', function (data) {
        console.log("key received!!!");
    });
});

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

你能解决这个问题吗,我看到有人在 GitHub 问题部分针对 socket io c++ 客户端提出了同样的问题,还没有人回答。请帮忙

标签: c++node.jssocketswebsocketsocket.io

解决方案


从代码的简要介绍看来,它io.connect启动了一个单独的线程来进行网络连接。当它返回时,套接字很可能仍处于连接状态。的代码在这里.emit结束,它将数据包推送到队列中,如果套接字尚未连接,则简单地返回。

所以我认为你的问题的根本原因是应用程序在网络线程有机会完成连接之前退出。

解决这个问题的最愚蠢的方法是简单地在函数sleep末尾添加一个语句main,让网络线程有机会连接并获取其消息。更好的方法是socket.set_open_listener在连接打开时收到通知,然后发送消息,因为这应该立即通过:

sio::client io;
io.set_open_listener([&]() {
    io.socket()->emit("key", command);
});
io.connect("http://127.0.0.1:8081");

这会构造一个 lambda 并将其传递给set_open_listener,它在std::function<void(void)>内部存储为 a 。


推荐阅读