客户端连接并接收websocket数据但无法发送

时间:2017-05-30 14:04:20

标签: javascript node.js websocket network-programming

我在几个设备上运行这段代码没有问题。但是有一个设备出现了让我疯狂的问题。

客户端设备可以连接到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

更新:我解决了问题但是我不明白为什么所以我没有答案。我的程序如下:

  

devices [n]< --- socket [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:”)有一个尾随“:”但为什么这只影响一个设备对我来说是一个谜。 / p>

1 个答案:

答案 0 :(得分:0)

我认为问题出现是因为你使用了' ws'后端的模块和' socket-io'在前端。

我记得使用' ws'曾经,我使用原生的网络套接字,前端没有任何模块。就我用过的' socket-io'而言,我将它用于前端和后端。

你的代码相当复杂。我建议你注释掉所有。从简单的回声开始#39;服务器(乒乓),然后扩展功能。