在FireFox Addon中使用websocket立即断开连接

时间:2015-11-15 14:52:24

标签: javascript firefox websocket firefox-addon firefox-addon-sdk

我一直在研究与运行WebSocket服务器的本地应用程序交互的浏览器扩展。 Safari和Chrome扩展程序非常容易实现,在经历了一些令人头疼的FF开发之后,我想我可以像在其他浏览器中那样实现WebSockets。但是我遇到了一些问题。

据我所知,我无法在" main"中直接创建一个WebSocket。 js文件,因此尝试使用我在互联网上找到的解决方法:

https://github.com/canuckistani/Jetpack-Websocket-Example使用page-worker作为main和WebSocket代码之间的一种代理。当我实现这段代码时,我的WebSocket连接会立即错误地将{" isTrusted":true}作为唯一信息。

我还尝试使用隐藏框架,因为看起来这是1Password在其FF插件中处理websocket通信的方式,但这也会导致同样的即时错误。

当我在普通的FF实例中打开一个websocket连接到我的服务器时,它完全连接,但到目前为止,我还没有从插件中获得任何工作。

使用PageWorker:

var pw = pageWorker.Page({
    contentUrl: self.data.url('com.html'),
    contentScriptFile: self.data.url('com.js')
})

com.html:

<!DOCTYPE HTML>
<html>
<body>
</body>
</html>

com.js:

document.onready = launchCom();
// Could this need to be on ready?

function launchCom() {
    console.log("[com.js] launchCom Called");
    var wsAvailable = false;
    if ("WebSocket" in window) {
        console.log("[com.js] Detected Websocket in Window, attempting to open...");
        // WebSocket is supported.
        ws = new WebSocket('ws://localhost:9001');
        wsAvailable = true;
    } else {
        console.log("[com.js] Websocket is not supported, upgrade your browser!");
    }
}

ws.onmessage = function(event) {
  console.log(event.data);
}

ws.onopen = function(evt) {
    console.log("[com.js] ws opened. evt: " + evt);
}

ws.onerror = function(evt) {
    console.log("[com.js] ws error: " + JSON.stringify(evt));
}

运行此结果:

console.log: xxx: [com.js] launchCom Called
console.log: xxx: [com.js] Detected Websocket in Window, attempting to open...
console.log: xxx: [com.js] ws error: {"isTrusted":true}
console.log: xxx: [com.js] ws closed. evt: {"isTrusted":true}

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

我也陷入了类似的情况,因为websocket无法直接在main.js中实现。我也和你做的一样,可能是服务器拒绝连接。我的代码中的代码段如下所示:

main.js

var wsWorker = require('sdk/page-worker').Page({
  contentURL: "./firefoxScript/webSocket.html",
  contentScriptFile : ["./firefoxScript/webSocket.js"]
});

webSocket.html

<html>
<head>        
    <title></title>
</head>
<body>
</body>
</html>

webSocket.js

var ws = new WebSocket('ws://localhost:9451'); 
  ws.onopen = function() {
  console.log('Connection open...');
};

ws.onclose = function() {
  console.log('Connection closed...');
};

ws.onmessage = function(event) {
   console.log('Message recieved...');
};

ws.onerror = function(event) {
  console.log('Connection Error...');
};

这对我来说非常合适。

答案 1 :(得分:0)

我已经解决了这个问题:

我在我的OS X应用程序中使用https://github.com/zwopple/PocketSocket作为我的服务器,而PocketSocket和FF似乎存在问题。

更改PocketSocket的PSWebSocketDriver.m第87行代码后
[[headers[@"Connection"] lowercaseString] isEqualToString:@"upgrade"]

[[headers[@"Connection"] lowercaseString] containsString:@"upgrade"]

https://github.com/zwopple/PocketSocket/issues/34, 我能够使用原始代码从FF插件打开WebSocket连接,但是服务器在消息上出错了。

在about:config允许的消息中将network.websocket.extensions.permessage-deflate设置为false所以我添加了

 require("sdk/preferences/service").set("network.websocket.extensions.permessage-deflate", false);

到我的main.js并且正在工作!

对PocketSocket代码的微小改动对服务器与其他WebSocket客户端的交互没有任何影响。

相关问题