我有一个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");
});
socket2表示刚刚连接的客户端。 因此,您可以存储这些连接以向其发送数据(有助于广播)。
如果您通过某种轮询机制从Windows服务中获取数据,则可以在此步骤中将此消息发送给已连接的客户端。 因此,将您的连接排列在一个数组中,以便以后每个客户端发送特定的消息
确切地说出您的要求有点困难。
如果您有一些要发送到所有连接的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连接等中获取数据,都是一样的...只是要发送的数据。
您可以尝试以下简单服务器:
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客户端代码中查看实际发生了什么?