c++ - 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++ 客户端提出了同样的问题,还没有人回答。请帮忙
解决方案
从代码的简要介绍看来,它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 。
推荐阅读
- apache-spark - Spark 内部结构:项目的好处
- laravel-5 - 我如何在表单提交时将员工表 ID(自动递增)提交到员工 ID 下的用户表
- java - 从另一个类更新摆动组件
- android - Firebase设置值将错误的键放在已发布的应用程序上
- scala - 使一个 SBT 子项目任务依赖于另一个子项目任务
- r - 在维护顺序的同时聚合和折叠基于向量
- git - 在桌面目录下做 git init 有什么坏处?
- android - 在Android中,当应用程序处于运行或关闭状态时,是否有适当的方法来检测用户是否添加或删除了指纹?
- kubernetes - Kubernetes Persistent Volumes 删除初始文件
- node.js - 为什么找不到我安装的Node包