我想在JavaScript的Firefox插件中打开套接字连接(传出,而不是在nsIServerSocket上侦听)。连接应该是TCP到指定端口上的localhost,并将用于与计算机上运行的另一个进程通信。
如何打开这样的客户端套接字?我在developer.mozilla.org上找到了nsISocketTransport等接口的API文档,但这仍然无法帮助我将各个部分组合在一起。它甚至没有提到套接字可以用于那里的TCP,所以我甚至不能100%确定这是我需要的接口。到目前为止,我所能找到的更多是关于nsIServerSocket。注意:我没有使用附加组件SDK,而是直接使用自举加载项。
答案 0 :(得分: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解决方案,所以如果你还没有,也可能值得考虑这个选项。它肯定比绕过原始套接字接口简单得多。
答案 1 :(得分:1)
虽然上面给出的答案对我原来的问题非常有用,但我认为也可能有兴趣发布我现在做的事情 - 我发现服务器没有建立原始连接但是想要HTTP请求。为此,一个非常好的信息来源是https://developer.mozilla.org/en-US/docs/Creating_Sandboxed_HTTP_Connections以及nsIHttpChannel
的API页面以及从那里链接的更多接口(nsIUploadChannel
,输入流等)。
特别是,这是我现在用来发出HTTP请求并得到答案的代码:
var ch = NetUtil.newChannel (HTTP_URL);
ch.QueryInterface (Components.interfaces.nsIHttpChannel);
// Here you can set HTTP request headers, like authorization.
var s = Components.classes["@mozilla.org/io/string-input-stream;1"]
.createInstance (Components.interfaces.nsIStringInputStream);
s.setData (DATA_FOR_SERVER, DATA_FOR_SERVER.length);
ch.QueryInterface (Components.interfaces.nsIUploadChannel);
// I have JSON data, otherwise change the MIME type.
ch.setUploadStream (s, "application/json", -1);
ch.requestMethod = "POST";
s = ch.open ();
var avail = s.available ();
if (avail === 0)
{
s.close ();
throw "Connecting failed.";
}
var string = NetUtil.readInputStreamToString (s, avail, null);
s.close ();
dump ("Response code: " + ch.responseStatus);
dump ("Response data: " + string);