2015-02-10 97 views
4

恐怕我無法從Firefox插件打開套接字。我的目標是讓我的插件在端口上進行偵聽,並且Python腳本會稍後發送一個簡短的字符串來執行操作。從Firefox插件打開TCP套接字

我已經確認並沒有防火牆正在運行,如果我設置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插件和權限有關的特殊功能。

回答

6

我是你提到的問題(TcpSocket listen on Firefox addon)的OP,我終於得到它用不同的方式工作:

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); 
+0

太謝謝你了 - 這是完美的!我也很高興你爲你自己的目的找到了這個解決方案:) – JKuin 2015-02-10 21:16:40

+0

我道歉我不能給解決方案一個贊成 - 我的帳戶太新了,看起來像 - 但我確實接受它作爲一個正確的答案。再次謝謝你! – JKuin 2015-02-10 21:17:14

+0

@JKuin - 沒問題,我希望你能達到你想要的...... – LcSalazar 2015-02-11 14:50:05