结合使用Node.js网络套接字和套接字IO

问题描述 投票:0回答:3

我有一个Windows应用程序(基于C#作为Windows服务构建)将数据发送到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');   
});

PS:我是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
3个回答
1
投票

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

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


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连接等中获取数据,都是一样的...只是要发送的数据。


1
投票

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

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');

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

© www.soinside.com 2019 - 2024. All rights reserved.