2017-05-30 210 views
0

我有这段代码可以在多个设备上运行,而不会出现问题。但是有一种设备存在令我疯狂的问题。客户端连接并接收websocket数据但不能发送

客户端设备可以连接到WebSocket伺服器和接收数据,但是当我尝试将数据发送回,服务器不接收任何数据。结果是间歇性的,但大部分时间都没有反应;但是,我永远不会丢失与客户端设备的SSH连接。没有错误消息,我只看到我的客户端设备收到来自服务器的请求,然后发送数据,但服务器什么也没有显示。当我重新启动客户端程序时,我收到一个响应。

代码是死的简单:

Server: 
socket.emit('get settings',data); //client receives this! 
socket.on('load settings', function (data) { 
    console.log("load settings |",data.mac); //no response from client 
    device_socket.emit('loaded settings',data); 
}); 

Client: 
var relay = require('socket.io-client')("http://"+relay_server+":"+relay_port); 
relay.on('get settings', function (data) { 
    relay.emit('load settings', settings); //server never gets this! 
    console.log("sending settings"); //this is reached without error 
}); 

服务器代码:https://github.com/physiii/open-automation/blob/master/relay/socket.js

客户端代码:https://github.com/physiii/open-automation/blob/master/gateway/socket.js

更新:我解决了这个问题,但是我不明白为什么,所以我离开它无人接听。我的程序的工作原理如下:

设备[N] < ---插座[N] --->继电器< ---插座---> angular.js

如果你读上面的问题似乎很明显,问题出在设备和插座之间(记住只有一个设备有问题)。当我改变服务器端口时,我意识到设备工作。经过调查,我改变了angular.js连接到服务器(我使用location.host得到),并得到它的工作,但我不知道为什么它会导致上述行为:

一行更改为userinfo。 JS(不能发布,因为愚蠢的声誉点链接)

我改变了这个:

$rootScope.server_address = location.host; 
    var parts = $rootScope.server_address.split(":"); 
    $rootScope.server_ip = parts[0]; 
    $rootScope.port = parts[1]; 
    var relay_socket = io.connect("http://" + $rootScope.server_address + ":" + $rootScope.port); 

要这样:

$rootScope.server_address = location.host; 
    var parts = $rootScope.server_address.split(":"); 
    $rootScope.server_ip = parts[0]; 
    $rootScope.port = parts[1] || 80; 
    var relay_socket = io.connect("http://" + $rootScope.server_address + ":" + $rootScope.port); 

现在很明显,它需要的是昌编辑,因为当我没有指定一个端口io.connect(“domain.com:”)有一个尾随“:”但为什么这只影响到一个设备对我来说是一个谜。

+0

更新:当我将服务器端口从80更改为5000时,它工作。仍然不知道为什么或如何解决这个问题呢。我不明白为什么这是唯一有问题的设备,但必须是线索。 – physiii

+0

检查您的服务器使用的端口上的收发的防火墙规则。或者您可以尝试将消息名称'load settings'更改为另一个并再次测试。 – hoangdv

+0

我正在使用移动连接,因此无法访问端口:请参阅我的更新 – physiii

回答

0

我认为会出现问题,因为您在前端使用“WS”模块在后台和“插座-io的”。

记得使用“WS”一次,并且我用天然web的插座,而无需在前端的任何模块。就我所使用的'socket-io'而言,我用它作为前端和后端。

和你有相当复杂的代码存在。我可以建议评论一切。从简单的'echo'服务器(乒乓)开始,然后扩展功能。

+0

我正在使用'ws'模块进行其他操作。我使用'socket.io'来解决问题。在这里看到第258行:https:// github。com/physiii/open-automation/blob/master/relay/socket.js我会按照你的建议做一个简单的测试。奇怪的是,这是唯一一个有问题的设备,即使它是一个像其他设备一样的覆盆子pi 3。它通过移动连接运行,但其他连接也是如此。 – physiii

相关问题