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

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

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

  1. nsiServerSocket 开启一个Socket服务
  2. nsiServerSocketListener Socket请求监听器,它有两个接口方法onSocketAcceptedonStopListening。其中,onSocketAccepted用来处理socket请求及响应。onStopListening这个应该是在这个监听器被销毁时执行一些代码,没有实际测试过。
  3. nsiTransport 这个组件提供了一些用来访问一个socket请求中的输入输出流的相关api,一般用来在nsiServerSocketListener的onSocketAccepted方法中读取socket请求的内容及将自定义的socket响应通过输出流回写给请求客户端。

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

现在就可以在你的火狐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占用

接下来处理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){
  }
}

启动这个监听器

serverSocket.asyncListen(listener);

再写一个java来测试,代码很简单,就新建一个socket请求然后发送一个字符串

    try {
			Socket socket = new Socket("localhost", 9638);
			OutputStream outputStream = socket.getOutputStream();
			outputStream.write("dfasdfad".getBytes());
			outputStream.close();
			socket.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

最后运行java程序之后,在火狐add-on sdk控制台里面就可以看到

到这里一个简单的ff addon socket程序就写好了,后面可以根据具体的需求做些其它的事情,比如说发送一个字符串 "open_new_tab"然后再带一个url地址给这个add-on,它就会打开一个新的tab页并加载给定的url.

由于小学语文没学好,所以上面的例子各位新人朋友看的可能比较晕,所以最好是先去学习一下最基本的firefox-addon开发再来看这篇文章,不然cfx run是个啥意思都不知道的话看的很困难的

下面是源代码地址:http://yunpan.cn/cQ6scfDD4qSdq (提取码:d400)

时间: 2024-10-12 13:34:18

在火狐插件中使用socket编程与java进行通信的相关文章

读懂Java中的Socket编程(转)

Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的Socket编程,并且如何写一个客户端/服务器程序. 餐前甜点 Unix的输入输出(IO)系统遵循Open-Read-Write-Close这样的操作范本.当一个用户进程进行IO操作之前,它需要调用Open来指定并获取待操作文件或设备读取或写入的权限.一旦IO操作对象被打开,那么这个用户进程可以对这个

QT中的SOCKET编程(QT-2.3.2)

转自:http://mylovejsj.blog.163.com/blog/static/38673975200892010842865/ QT中的SOCKET编程 2008-10-07 23:13 http://hi.baidu.com/landuochong/blog/item/08268100cf5b6783e950cda9.html 操作系统:ARM-LinuxQT版本:QT-2.3.2-FOR-LINUXGUI:Qtopia 在LINUX 下进行网络编程,我们可以使用LINUX提供的统

读懂Java中的Socket编程

Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的Socket编程,并且如何写一个客户端/服务器程序. 餐前甜点 Unix的输入输出(IO)系统遵循Open-Read-Write-Close这样的操作范本.当一个用户进程进行IO操作之前,它需要调用Open来指定并获取待操作文件或设备读取或写入的权限.一旦IO操作对象被打开,那么这个用户进程可以对这个

java中的socket编程

Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的Socket编程,并且如何写一个客户端/服务器程序. Unix的输入输出(IO)系统遵循Open-Read-Write-Close这样的操作范本.当一个用户进程进行IO操作之前,它需要调用Open来指定并获取待操作文件或设备读取或写入的权限.一旦IO操作对象被打开,那么这个用户进程可以对这个对象进行一

【Socket编程】Java通信是这样炼成的

简介 网络无处不在,移动互联时代也早已到来,单机版程序慢慢的已没有生命力,所有的程序都要能够访问网络,比如 QQ 网络聊天程序.迅雷下载程序等,这些程序都要同网络打交道,本次将与各位小伙伴们分享的就是 Java 中的网络编程—— Socket 通信. 网络基础知识 两台计算机要通过网络进行通信,必须具备如图所示的条件: a.唯一的标识(IP地址): b.需要共同的语言(协议): c.辨别不同应用程序(端口号). 其中的重要概念如下: 1.IP地址 每台计算机的唯一标识,用来区分网络中的不同主机,

python进阶---Python中的socket编程(一)

初识socket编程 一.前言 socket基于C\S架构(客户端\服务端)的编程模型,在Python中是以socket模块存在的. Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议. 所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规

python中的socket编程

#################socket###################### socket编程 Socket 是网络编程的一个抽象概念.通常我们用一个 Socket 表示"打开了一个网络链接",而打开一个 Socket 需要知道目标计算机的 IP地址和端口号,再指定协议类型即可. 服务端操作: import time import socket s=socket.socket() s.bind(('127.0.0.1',8888)) s.listen(5) print '

【Socket编程】Java中网络相关API的应用

Java中网络相关API的应用 一.InetAddress类 InetAddress类用于标识网络上的硬件资源,表示互联网协议(IP)地址. InetAddress类没有构造方法,所以不能直接new出一个对象: InetAddress类可以通过InetAddress类的静态方法获得InetAddress的对象: 1 InetAddress.getLocalHost();//获取本地对象 2 InetAddress.getByName("");//获取指定名称对象 主要方法使用: 1 /

NDK Socket编程:面向连接的通信(tcp)

使用posix socket api,java层调用c层. AndroidManifest.xml: <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.apress.echo" android:versionCode="1" android:versionName="1.0" > <uses-sd