我有这段代码可以在多个设备上运行,而不会出现问题。但是有一种设备存在令我疯狂的问题。客户端连接并接收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:”)有一个尾随“:”但为什么这只影响到一个设备对我来说是一个谜。
更新:当我将服务器端口从80更改为5000时,它工作。仍然不知道为什么或如何解决这个问题呢。我不明白为什么这是唯一有问题的设备,但必须是线索。 – physiii
检查您的服务器使用的端口上的收发的防火墙规则。或者您可以尝试将消息名称'load settings'更改为另一个并再次测试。 – hoangdv
我正在使用移动连接,因此无法访问端口:请参阅我的更新 – physiii