2012-04-16 63 views
4

我需要連接到我的Firefox擴展中的遠程服務器(監聽端口9442)。我正在使用nsISocketTransportService,我的問題是如何收聽dataAvailable事件?我搜索mozilla文檔,但可以找到有用的東西。我的問題是,當我使用nsISocketTransportService.createTransport()連接到遠程服務器時,如何監聽數據?有沒有其他方式連接到遠程TCP服務器?如何使用Firefox擴展中的nsISocketTransportService連接到遠程服務器?

var socket = Components.classes["@mozilla.org/network/socket-transport-service;1"] 
          .getService(Components.interfaces.nsISocketTransportService) 
          .createTransport(null, 0, host, port, null); 

var poolOutputStream = socket.openOutputStream(0, 0, 0); 

var helloMessage = JSON.stringify({type: 'hello', clientID: currentClientID}); 
    poolOutputStream.write(helloMessage, helloMessage.length); 

var poolRawInputStream = socket.openInputStream(0, 0, 0); 
var poolInputStream = Components.classes ["@mozilla.org/scriptableinputstream;1"] 
         .createInstance(Components.interfaces.nsIScriptableInputStream) 
         .init(poolRawInputStream); 

回答

2

可以使用NetUtil module

Components.utils.import("resource://gre/modules/NetUtil.jsm"); 

NetUtil.asyncFetch(poolRawInputStream, function(stream, result) 
{ 
    if (!Components.isSuccessCode(result)) 
    { 
    // Error handling here 
    } 

    var data = NetUtil.readInputStreamToString(stream, inputStream.available()); 
    ... 
}); 

這種方法的缺點:NetUtil會首先讀取所有數據到內存中,你的回調將不會被調用,直到流被關閉。如果你想獲得的數據,因爲它涉及你將不得不直接使用nsIInputStreamPump

Components.utils.import("resource://gre/modules/NetUtil.jsm"); 

var pump = Components.classes["@mozilla.org/network/input-stream-pump;1"] 
        .createInstance(Components.interfaces.nsIInputStreamPump); 
pump.init(poolRawInputStream, -1, -1, 0, 0, true); 

var listener = { 
    onStartRequest: function(request, context) {}, 
    onDataAvailable: function(request, context, stream, offset, count) 
    { 
    var data = NetUtil.readInputStreamToString(stream, count); 
    ... 
    }, 
    onStopRequest: function(request, context, result) 
    { 
    if (!Components.isSuccessCode(result)) 
    { 
     // Error handling here 
    } 
    } 
}; 

pump.asyncRead(listener, null); 
+0

'nsIInputStreamPump'是正是我需要的,我會盡快測試你的代碼,並回來的結果。謝謝弗拉基米爾 – 2012-04-17 13:17:08