我无法完成这个简单的测试工作。我用 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/