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

Posted

技术标签:

【中文标题】Node js服务器和c ++客户端套接字io连接,无法发出或读取数据【英文标题】:Node js server and c++ client socket io connection , not able to emit or read the data 【发布时间】:2019-11-26 08:01:17 【问题描述】:

我无法完成这个简单的测试工作。我用 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++ 客户端提出了同样的问题,目前还没有人回答。请帮忙

【问题讨论】:

我认为它们应该连接到同一个端口? 抱歉,编辑问题时忘记更改端口。它的同一个端口。 [2019-11-21 17:30:11] [connect] 连接成功,我可以在 c++ 端得到这个消息 能否请您在// Never fired 评论前做一个console.log 并检查是否有连接? 【参考方案1】:

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

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

解决这个问题的最愚蠢的方法是在main 函数的末尾添加一个sleep 语句,让网络线程有机会连接并获取其消息。更好的方法是使用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&lt;void(void)&gt;

【讨论】:

我能够使用睡眠发送数据。你能指导我如何写一个开放的听众吗?我正在学习 CPP。 更新答案。 嗨@botje,它与您编写侦听器的方式一致。非常感谢。你能帮我解决问题的第二部分吗,我把问题的第二部分放在了,请看一下。我是一个星星较少的用户,我不能支持你的答案原因:( 提出一个新问题而不是污染这个问题。此外,作为作者,您应该将答案标记为已接受,而不是点赞。 ***.com/questions/59178725/…@Botje 你可以看看这个。

以上是关于Node js服务器和c ++客户端套接字io连接,无法发出或读取数据的主要内容,如果未能解决你的问题,请参考以下文章

c# SocketIoClientDotNet, node js socket.IO

Node.js:socket.io 关闭客户端连接

express,用于浏览器客户端和 node.js 客户端的 socket.io 服务器

使用 Node.js 和 Socket.io 将更改推送到所有客户端

socket.io 客户端在长 Node.js 函数中自动断开连接

Socket.IO 对 Node.js 有啥作用