4

Firefox 拡張機能でリモート サーバー (ポート 9442 でリッスン) に接続する必要があります。私は使用していますが、私の問題はイベントnsISocketTransportServiceをリッスンする方法ですか? dataAvailablemozilla のドキュメントを検索しましたが、何か役に立つものを見つけることができました。私の質問は、を使用してリモートサーバーに接続するときにデータをリッスンするにはどうすればよいnsISocketTransportService.createTransport()ですか? リモート TCP サーバーに接続する他の方法はありますか?

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);
4

1 に答える 1

2

NetUtilモジュールを使用できます:

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);
于 2012-04-17T10:43:10.560 に答える