火狐插件中未看到java_在火狐插件中使用socket编程与java进行通信

之所以要写这篇博文,是因为我在平时使用selenium这个组件的时候,关于浏览器tab页管理这个问题让我极为头痛,而且一直也没得到很好的解决。selenium这个组件非常强大,但它的这个浏览器窗口管理机制让它在我心目中直接从100分扣到80。因为这个问题,我今天学习了一下在firefox addon中使用socket监听我的java请求,然后由我自己来调用firefox的tabs api进行tab页的管理。有兴趣的朋友可以看下!

首先要熟悉几个socket相关的核心xpcom组件

nsiServerSocket 开启一个Socket服务

nsiServerSocketListener Socket请求监听器,它有两个接口方法onSocketAccepted和onStopListening。其中,onSocketAccepted用来处理socket请求及响应。onStopListening这个应该是在这个监听器被销毁时执行一些代码,没有实际测试过。

nsiTransport 这个组件提供了一些用来访问一个socket请求中的输入输出流的相关api,一般用来在nsiServerSocketListener的onSocketAccepted方法中读取socket请求的内容及将自定义的socket响应通过输出流回写给请求客户端。

有了这几个组件,就可以开始编写一个以  firefox add-on为服务端,java为客户端的简单的socket通信实例,下面是有关这些组件的参考链接

https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIServerSocket

https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIServerSocketListener

https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsITransport

https://github.com/icsi-berkeley/fathom/blob/master/src/firefox/modules/ServerSocket.jsm  这个链接是github上一个叫fathom项目的一块源码,最初我不太理解nsiServerSocketListener这个组件,以为要像声明nsiServerSocket一样使用

Cc["@mozilla.org/network/server-socket;1"]

.createInstance(Ci.nsiServerSocketListener )  这种方式去声明它,结果报错了,这个源码里面有一个nsiServerSocketListener的使用实例。实际上就是json对象,只要实现onSocketAccepted和onStopListening方法就可以。

现在就可以在你的火狐add-on main.js里面先创建一个socket服务

const {Cu,Cc,Ci} = require("chrome");

var serverSocket = Cc["@mozilla.org/network/server-socket;1"]

.createInstance(Ci.nsIServerSocket);  //创建一个socket服务
serverSocket.init(9638,false,-1);  //监听9638端口

这时候运行 cfx run打开浏览器后,如果正常运行的话就能看到9638端口已经被firefox.exe占用

779560fea162c872a0fcadc19a9c9e26.png

接下来处理socket请求

const nsIServerSocket = Ci.nsIServerSocket;

const nsITransport = Ci.nsITransport;

const nsIScriptableInputStream = Ci.nsIScriptableInputStream;

//创建socket监听器

var listener = {

onSocketAccepted : function(socket, transport) {

//处理收到的数据

var input = transport.openInputStream(nsITransport.OPEN_BLOCKING,0,0);

var sin = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(nsIScriptableInputStream);

sin.init(input);

var resp = "";

do {

resp = sin.read(512);

} while (resp == "");

while (sin.available() > 0)

resp += sin.read(512);

console.log(resp);

},

onStopListening : function(socket, status){

}

}

21/212>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值