2013-06-27 90 views
3

我想在JavaScript中的Firefox附件中打開套接字連接(傳出,不在nsIServerSocket上偵聽)。連接應該是指定端口上的TCP到本地主機,並將用於與機器上運行的另一個進程進行通信。在Firefox插件中打開套接字連接

如何打開這樣的客戶端套接字?我在developer.mozilla.org上找到了像nsISocketTransport這樣的接口的API文檔,但這仍然不能幫助我將這些部分放在一起。它甚至沒有提到套​​接字可以用於TCP,所以我甚至不能100%確定這是我需要的接口。目前爲止我所能找到的更多關於nsIServerSocket的內容。注意:我沒有使用插件SDK,直接使用自舉插件。

回答

2

你在正確的軌道上。我在KeeFox中使用nsISocketTransport和nsISocketTransportService來啓用跨進程通信,但它是完成圖片的相關監聽器和回調接口。

這個文件應該包含一些有用的示例代碼:https://github.com/luckyrat/KeeFox/blob/master/Firefox%20addon/KeeFox/modules/session.js

它打開特定端口上安全的TCP連接,進行定期嘗試連接到服務器的端口和處理,從使用的出現的安全異常自簽名證書。

我用下面的界面,雖然你可能需要稍微不同的人根據具體情況:

QueryInterface: XPCOMUtils.generateQI([Ci.nsIBadCertListener2, 
             Ci.nsIInterfaceRequestor, 
             Ci.nsIStreamListener, 
             Ci.nsITransportEventSink, 
             Ci.nsIOutputStreamCallback]) 

一些在這些接口中定義的回調都包含延伸的基本會話對象原型到這第二個選項中應用該KeeFox使用特定的通信協議(JSON-RPC):

https://github.com/luckyrat/KeeFox/blob/master/Firefox%20addon/KeeFox/modules/json.js

https://github.com/luckyrat/KeeFox/blob/master/Firefox%20addon/KeeFox/modules/KF.js創建一些定時器,並啓動連接親在下面的代碼中放置,但你可能不需要仔細查看該文件。

this.KeePassRPC = new jsonrpcClient(); // defined in json.js and session.js 

// make the initial connection to KeePassRPC 
// (fails silently if KeePassRPC is not reachable) 
this.KeePassRPC.connect(); 

// start regular attempts to reconnect to KeePassRPC 
this.KeePassRPC.reconnectSoon(); 

出於興趣,您是否必須使用原始TCP連接?這是4年前我創建KeeFox時唯一的選擇,但我目前正在研究一個Web Socket解決方案,所以如果您還沒有,也可能需要考慮這個選項。這肯定比讓你的頭插入原始套接字接口簡單得多。

+0

感謝精心答案!你是對的,我不需要一個原始的套接字。我以爲我這樣做了,但同時我發現我的服務器想要的請求是作爲具有POST有效載荷數據的HTTP,所以現在我正在使用nsIHttpChannel。 –

+0

但是,我以後可能想要使用的另一個服務器組件確實需要原始套接字連接,因此無論如何我都需要使用該套件。有沒有辦法使用非HTTP連接的通用nsIChannel(或如此)? –

+0

是的,它非常相似,但你不需要擔心證書。 session.js中的第101行是註釋掉的版本,可以與非安全連接一起使用:var transport = transportService.createTransport(null,0,this.address,this.port,null); – Luckyrat

1

雖然上面給出的答案對我的原始問題非常有用,但我認爲也可以發佈我現在所做的 - 我發現服務器不需要原始連接,而是需要HTTP要求。爲此,一個非常好的信息來源是https://developer.mozilla.org/en-US/docs/Creating_Sandboxed_HTTP_Connections以及nsIHttpChannel的API頁面以及一些從那裏連接的更多接口(nsIUploadChannel,輸入流等)。

特別,這是代碼我現在使用,使HTTP請求並接收其回答:

相關問題