4

我需要在我的 Firefox 扩展中连接到远程服务器(侦听端口 9442)。我正在使用nsISocketTransportService,我的问题是如何收听dataAvailable事件?我搜索了 mozilla 文档,但可以找到任何有用的东西。我的问题是当我使用连接到远程服务器时如何收听数据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 回答