【问题标题】:Opening TCP socket from Firefox plugin从 Firefox 插件打开 TCP 套接字
【发布时间】:2015-02-10 20:53:02
【问题描述】:

恐怕我无法从 Firefox 插件打开套接字。我的目标是让我的插件在端口上监听,Python 脚本会不时向它发送一个短字符串以执行操作。

我已经检查并且没有防火墙在运行,如果我在启动这个插件之前将 netcat 设置为监听我想要的端口,它的行为会有所不同(它会打印“打开的端口!”)。不幸的是,我真的想让插件成为监听器/服务器。

//TCPSocket API: https://developer.mozilla.org/en-US/docs/Web/API/TCPSocket
//Got me started: http://stackoverflow.com/q/28326301
const {Cu,Cc,Ci} = require("chrome");
var tcpSocket = Cc["@mozilla.org/tcp-socket;1"].createInstance(Ci.nsIDOMTCPSocket);
var socket = tcpSocket.open("127.0.0.1", 64515);
socket.ondata = function (event) {
    console.log('port received data!!!');
    if (typeof event.data === 'string') {
        console.log('Got: ' + event.data);
    }
}
socket.onopen = function() {console.log('opened port!');}
socket.onerror = function(event) {
    console.log('port error!');
    console.log(event.data)
}
socket.onclose = function() {console.log('port closed!');}
socket.ondrain = function() {console.log('port drained!');}

现在虽然直接输出是:

console.log: my-addon: port error!
console.log: my-addon: DOMError {}
console.log: my-addon: port closed!

其中“DOMError”是 socket.onerror 收到的错误。

我不确定这是否是我对套接字缺乏了解,或者在打开端口时是否与 Firefox 插件和权限有关。

【问题讨论】:

    标签: javascript sockets firefox plugins tcp


    【解决方案1】:

    我是你提到的问题的 OP (TcpSocket listen on Firefox addon),我终于用不同的方法解决了它:

    var port = 3000; //whatever is your port
    const {Cc, Ci} = require("chrome");
    var serverSocket = Cc["@mozilla.org/network/server-socket;1"].createInstance(Ci.nsIServerSocket);
    serverSocket.init(port, true, -1);
    var listener = {
        onSocketAccepted: function(socket, transport) {
            var input = transport.openInputStream(Ci.nsITransport.OPEN_BLOCKING,0,0);
            var output = transport.openOutputStream(Ci.nsITransport.OPEN_BLOCKING, 0, 0);
            var tm = Cc["@mozilla.org/thread-manager;1"].getService();
            input.asyncWait({
                onInputStreamReady: function(inp) {
                    try
                    {
                        var sin = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream);
                        sin.init(inp);
                        sin.available();
    
                        //Get request message
                        var request = '';
                        while (sin.available()) { request = request + sin.read(5120); }
                        var reqObj = { type: null, info: [] };
                        if(request != null && request.trim() != "") {
                            console.log(request);
                        }
                    }
                    catch(ex) { }           
                    finally
                    {
                        sin.close();
                        input.close();
                        output.close();
                    }
                }
            }, 0, 0, tm.mainThread);
        },
        onStopListening: function(socket, status) {
        }
    };
    serverSocket.asyncListen(listener);
    

    【讨论】:

    • 非常感谢 - 这太完美了!我也很高兴您为自己的目的找到了这个解决方案:)
    • 我很抱歉我不能给解决方案一个赞成票 - 我的帐户看起来太新了 - 但我确实接受了它作为正确答案。再次感谢您!
    • 这仅适用于 Firefox OS 还是浏览器? API 文档说它适用于 Firefox OS。
    猜你喜欢
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    相关资源
    最近更新 更多