【问题标题】:Combining Nodejs Net socket and Socket IO结合 Nodejs Net socket 和 Socket IO
【发布时间】:2018-06-24 05:10:50
【问题描述】:

我有一个 Windows 应用程序(作为 Windows 服务构建在 C# 上)将数据发送到 NodeJs Net Socket,因此,由于 Socket.IO 有助于使 Web 应用程序成为实时应用程序,而无需重新加载。如何在 Net Socket 从 C# 接收数据的那一刻允许 Socket.IO 将接收到的数据从 NodeJs Net Socket 流式传输到 Web 应用程序?

所以在从 C# 接收套接字数据的代码中:

var net = require('net');
    net.createServer(function (socket) {
        socket.on('data', function (data) {
                broadcast(socket.name + "> \n" + data + " \n", socket);
                socket.end("<EOF>");

                //send data to web interface , does it work that way?
                //SomeFooToSendDataToWebApp(Data)
        });
   });

关于 Socket.IO 的更多信息,我有这些行,我真的不知道如何处理它们:

//Should it listen to net socket or web socket?
server.listen(8080);

// Loading socket.io
var io = require('socket.io').listen(server);

// It works but only for one request
io.sockets.on('connection', function (socket2) {
    socket2.emit('message' , 'Message Text');   
});

P.S:我是 nodejs 和 socket.io 的新手,所以如果有可能也解释一下他们的行为。

编辑 1:我的前端 Javascript 以检查它是否有任何问题:

  //for now it listens to http port , which Socket.IO listens to
  var socket = io.connect('http://localhost:8080');
            var myElement = document.getElementById("news");
            socket.on('message', function(message) {
                document.getElementById("news").innerHTML  = message;
            })

编辑 2:是否遵循 jfriend00 的回答,因为似乎我之前的代码尝试尝试将消息发送到未知套接字,我只是添加了这个,因为我需要将它发送到所有连接的客户端,所以只有一行修复了它!

 socket.on('data', function (data) {
                broadcast(socket.name + "> \n" + data + " \n", socket);
                socket.end("<EOF>");

                //send data to web interface , does it work that way?
                //The Added code here:
                io.emit('message',data + " more string");

        });

【问题讨论】:

    标签: node.js socket.io


    【解决方案1】:

    很难准确地说出你在问什么。

    如果您有一些数据要发送到所有连接的 socket.io 客户端(无论数据来自哪里),那么您可以这样做:

    io.emit("someMessage", dataToSend);
    

    如果您只想发送到一个特定的连接客户端,那么您必须以某种方式获取该特定客户端的 socket 对象,然后执行:

    socket.emit("someMessage", dataToSend);
    

    您如何为所需的已连接客户端获取特定的套接字对象完全取决于您的应用程序如何工作以及您如何知道它是哪个客户端。服务器上的每个套接字连接都有一个与之关联的socket.id。在某些情况下,服务器代码使用该 id 来跟踪给定的客户端(例如将 id 放入会话中或将其保存在其他一些服务器端数据中)。如果您有套接字的 id,则可以使用 .to() 方法获取套接字,例如:

    io.to(someId).emit("someMessage", dataToSend);
    

    您的问题是关于如何通过普通 TCP 套接字发送从某些 C# 服务接收到的数据。就将其发送到套接字客户端而言,数据来自何处或您如何接收它都无关紧要。一旦您在某个 Javascript 变量中获得了数据,无论它来自文件、来自 http 请求、来自 C# 服务中的传入 TCP 连接等,从那里都是一样的......这只是您想要发送的数据。

    【讨论】:

    • 好吧,更准确地说,我的 nodejs 完美地接收到来自 C# 的套接字消息,但是由于制作实时 Web 应用程序的唯一方法是 Socket.IO,我如何在从 C# 接收到消息时发送消息到 Web 应用程序?我将编辑我的问题以使其更清楚。
    • @AnwarFazza - 您的 Web 应用程序之前必须使用 socket.io 连接到您的服务器。
    • 确实如此,但是当我向 NodeJs 发送新数据时,Web 应用程序上的数据永远不会改变,即使它已连接。
    • @AnwarFazza - 好吧,您必须向我们展示将数据发送到客户端的服务器代码和接收数据的客户端代码,以便我们知道该代码有什么问题。无法评论我们看不到的代码。
    • @AnwarFazza - 用于向客户端发送数据的服务器端代码在哪里?
    【解决方案2】:

    您可以尝试以下简单的服务器:

    const io = require('socket.io')(8080);
    
    io.on('connection', socket => {
        console.log('client connected');
        socket.on('data', data => {
            io.emit('message', data);
        });
    });
    
    console.log('server started at port 8080');
    

    如果我正确理解了问题,它应该可以工作。
    也许在 html 客户端代码中 document.getElementById("news").innerHTML += message; 看看那里到底发生了什么?

    【讨论】:

    • 对我来说 io.emit('message', data); , 必须在 Net 套接字接收数据时的部分。确实它确实作为 io.emit 而不是 socket.emit 工作,因为我需要将它发送给所有客户端而不是每个套接字分开。
    【解决方案3】:

    socket2 表示您刚刚连接的客户端。因此,您可以存储这些连接以向它们发送数据(有助于广播)。

    如果您通过某种轮询机制从 Windows 服务获取数据,则在此步骤中您可以将此消息发送到您连接的客户端。因此,将您的连接保持在一个数组中,以便之后向每个客户端发送特定消息

    【讨论】:

    • 我现在将尝试这个概念,并将给您反馈。
    猜你喜欢
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    相关资源
    最近更新 更多