使用来自另一个客户端的广播发射从节点服务器发送的数据无法被 c++ 套接字 io 客户端读取

Posted

技术标签:

【中文标题】使用来自另一个客户端的广播发射从节点服务器发送的数据无法被 c++ 套接字 io 客户端读取【英文标题】:Data sent from node server using broadcast emit from another client is not able to be read by c++ socket io client 【发布时间】:2019-11-26 14:31:55 【问题描述】:

节点服务器

'use strict';

const express     = require('express');
const app         = express();
const serverHttp  = require('http').Server(app); 
const io = require('socket.io')(serverHttp);

const port = 8081;

socket.on('JogCartesianButton', data => 
    socket.broadcast.emit('JogCartesianButton', data)
    console.log(data)
  )
serverHttp.listen(port, function()   
    console.log("init!!!");    
);

数据看起来像这样

   
  q_value: [ 0, 0, 0, 0, 0, 0 ],  
  status: false,  
  joint: true,  
  cartesian: false,  
  freedrive: false,  
  button: true,  
  slider: false,   
  goto: false,  
  threed: false   


现在我在 C++ 客户端中接受来自服务器的这个 数据。通过广播发射它。

我的 c++ 客户端代码如下。

        sio::client io;
        io.set_open_listener([&]() 
            std::string nickName = "asdad";
            io.socket()->emit("key", nickName);
            io.socket()->on("JogCartesianButton", [&](sio::event& ev)
                    
                       //Here how do i get the **data** from server
                    );
        );
        io.connect("http://localhost:8081/");

我如何接受从节点服务器广播的 c++ 中的数据。 我试过 ev.get_messages() 0x7ff174008130 这是输出,但需要 key : value 作为输出。

【问题讨论】:

“但是我得到了一些参考” 这是什么意思?更清楚。出示minimal reproducible example 您好,我刚刚做了一些更改,您可以看看吗? 问题陈述仍然只是“但我得到了一些参考”(好吧,好吧,标题还包括一个“我不能”) 看看那个仓库中的example。看看他们如何订阅活动。也看看the definition of event_listener_aux @LightnessRaceswithMonica 我像你提到的那样改变了它。 【参考方案1】:

文档非常不完整,但应该可以使用以下内容:(取自this example)

io.socket()->on("JogCartesianButton", sio::socket::event_listener_aux([&](string const& name, message::ptr const& data, bool isAck, message::list &ack_resp) 
    string user = data->get_map()["name"]->get_string();
    int64_t age = data->get_map()["age"]->get_int();
    // Do something with user and age
));

正如我在 cmets 中所说,on() 方法在其回调中是多态的,event_listener_aux 形式更易于使用。请注意,此示例预先进行了零错误检查,因此您应该在访问 data 之前使用 message::get_flag 检查它的每个部分。

【讨论】:

我编辑了数据,我想把这个数据从服务器发送到客户端,你能帮我处理一下新数据吗? 附加调试器,显示堆栈跟踪并检查数据变量。如果没有有关崩溃的任何信息,我无法“帮助您”。 谢谢@botje。有效。但是 q_value: [ 0, 0, 0, 0, 0, 0 ] 这个数据我无法获取它,尝试使用 get->vector() ...最后我将它作为 6 个 int 变量发送。跨度>

以上是关于使用来自另一个客户端的广播发射从节点服务器发送的数据无法被 c++ 套接字 io 客户端读取的主要内容,如果未能解决你的问题,请参考以下文章

Socket IO 节点向所有客户端广播数据

将广播从一个进程发送到另一个进程

socket.io 发射在 socket.on 中不起作用

Java中的广播消息

客户端-服务器模式

java socket如何实现客户端与客户端的交互?