发射后无法连接到插座

时间:2015-11-07 00:09:55

标签: node.js socket.io

我正在处理涉及实时温度的项目,并且设备通过get发送temp,通过服务器路由并发送到套接字。然后我希望服务器连接到原始套接字并将数据发送到我的客户端正在读取的新数据库。

这是我的app.js

    var express = require('express'),
    app = express(),
    server = require('http').createServer(app),
    io = require('socket.io').listen(server);

server.listen(8080);

app.get('/', function (req, res) {
  res.sendFile(__dirname + '/index.html');
});


app.route('/:temp')
   .get(function (req, res){
        var temp = req.params.temp;
        res.end(temp);
        io.sockets.on('connection', function(socket){
            socket.emit('send temp', temp);
        });
    });

io.sockets.on('connection', function(socket){
    socket.on('send temp', function(data){
        console.log('connected to send temp');//this never shows in the console
        io.sockets.emit('new temp', data);
    });
});

app.js中的路线代码运行正常。当我点击localhost:3000 / test并更改客户端以连接到'send temp'(而不是'new temp')'test'被输出。

以下是我的客户的相关部分

var socket = io.connect();
        var $temp = $('#temp');         


        socket.on('new temp', function(data){
            $temp.html("Temp: " + "<br/>"+data);
        });

我正在运行节点版本4.1.2,套接字1.3.7和表达4.10.8。 我想知道为什么我第二次无法连接到原始套接字。或者甚至可能不是我的问题。我研究了许多“聊天”教程,并试图按照我想要的方式搜索其他人而没有任何成功。

最终我想要发生的事情是让客户端点击/:temp一遍又一遍地实时读取,然后让其他客户端实时获取这些数据。

这对我来说仍然有点新鲜,所以感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您的代码示例在服务器上为'send temp'消息注册了一个消息处理程序。客户端为'new temp'消息注册消息处理程序。

然后两个人(客户端和服务器)陷入僵局,等待某人先发送消息,但(根据您已披露的代码)没有人会这样做。

我真的不明白你的代码意图是什么,但我看到了几个问题。

首先,您不希望在此代码中为connection事件安装侦听器:

app.route('/:temp')
   .get(function (req, res){
        var temp = req.params.temp;
        res.end(temp);
        io.sockets.on('connection', function(socket){
            socket.emit('send temp', temp);
        });
    });

为什么在获得特定路由处理程序时才开始侦听连接事件。而且,为什么每次遇到该路线时都要添加另一个事件处理程序。这段代码完全错了。我不知道你认为你想用它做什么,但这不是做事的方式。

第二个关闭,此代码正在等待客户端发送'send temp'消息,当它获得一个消息时,它会尝试将该消息广播给所有客户端。但是,您披露的客户端部分从不发送'send temp'消息。

io.sockets.on('connection', function(socket){
    socket.on('send temp', function(data){
        console.log('connected to send temp');//this never shows in the console
        io.sockets.emit('new temp', data);
    });
});

第三关,请准确描述您尝试用文字完成的内容,以便我们可以更好地了解要推荐的代码。

修改

现在您已经在这里描述了实际问题:

  

最终我想要发生的是客户端命中/:temp   一遍又一遍地实时阅读,然后让其他客户得到   这些数据是实时的。

推荐解决方案要容易一些:

在服务器上:

var express = require('express'),
    app = express(),
    server = require('http').createServer(app),
    io = require('socket.io').listen(server);

server.listen(8080);

app.get('/', function (req, res) {
  res.sendFile(__dirname + '/index.html');
});


app.get('/:temp', function (req, res) {
     var temp = req.params.temp;
     res.end(temp);
     // send this temperature to all connected clients
     io.emit('new temp', temp);
});

在客户端:

var socket = io.connect();
var $temp = $('#temp');         
socket.on('new temp', function(data){
    $temp.html("Temp: " + "<br/>"+data);
});