c++ - Node js 服务器和 c++ 客户端套接字 io 连接,无法发出或读取数据

标签 c++ node.js sockets websocket socket.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++ 客户端提出了同样的问题,但还没有人回答。请帮忙

最佳答案

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

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

解决这个问题最愚蠢的方法是简单地添加一个 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)>内部。

关于c++ - Node js 服务器和 c++ 客户端套接字 io 连接,无法发出或读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59046232/

相关文章:

c++ - 使用基于范围的 for 循环动态创建的对象显示为 nullptr

c++ - C++中的内存管理

python - Boost.Python 和 Boost.Function

javascript - 通过 Dropbox Api V2 上传文件

node.js - 为什么在 console.developers.google.com 中创建 API key 时收到此错误消息 :'This API project was not found'

c - 服务器无法正确读取/打开客户端用 C 发送的文件名

C++ List 不是通过复制构造函数或赋值运算符进行复制

node.js - 如何在 node-amqp 中使用 x-message-ttl?

python - 从 Socket.File.Read 部分读取

linux - 在这些情况下,TCP 会自动关闭套接字吗?