现在的即时通讯软件琳琅满目大家耳熟能详的无非就是腾讯公司的QQ微软公司的MSN Messenger以及网易的泡泡就用户量而言这三者应该是名列前茅的但是腾讯公司的QQ以及网易的泡泡由于并没有公开其客户端与服务器之间的通讯协议导致开发者很难利用起这一庞大的用户群体来开辟另外的服务渠道
MSN Messenger这一由世界头号软件商微软公司开发的即时通讯软件凭借其与windows操作系统和整个微软产品家族的紧密结合简单实用性能稳定世界通用等特点很快被中国用户接受目前其用户正在以几何数字增长但是让开发者雀跃的是该软件同时也提供了开放的API以及开放的通讯协议
着名的MSN Plus就是一款利用其API开发的用于扩展MSN Messenger功能的插件而我们今天要介绍的jMSN则是封装了MSN Messenger开放的通讯协议的Java API通过这个API开发者完全可以使用Java语言模拟出MSN Messenger软件API的作者也提供一个用Java语言编写的在某方面功能甚至比MSN Messenger还强大的MSN 客户端软件由于采用了跨平台的Java语言开发因此该软件也可同时运行于其他操作系统目前已经经过测试的有各种Linux系统以及Mac OS上当然还有视窗操作系统
jMSN是一个韩国人开发的开放源码的API可以从站点上下载该项目的首页基本上以韩文为主包括它的API文档的说明都是韩文这个让我非常头疼不过没有关系因为jMSN非常简单如果没有什么特殊情况下不看那些说明也没有关系
jmsn是一个完整的Java应用程序下载解压后可以直接运行运行的界面跟微软的MSN Messenger很类似包括操作上都非常一致如果你的操作系统是Linux或者其他那都可以直接用它来替代微软的程序另外一个是msnmlib这个就是我们今天要介绍的API它仅仅是一个开发包在jmsn组件中已经包含了这个包
你可能想先体验一下jmsn自带的程序看看到底能完成什么样的功能吧?解压jmsn压缩包后的目录中会有一个可执行文件不过如果你的JDK不是使用安装程序安装的建议你不用执行它它会找不到jre的你可以使用命令行来启动这个程序这样做有个好处是你还可以看到运行中打印出来的信息
应该说界面跟MSN Messenger是非常类似的用户可以通过它发送和接收消息等在启动jMSN的命令行窗口中可以看到jMSN与服务器之间通讯的详细信息
前面我们主要在介绍jMSN大概的情况介绍它能完成什么样的功能下面我们开始来了解怎么利用jMSN自带的APImsnmlib来实现这些功能我们可以通过msnmlib来完成与MSN服务器之间的通讯而不需要我们去操心具体的通讯协议的细节
事实上msnmlib给我们做了更多的事情使得我们使用msnmlib来开发一个MSN应用程序变得非常的简单这也就是我前面提到的我们完全可以不去可能它所提供的韩文API文档的缘故因为使用它实在是太简单了
闲话说了那么多现在我们就开始来开发我们自己基于Java的跨平台的MSN客户端程序相信听到这句大家都会觉得血脉膨胀没错还有什么比动手写程序更让人兴奋的事情呢?何况还是基于Java的跨平台的!
我们先给出一段可运行的代码来完成一个最简单的功能当有人把它加入好友时程序自动将之加入好友当有人给它发送信息程序自动回复一条相同的信息完成这么简单的功能的代码如下
/*
* Created on by Liudong
*/
package jmsndemo;
import rathmsnmMSNMessenger;
import rathmsnmSwitchboardSession;
import rathmsnmUserStatus;
import rathmsnmentityMsnFriend;
import rathmsnmeventMsnAdapter;
import rathmsnmmsgMimeMessage;
/**
* MSN演示程序
* @author Liudong
*/
public class MSNDaemon extends Thread
{
private static MSNMessenger msn;
public static void main(String[] args)
{
msn = new MSNMessenger
(you password);
msnsetInitialStatus(UserStatusONLINE);
msnaddMsnListener(new MSNAdapter(msn));
msnlogin();
Systemoutprintln
(Waiting for the response);
//捕捉Ctrl+C的输入以便注销MSN的登录
RuntimegetRuntime()
addShutdownHook(new MSNDaemon());
}
/**
* 用户中止程序执行
*/
public void run()
{
msnlogout();
Systemoutprintln(MSN Logout OK);
}
}
/**
* MSN消息事件处理类
* @author Liudong
*/
class MSNAdapter extends MsnAdapter
{
MSNMessenger messenger;
public MSNAdapter(MSNMessenger messenger)
{
ssenger = messenger;
}
/**
* 某人正在输入信息
*/
public void progressTyping(
SwitchboardSession ss
MsnFriend friend
String typingUser)
{
Systemoutprintln
(friendgetLoginName() + 正在输入信息);
}
/**
* 收到消息的时候执行该方法
*/
public void instantMessageReceived(
SwitchboardSession ss
MsnFriend friend
MimeMessage mime)
{
Systemoutprint(接收到消息
+ friendgetFriendlyName() + >);
Systemoutprintln(mimegetMessage());
try {
//发送相同的回复信息给发送者
messengersendMessage
(friendgetLoginName() mime);
} catch (Exception e)
{
eprintStackTrace();
}
}
/**
* 登录成功后执行该方法
*/
public void loginComplete(MsnFriend own)
{
Systemoutprintln
(owngetLoginName() + Login OK);
}
/**
* 登录失败后执行该方法
*/
public void loginError(String header)
{
Systemoutprintln
(Login Failed: + header);
}
/**
* 好友离线时执行该方法
*/
public void userOffline(String loginName)
{
Systemoutprintln
(USER + loginName + Logout);
}
/**
* 好友上线时执行该方法
*/
public void userOnline(MsnFriend friend)
{
Systemoutprintln
(USER +friendgetFriendlyName()+ Login);
}
/**
* 有人加我为好友时执行
*/
public void whoAddedMe(MsnFriend friend)
{
Systemoutprintln
(USER + friendgetLoginName() + Addme);
try {
messengeraddFriend(friendgetLoginName());
} catch (Exception e)
{
eprintStackTrace();
}
}
/**
* 有人把我从好友列表中删除时执行
*/
public void whoRemovedMe(MsnFriend friend)
{
Systemoutprintln
(USER +friendgetLoginName()+ Remove me);
try {
messengerremoveFriend(friendgetLoginName());
} catch (Exception e)
{
eprintStackTrace();
}
}
}
除了两个常用的对象MsnFriend以及MimeMessage分别用来表示我的好友以及MSN信息外其他我们需要了解的也就是MSNMessenger以及MsnAdapter了当然了前提是我们不需要除了聊天外的其他功能例如文件传输等等
类MSNMessenger对应着一个帐号的一次登录会话我们仅仅是需要告诉MSNMessenger类我们登录所用的帐号密码登录后的初始状态以及我们怎么来处理从MSN服务器上接收到的任何信息
在msnmlib中处理MSN信息是通过一个叫MsnAdapter类来处理的这个类定义了如何处理例如收到消息有人加我为好友等等的事件开发者可以重载这些方法以便进行自行处理
我们自行扩展MsnAdapter的类必须告诉MSNMessenger实例知道这也就是我们前面代码中的
msnaddMsnListener(new MSNAdapter(msn));
自行扩展MsnAdapter的类是用来处理被动消息的例如有人给我发消息等当我们要发送消息给别人的时候就需要用到MSNMessenger的实例这也就是我们为什么要把MSNMessenger的实例传递给MSNAdapter的原因因为当我们接收到任何消息时要给发送人回复一条相同的信息到此我们前面提出的简单功能已经完成了读者可以在自己的机器上进行测试运行时需要用到msnmlib库也就是msnmjar文件
关于多人聊天
MSN有另外一个不错的功能就是多人同时聊天msnmlib对这个功能支持也非常好在MsnAdapter中定义的方法instantMessageReceived的第一个参数类型为SwitchboardSession当接收到消息时我们可以从这个参数中获取多人聊天的一个会话标识同时可以通过getMsnFriends来读取参与当前聊天的所有好友当你要主动发送消息的时候你就必须从SwitchboardSession中读取所有的好友并给他们一一发送信息
关于文件传输
可能这是我发现的