Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firefox插件会在几秒钟后断开与Kodi的WebSocket连接_Javascript_Firefox_Websocket_Firefox Addon_Kodi - Fatal编程技术网

Javascript Firefox插件会在几秒钟后断开与Kodi的WebSocket连接

Javascript Firefox插件会在几秒钟后断开与Kodi的WebSocket连接,javascript,firefox,websocket,firefox-addon,kodi,Javascript,Firefox,Websocket,Firefox Addon,Kodi,我决定为Firefox开发一个插件来控制它,因为我找不到任何已经实现了我想要的一切的插件。我已选择使用与Kodi通信,以便接收事件,但在实现我的加载项的WebSocket部分时遇到问题。暂时,我创建了一个附加组件,其中包含一个用于测试WebSocket功能的。我的开发插件和临时测试插件都表现出以下行为: 如果我直接在插件之外的Firefox中加载test.html(请参阅文章底部的内容),WebSocket将按预期工作。当我播放或暂停Kodi时,连接保持打开并接收事件: 在加载项外部运行test

我决定为Firefox开发一个插件来控制它,因为我找不到任何已经实现了我想要的一切的插件。我已选择使用与Kodi通信,以便接收事件,但在实现我的加载项的WebSocket部分时遇到问题。暂时,我创建了一个附加组件,其中包含一个用于测试WebSocket功能的。我的开发插件和临时测试插件都表现出以下行为:

如果我直接在插件之外的Firefox中加载
test.html
(请参阅文章底部的内容),WebSocket将按预期工作。当我播放或暂停Kodi时,连接保持打开并接收事件:

在加载项外部运行test.html的控制台输出 但是,当使用
jpm run
从命令行运行附加组件时,情况并非如此。连接在几秒钟后关闭(最多四秒钟)。(请注意,在连接打开期间,我可以很好地接收事件):

使用jpm运行附加组件的控制台输出 我怎样才能找出为什么连接会掉在外接程序内部而不是外部?我怎样才能纠正这种奇怪的行为


index.js: test.html:

