2015-11-07 97 views
0

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

这里是我的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,然后让其他客户端实时获取该数据。

这对我来说仍然有点新,所以任何帮助表示赞赏。

回答

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

第三关,请描述你试图用言语来完成,所以我们可以更好地了解,为了做到这一点,建议什么代码到底是什么。


编辑

现在你已经在这里描述的实际问题:

最终什么,我想有发生的是有一个客户端命中/:温度过高 和结束实时阅读,然后让其他客户端实时获取数据。

这是一个小更容易提出一个解决方案:

在服务器上:

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); 
}); 
+0

感谢您抽出宝贵的时间。我更新了一些清晰的内容并解释我正在尝试做什么。我想我正在接近这个错误,但期待您的反馈。 – cTwice

+0

@cTwice - 根据你试图解决的实际问题的描述,我在答案的最后添加了一个新的部分。 – jfriend00

+0

这就是我正在寻找的,感谢帮助。 – cTwice