也来玩转Skype ——基于Skype4Java API编写Skype外壳程序入门介绍
2008-04-04 18:48
776 查看
Skype4Java API开发包官方下载地址:
https://developer.skype.com/wiki/Java_API
在这篇文章中使用到了其中一个例子以及改进后的例子下载地址为:
Skype4Java开发文档以及示例代码
http://download.csdn.net/down/236693/lin_bei
Ø Skype4Java架构 Skype4Java提供了一个较为完善的开发体系,使您可以非常容易地使用Java开发Skype外壳程序。Skype插件程序与Skype的通信都是基于一些文本命令来完成。 因此,要想开发Skype的插件应用,就需要依靠不同操作系统平台的系统调用,发送Skype平台的相应命令来实现。 Skype4Java在最底层,也是通过操作系统的系统调用来完成消息的发送。针对异构平台,Skype4Java提供了不同平台的底层实现,而Skype4Java的使用者不用管具体的操作系统平台。因为抽象父类Connector类的静态方法getInstance()具体判断当前操作系统是什么平台,采用简单的工厂模式,返回相应平台的子类对象,如OSXConnector.,LinuxConnector, WindowsConnector, Win32Connector等,这些都是Connector类的子类。Connector及其子类即实现了一些系统调用的方法,其中被重载的一系列execute()方法最终调用不同子类的sendCommand (String command)方法来实现了不同平台的消息发送。 而对于一些数据的接收和处理全局都是采用事件监听的机制(观察者模式),用于完成数据的接收,处理机制的调用,错误的处理等Skype平台利用错误消息机制提供了出错的处理。因此,在我们的错误处理中,只需分析错误消息的内容,然后通过观察者调用相应的处理机制即可。 Skype4Java的实现是按照分层的方法来设计的,分层架构图如下所示。
Ø Skype4Java命令发送示例Skype提供了几种形式的开发接口给不同的语言,但有一个共同点就是,都是通过相同的命令(命令由命令标识符来标识,主要是在确认一个详细的请求命令以及响应消息时用的,每个命令及响应的消息ID是一样的,而且是唯一的),通过这样的方式来操作Skype。对于Skype4Java来说,命令的发送都是通过执行SKYPE4Java的抽象连接层(详细说明见后面),其中有一个核心类Connector的核心方法,原型为protected final String execute(final String command, final String[] responseHeaders, final boolean checkAttached),这个方法体里包含了保证与SKYPE处于连接状态,如果没连接会连接上,并且激发各种事件以及注册对这事件感兴趣的监听器。public abstract class Connector {……protected final String execute(final String command, final String[] responseHeaders, final boolean checkAttached) throws ConnectorException { System.out.println("...准备执行命令...");//先检验这次需要发送的命令,保证不为空 ConnectorUtils.checkNotNull("command", command); ConnectorUtils.checkNotNull("responseHeaders", responseHeaders); //输出这次需要发送的命令的有关内容 System.out.println("command: ->"+command); if (checkAttached){//在发送之前得先保证客户端与Skype Client处于连接状态 assureAttached(); } //共享锁,因为这是一种请求-响应式的交互,正在执行此命令时要锁住程序专门//处理这个命令的发送 final Object lock = new Object(); //命令的响应 final String[] response = new String[1]; //连接监听器的定义 ConnectorListener listener = new AbstractConnectorListener() { //当命令发送后(下面的)完释放锁,客户程序将可以处理接收到的命令响应消//息,查看此命令的执行结果:System.out.println("response: <-"+message); public void messageReceived(ConnectorMessageEvent event) { String message = event.getMessage(); System.out.println("response: <-"+message); for (String responseHeader : responseHeaders) { if (message.startsWith(responseHeader)) { response[0]=message; synchronized (lock) { lock.notify(); } return; } } } };//把上面定义的连接监听器注册到Connector addConnectorListener(listener, false);//每次需要执行一个客户端命令时,都会调用fireMessageSent来激发所有注册进来//的监听器 fireMessageSent(command);//发送命令的过程将会获得共享锁 synchronized (lock) { try {//调用不同子类的sendCommand方法来实现不同平台的消息发送. sendCommand(command); //获取发送命令时的当前时间 long start = System.currentTimeMillis();//获取命令发送超时的时间 long commandResponseTime = getCommandTimeout();//让共享锁锁住这个超时的时间那么长lock.wait(commandResponseTime);//判断是否超时 if (commandResponseTime <= System.currentTimeMillis() - start) { setStatus(Status.NOT_RUNNING); throw new TimeOutException("The '" + command + "' command failed by timeout."); } } catch (InterruptedException e) { throw new ConnectorException("The '" + command + "' command was interrupted."); } finally { //移除监听器 removeConnectorListener(listener); } } return response[0];}……} SkypeCommandTest是一个Eclipse下的工程,解压后,直接导入到Eclipse中运行com.skype.test包中的ShowVersion.java类就可以看到命令的发送以及响应,结果为: /******************************************************************************* * Copyright (c) 2006 Koji Hisano - UBION Inc. Developer * Copyright (c) 2006 UBION Inc. All rights reserved. * * Copyright (c) 2006 Skype Technologies S.A. * * This program and the accompanying materials are made available under the * terms of the Common Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/cpl-v10.html * * Contributors: Koji Hisano - initial API and implementation ******************************************************************************/package com.skype.test; import com.skype.Skype; public class ShowVersion { public static void main(String[] args) throws Exception { System.out.println(Skype.getVersion()); }} 代码中的关键语句是Skype.getVersion()。在这个方法中,首先是发送了”GET SKYPEVERSION”命令,此时并没有连接上Skype。再次发送”NAME SkypeAPI4Java”告知本应用程序的名字,最后发送”PROTOCOL 9999”来获取Skype协议版本,Skype返回版本号,比如:SKYPEVERSION 3.2.4.117 Ø Skype4Java AP2AP示例如果您需要利用Skype4J***A开发AP2AP应用时,只需要通过Application对象创建某一个特定名称的应用,然后连接到也创建了此应用的联系人,连接时会返回一个Stream对象,此对象可用于发送基于TCP和UDP的文本消息格式,然后通过注册的监听器处理返回消息(此监听器即是应用程序相关的,如您的网络游戏客户端),这样,就实现了通过Skype网络体系的AP2AP应用。下面通过例子简单介绍一下AP2AP的流程。这段程序向所有的在使用同一Application的联系人发送一条文本消息:"*******HelloWorld!********"。 并将对方利用Stream传递回来的文本消息打印到控制台。 package com.tom.test;
import com.skype.Application;import com.skype.ApplicationAdapter;import com.skype.Skype;import com.skype.SkypeException;import com.skype.Stream;import com.skype.StreamAdapter; public class AP2APTest { public static void main(String[] args) throws Exception { Skype.setDebug(true); Skype.setDeamon(false); //创建特名字的Application,并注册入Skype实例中 Application application = Skype.addApplication(AP2APTest.class.getName()); //添加应用监听器,当有相同的应用进行连接时,进行相应的处理 application.addApplicationListener(new ApplicationAdapter() { //当有相同的应用与此应用连接时,此方法将被调用 public void connected(Stream stream) throws SkypeException { System.out.println("connected:" + stream.getId()); //添加Stream的监听器,完成对接收到的Stream里面的数据的处理,当然,用户可以根据需要添加方法, //但需要改写Connector里面的相应代码 stream.addStreamListener(new StreamAdapter() { @Override //此方法完成对于对方传送数据的处理,也是基于SKYPE开发应用的入口点之一 public void textReceived(String receivedText) throws SkypeException { System.out.println("received:" + Integer.toHexString(receivedText.length())+receivedText); } }); } }); //完成向所有联系人的请求连接,此方法返回Stream数组 Stream[] streams=application.connectToAll(); //向每一个注册了相同应用的SKYPE实例发送文本消息,也是基于SKYPE开发应用的入口点之一 for(Stream stream: streams) { if(stream != null) { stream.write("*******HelloWorld!********"); } } }} 首先,利用了Application的connectToAll()方法连接所有的联系人,其中发送给Skype的文本消息如下:ALTER APPLICATION CONNECT 标识本application名称,比如:”ap2aptest” 标识待连接好友的Skype id connectToAll()方法将会返回一个Stream数组,对应每一个friendid ,都有一个唯一标识的Stream来维持通信,Stream用来完成数据的传送,利用Stream的write(String text)方法即可向联系人发送一个文本消息。为了处理从Stream发过来的消息,我们在Stream上注册了一个监听器:stream.addStreamListener(new StreamAdapter() { @Override public void textReceived(String receivedText) throws SkypeException { System.out.println("received:" + receivedText); } }); 一旦用户接收到来自于Stream的消息,即通过textReceived(String receivedText)方法来处理。当您需要开发自己的应用时,完全可以向StreamAdapter中添加方法,然后做相应用的处理。因此在互为联系人的Skype用户两端运行这个程序,就完成了消息的发送和接收。
https://developer.skype.com/wiki/Java_API
在这篇文章中使用到了其中一个例子以及改进后的例子下载地址为:
Skype4Java开发文档以及示例代码
http://download.csdn.net/down/236693/lin_bei
Ø Skype4Java架构 Skype4Java提供了一个较为完善的开发体系,使您可以非常容易地使用Java开发Skype外壳程序。Skype插件程序与Skype的通信都是基于一些文本命令来完成。 因此,要想开发Skype的插件应用,就需要依靠不同操作系统平台的系统调用,发送Skype平台的相应命令来实现。 Skype4Java在最底层,也是通过操作系统的系统调用来完成消息的发送。针对异构平台,Skype4Java提供了不同平台的底层实现,而Skype4Java的使用者不用管具体的操作系统平台。因为抽象父类Connector类的静态方法getInstance()具体判断当前操作系统是什么平台,采用简单的工厂模式,返回相应平台的子类对象,如OSXConnector.,LinuxConnector, WindowsConnector, Win32Connector等,这些都是Connector类的子类。Connector及其子类即实现了一些系统调用的方法,其中被重载的一系列execute()方法最终调用不同子类的sendCommand (String command)方法来实现了不同平台的消息发送。 而对于一些数据的接收和处理全局都是采用事件监听的机制(观察者模式),用于完成数据的接收,处理机制的调用,错误的处理等Skype平台利用错误消息机制提供了出错的处理。因此,在我们的错误处理中,只需分析错误消息的内容,然后通过观察者调用相应的处理机制即可。 Skype4Java的实现是按照分层的方法来设计的,分层架构图如下所示。
Ø Skype4Java命令发送示例Skype提供了几种形式的开发接口给不同的语言,但有一个共同点就是,都是通过相同的命令(命令由命令标识符来标识,主要是在确认一个详细的请求命令以及响应消息时用的,每个命令及响应的消息ID是一样的,而且是唯一的),通过这样的方式来操作Skype。对于Skype4Java来说,命令的发送都是通过执行SKYPE4Java的抽象连接层(详细说明见后面),其中有一个核心类Connector的核心方法,原型为protected final String execute(final String command, final String[] responseHeaders, final boolean checkAttached),这个方法体里包含了保证与SKYPE处于连接状态,如果没连接会连接上,并且激发各种事件以及注册对这事件感兴趣的监听器。public abstract class Connector {……protected final String execute(final String command, final String[] responseHeaders, final boolean checkAttached) throws ConnectorException { System.out.println("...准备执行命令...");//先检验这次需要发送的命令,保证不为空 ConnectorUtils.checkNotNull("command", command); ConnectorUtils.checkNotNull("responseHeaders", responseHeaders); //输出这次需要发送的命令的有关内容 System.out.println("command: ->"+command); if (checkAttached){//在发送之前得先保证客户端与Skype Client处于连接状态 assureAttached(); } //共享锁,因为这是一种请求-响应式的交互,正在执行此命令时要锁住程序专门//处理这个命令的发送 final Object lock = new Object(); //命令的响应 final String[] response = new String[1]; //连接监听器的定义 ConnectorListener listener = new AbstractConnectorListener() { //当命令发送后(下面的)完释放锁,客户程序将可以处理接收到的命令响应消//息,查看此命令的执行结果:System.out.println("response: <-"+message); public void messageReceived(ConnectorMessageEvent event) { String message = event.getMessage(); System.out.println("response: <-"+message); for (String responseHeader : responseHeaders) { if (message.startsWith(responseHeader)) { response[0]=message; synchronized (lock) { lock.notify(); } return; } } } };//把上面定义的连接监听器注册到Connector addConnectorListener(listener, false);//每次需要执行一个客户端命令时,都会调用fireMessageSent来激发所有注册进来//的监听器 fireMessageSent(command);//发送命令的过程将会获得共享锁 synchronized (lock) { try {//调用不同子类的sendCommand方法来实现不同平台的消息发送. sendCommand(command); //获取发送命令时的当前时间 long start = System.currentTimeMillis();//获取命令发送超时的时间 long commandResponseTime = getCommandTimeout();//让共享锁锁住这个超时的时间那么长lock.wait(commandResponseTime);//判断是否超时 if (commandResponseTime <= System.currentTimeMillis() - start) { setStatus(Status.NOT_RUNNING); throw new TimeOutException("The '" + command + "' command failed by timeout."); } } catch (InterruptedException e) { throw new ConnectorException("The '" + command + "' command was interrupted."); } finally { //移除监听器 removeConnectorListener(listener); } } return response[0];}……} SkypeCommandTest是一个Eclipse下的工程,解压后,直接导入到Eclipse中运行com.skype.test包中的ShowVersion.java类就可以看到命令的发送以及响应,结果为: /******************************************************************************* * Copyright (c) 2006 Koji Hisano - UBION Inc. Developer * Copyright (c) 2006 UBION Inc. All rights reserved. * * Copyright (c) 2006 Skype Technologies S.A. * * This program and the accompanying materials are made available under the * terms of the Common Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/cpl-v10.html * * Contributors: Koji Hisano - initial API and implementation ******************************************************************************/package com.skype.test; import com.skype.Skype; public class ShowVersion { public static void main(String[] args) throws Exception { System.out.println(Skype.getVersion()); }} 代码中的关键语句是Skype.getVersion()。在这个方法中,首先是发送了”GET SKYPEVERSION”命令,此时并没有连接上Skype。再次发送”NAME SkypeAPI4Java”告知本应用程序的名字,最后发送”PROTOCOL 9999”来获取Skype协议版本,Skype返回版本号,比如:SKYPEVERSION 3.2.4.117 Ø Skype4Java AP2AP示例如果您需要利用Skype4J***A开发AP2AP应用时,只需要通过Application对象创建某一个特定名称的应用,然后连接到也创建了此应用的联系人,连接时会返回一个Stream对象,此对象可用于发送基于TCP和UDP的文本消息格式,然后通过注册的监听器处理返回消息(此监听器即是应用程序相关的,如您的网络游戏客户端),这样,就实现了通过Skype网络体系的AP2AP应用。下面通过例子简单介绍一下AP2AP的流程。这段程序向所有的在使用同一Application的联系人发送一条文本消息:"*******HelloWorld!********"。 并将对方利用Stream传递回来的文本消息打印到控制台。 package com.tom.test;
import com.skype.Application;import com.skype.ApplicationAdapter;import com.skype.Skype;import com.skype.SkypeException;import com.skype.Stream;import com.skype.StreamAdapter; public class AP2APTest { public static void main(String[] args) throws Exception { Skype.setDebug(true); Skype.setDeamon(false); //创建特名字的Application,并注册入Skype实例中 Application application = Skype.addApplication(AP2APTest.class.getName()); //添加应用监听器,当有相同的应用进行连接时,进行相应的处理 application.addApplicationListener(new ApplicationAdapter() { //当有相同的应用与此应用连接时,此方法将被调用 public void connected(Stream stream) throws SkypeException { System.out.println("connected:" + stream.getId()); //添加Stream的监听器,完成对接收到的Stream里面的数据的处理,当然,用户可以根据需要添加方法, //但需要改写Connector里面的相应代码 stream.addStreamListener(new StreamAdapter() { @Override //此方法完成对于对方传送数据的处理,也是基于SKYPE开发应用的入口点之一 public void textReceived(String receivedText) throws SkypeException { System.out.println("received:" + Integer.toHexString(receivedText.length())+receivedText); } }); } }); //完成向所有联系人的请求连接,此方法返回Stream数组 Stream[] streams=application.connectToAll(); //向每一个注册了相同应用的SKYPE实例发送文本消息,也是基于SKYPE开发应用的入口点之一 for(Stream stream: streams) { if(stream != null) { stream.write("*******HelloWorld!********"); } } }} 首先,利用了Application的connectToAll()方法连接所有的联系人,其中发送给Skype的文本消息如下:ALTER APPLICATION CONNECT 标识本application名称,比如:”ap2aptest” 标识待连接好友的Skype id connectToAll()方法将会返回一个Stream数组,对应每一个friendid ,都有一个唯一标识的Stream来维持通信,Stream用来完成数据的传送,利用Stream的write(String text)方法即可向联系人发送一个文本消息。为了处理从Stream发过来的消息,我们在Stream上注册了一个监听器:stream.addStreamListener(new StreamAdapter() { @Override public void textReceived(String receivedText) throws SkypeException { System.out.println("received:" + receivedText); } }); 一旦用户接收到来自于Stream的消息,即通过textReceived(String receivedText)方法来处理。当您需要开发自己的应用时,完全可以向StreamAdapter中添加方法,然后做相应用的处理。因此在互为联系人的Skype用户两端运行这个程序,就完成了消息的发送和接收。
相关文章推荐
- 也来玩转Skype ——基于Skype4Java API编写Skype外壳程序入门介绍
- 你也可以玩转Skype -- 基于Skype API开发外壳程序入门
- 也来玩转Skype ——基于Skype4Com API编写Skype外壳程序
- 也来玩转Skype ——基于Skype4Com API编写Skype外壳程序
- 也来玩转Skype ——基于Skype4Com API编写Skype外壳程序
- 你也可以玩转Skype -- 基于Skype API开发外壳程序入门
- 几个DSP高手的经验介绍,编写基于DSP程序的注意事项
- Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】
- mahout入门之编写第一个基于用户的推荐程序
- 几个DSP高手的经验介绍,编写基于DSP程序的注意事项
- 凡哥带你玩转OpenCV小班精品课第一期_OpenCV基础入门+跳一跳小程序项目实战 课程介绍
- ZZ]几个DSP高手的经验介绍,编写基于DSP程序的注意事项[转帖]
- Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】
- Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】
- Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】
- Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】
- 也来玩转Skype ——基于Skype4Com API编写Skype外壳程序
- Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】
- 基于Skype API开发外壳程序入门
- CSharp make plugin(Addin) program C# 编写基于插件的程序