var ws=newwebsocket('ws://192.168.2.34:9090/jsonrpc');
ws.onopen=函数(事件){
试一试{
addon.port.emit('message','Connection opened');
}捕获(e){
console.log(“连接已打开”);
}
};
ws.onerror=函数(事件){
试一试{
addon.port.emit('message','Websocket错误:“+event.data”);
}捕获(e){
日志(“Websocket错误:+事件数据”);
}
};
ws.onmessage=函数(事件){
试一试{
addon.port.emit('message',JSON.parse(event.data));
}捕获(e){
log(JSON.parse(event.data));
}
};
ws.onclose=函数(事件){
试一试{
addon.port.emit('message','connectionclosed:“+event.code”);
}捕获(e){
日志(“连接关闭:+事件代码”);
}
};

我安装了Wireshark,发现在加载项内部运行时发送了Websocket ping请求,但在加载项外部运行时没有发送。Kodi无法用乒乓球响应ping,因此Firefox关闭了连接

有趣的是,插件中的延迟连接和后续连接似乎没有生成ping请求,因此不会关闭。因此,解决方案是在连接关闭时简单地延迟或重新打开连接(不管怎样,这对于处理网络连接丢失是很好的)

test.html

//connect()//生成ping请求
设置超时(连接,10000)//不生成ping请求
函数连接(){
this.ws=newwebsocket('ws://192.168.2.34:9090/jsonrpc');
this.ws.onopen=函数(事件){
试一试{
addon.port.emit('message','Connection opened');
}捕获(e){
console.log(“连接已打开”);
}
};
this.ws.onerror=函数(事件){
试一试{
addon.port.emit('message','Websocket错误:“+event.data”);
}捕获(e){
日志(“Websocket错误:+事件数据”);
}
};
this.ws.onmessage=函数(事件){
试一试{
addon.port.emit('message',JSON.parse(event.data));
}捕获(e){
log(JSON.parse(event.data));
}
};
this.ws.onclose=函数(事件){
试一试{
addon.port.emit('message','connectionclosed:“+event.code”);
}捕获(e){
日志(“连接关闭:+事件代码”);
}
setTimeout(connect,5000);//重新打开连接,不生成ping请求
};
}

如果您在ws://echo.websocket.org上进行测试会怎么样?我现在也开发了firefox插件,但看不到您的行为,所以可能与您连接的服务器有关。我已经解决了我的问题。请看我的答案。。。我相信这是Firefox和Kodi中的一个bug。Kodi应该用pong来响应Websocket ping,Firefox应该更符合它是否使用ping。如果其他人也这么认为,我会让他们提交一份bug报告,因为我不知道该怪谁,该怎么做。谢谢你的回复!
Connection opened test.html:12:9
Object { jsonrpc: "2.0", method: "Player.OnPlay", params: Object } test.html:28:9
Object { jsonrpc: "2.0", method: "Player.OnPause", params: Object } test.html:28:9
Object { jsonrpc: "2.0", method: "Player.OnPlay", params: Object } test.html:28:9
Object { jsonrpc: "2.0", method: "Player.OnPause", params: Object } test.html:28:9
Object { jsonrpc: "2.0", method: "Player.OnPlay", params: Object } test.html:28:9
Object { jsonrpc: "2.0", method: "Player.OnPause", params: Object } test.html:28:9
Object { jsonrpc: "2.0", method: "GUI.OnScreensaverActivated", params: Object } test.html:28:9
C:\Users\User\Desktop\example>jpm run
JPM [info] Starting jpm run on test
JPM [info] Creating a new profile
console.log: test: Connection opened
console.log: test: {"jsonrpc":"2.0","method":"Player.OnPlay","params":{"data":{"item":{"id":23,"type":"song"},"player":{"playerid":0,"speed":1}},"sender":"xbmc"}}
console.log: test: {"jsonrpc":"2.0","method":"Player.OnPause","params":{"data":{"item":{"id":23,"type":"song"},"player":{"playerid":0,"speed":0}},"sender":"xbmc"}}
console.log: test: Websocket error: undefined
console.log: test: Connection closed: 1006
var data = require("sdk/self").data;
var pageWorker = require("sdk/page-worker");

var pw = pageWorker.Page({
  contentURL: data.url('test.html')
});

pw.port.on('message', function(message) {
  console.log(message);
});
<!DOCTYPE html>
<html lang="en-US">
  <head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <script type=text/javascript>
    var ws = new WebSocket('ws://192.168.2.34:9090/jsonrpc');

    ws.onopen = function (event) {
      try {
        addon.port.emit('message', "Connection opened");
      } catch (e) {
        console.log("Connection opened");
      }
    };

    ws.onerror = function (event) {
      try {
        addon.port.emit('message', "Websocket error: "+event.data);
      } catch (e) {
        console.log("Websocket error: "+event.data);
      }
    };

    ws.onmessage = function (event) {
      try {
        addon.port.emit('message', JSON.parse(event.data));
      } catch (e) {
        console.log(JSON.parse(event.data));
      }
    };

    ws.onclose = function (event) {
      try {
        addon.port.emit('message', "Connection closed: "+event.code);
      } catch (e) {
        console.log("Connection closed: "+event.code);
      }
    };
    </script>
  </head>
  <body>
  </body>
</html>
<!DOCTYPE html>
<html lang="en-US">
  <head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <script type=text/javascript>

    //connect(); //generates a ping request
    setTimeout(connect, 10000); //doesn't generate a ping request
    
    function connect() {
      this.ws = new WebSocket('ws://192.168.2.34:9090/jsonrpc');

      this.ws.onopen = function (event) {
        try {
          addon.port.emit('message', "Connection opened");
        } catch (e) {
          console.log("Connection opened");
        }
      };
      
      this.ws.onerror = function (event) {
        try {
          addon.port.emit('message', "Websocket error: "+event.data);
        } catch (e) {
          console.log("Websocket error: "+event.data);
        }
      };
      
      this.ws.onmessage = function (event) {
        try {
          addon.port.emit('message', JSON.parse(event.data));
        } catch (e) {
          console.log(JSON.parse(event.data));
        }
      };
      
      this.ws.onclose = function (event) {
        try {
          addon.port.emit('message', "Connection closed: "+event.code);
        } catch (e) {
          console.log("Connection closed: "+event.code);
        }
        setTimeout(connect, 5000); //re-opens connection, doesn't generate a ping request
      };
    }
    </script>
  </head>
  <body>
  </body>
</html>