结合Nodejs Net套接字和Socket IO

时间:2018-01-15 14:43:53

标签: node.js socket.io

我有一个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');   
});

P.S:我是nodejs&amp;的新手。 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");

        });

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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连接等等,它都是相同的......这只是你想要发送的数据。

答案 2 :(得分: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');

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