知识大全 用Java实现MSN Messenger聊天

Posted

篇首语:我会努力奋斗直到亮瞎你们的双眼。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 用Java实现MSN Messenger聊天相关的知识,希望对你有一定的参考价值。

用Java实现MSN Messenger聊天  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  现在的即时通讯软件琳琅满目 大家耳熟能详的无非就是腾讯公司的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的主页中提供两个部件供下载如下图所示 其中jmsn是一个完整的JAVA应用程序 下载解压后可以直接运行 运行的界面跟微软的MSN Messenger很类似 包括操作上都非常一致 如果你的操作系统是Linux或者其他那都可以直接用它来替代微软的程序 另外一个是msnm lib 这个就是我们今天要介绍的API 它仅仅是一个开发包 在jmsn组件中已经包含了这个包  

  

  你可能想先体验一下jmsn自带的程序看看到底能完成什么样的功能吧?解压jmsn压缩包后的目录中会有一个可执行文件 不过如果你的JDK不是使用安装程序安装的 建议你不用执行它 它会找不到jre的 你可以使用命令行来启动这个程序 这样做有个好处是你还可以看到运行中打印出来的信息

  启动jMSN的命令

     java jar jmsn jar

  jMSN的登录界面以及主窗口如下图所示

  

  

  应该说这个界面跟MSN Messenger是非常类似的 用户可以通过它发送和接收消息等 在启动jMSN的命令行窗口中可以看到jMSN与服务器之间通讯的详细信息

  前面我们主要在介绍j MSN大概的情况 介绍它能完成什么样的功能

  下面我们开始来了解怎么利用jMSN自带的API

  msnm lib来实现这些功能

  下图是msnm lib与jMSN包括MSN系统之间的关系 也就是说我们可以通过msnm lib来完成与MSN服务器之间的通讯而不需要我们去操心具体的通讯协议的细节 事实上msnm lib给我们做了更多的事情使得我们使用msnm lib来开发一个MSN应用程序变得非常的简单 这也就是我前面提到的我们完全可以不去可能它所提供的韩文API文档的缘故 因为使用它实在是太简单了  

  

  闽南语说 说破不值钱!闲话说了那么多 现在我们就开始来开发我们自己基于JAVA的跨平台的MSN客户端程序 相信听到这句大家都会觉得血脉膨胀 没错 还有什么比动手写程序更让人兴奋的事情呢?何况还是基于JAVA的 跨平台的!

  我们先给出一段可运行的代码来完成一个最简单的功能 当有人把它加入好友时 程序自动将之加入好友 当有人给它发送信息 程序自动回复一条相同的信息 OK 完成这么简单的功能的代码如下

     /*  * Created on by Liudong  */  package jmsn demo;

  import rath msnm MSNMessenger;  import rath msnm SwitchboardSession;  import rath msnm UserStatus;  import rath msnm entity MsnFriend;  import rath msnm event MsnAdapter;  import rath msnm msg MimeMessage;  /**  * MSN演示程序  * @author Liudong  */  public class MSNDaemon extends Thread   private static MSNMessenger msn;

  public static void main(String[] args)   msn = new MSNMessenger( you password );  msn setInitialStatus(UserStatus ONLINE);  msn addMsnListener(new MSNAdapter(msn));  msn login();  System out println( Waiting for the response );  //捕捉Ctrl+C的输入以便注销MSN的登录  Runtime getRuntime() addShutdownHook(new MSNDaemon());    /**  * 用户中止程序执行  */  public void run()   msn logout();  System out println( 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)   System out println(friend getLoginName() + 正在输入信息 );    /**  * 收到消息的时候执行该方法  */  public void instantMessageReceived(  SwitchboardSession ss   MsnFriend friend   MimeMessage mime)   System out print( 接收到消息 + friend getFriendlyName() + > );  System out println(mime getMessage());  try   //发送相同的回复信息给发送者  messenger sendMessage(friend getLoginName() mime);   catch (Exception e)   e printStackTrace();      /**  * 登录成功后执行该方法  */  public void loginComplete(MsnFriend own)   System out println(own getLoginName() + Login OK );    /**  * 登录失败后执行该方法  */  public void loginError(String header)   System out println( Login Failed: + header);    /**  * 好友离线时执行该方法  */  public void userOffline(String loginName)   System out println( USER + loginName + Logout );    /**  * 好友上线时执行该方法  */  public void userOnline(MsnFriend friend)   System out println( USER +friend getFriendlyName()+ Login );    /**  * 有人加我为好友时执行  */  public void whoAddedMe(MsnFriend friend)   System out println( USER + friend getLoginName() + Addme );  try   messenger addFriend(friend getLoginName());   catch (Exception e)   e printStackTrace();    

     /**  * 有人把我从好友列表中删除时执行  */  public void whoRemovedMe(MsnFriend friend)   System out println( USER +friend getLoginName()+ Remove me );  try   messenger removeFriend(friend getLoginName());   catch (Exception e)   e printStackTrace();    

  

  除了两个常用的对象MsnFriend以及MimeMessage分别用来表示我的好友以及MSN信息外 其他我们需要了解的也就是MSNMessenger以及MsnAdapter了 当然了前提是我们不需要除了聊天外的其他功能 例如文件传输等等 类MSNMessenger 对应着一个帐号的一次登录会话

  我们仅仅是需要告诉MSNMessenger类我们登录所用的帐号 密码 登录后的初始状态以及我们怎么来处理从MSN服务器上接收到的任何信息 在msnm lib中 处理MSN信息是通过一个叫MsnAdapter类来处理的 这个类定义了如何处理例如收到消息 有人加我为好友等等的事件 开发者可以重载这些方法以便进行自行处理

  我们自行扩展MsnAdapter的类必须告诉MSNMessenger实例知道 这也就是我们前面代码中的 msn addMsnListener(new MSNAdapter(msn)); 自行扩展MsnAdapter的类是用来处理被动消息的 例如有人给我发消息等 当我们要发送消息给别人的时候就需要用到MSNMessenger的实例 这也就是我们为什么要把MSNMessenger的实例传递给MSNAdapter的原因 因为当我们接收到任何消息时要给发送人回复一条相同的信息

  到此我们前面提出的简单功能已经完成了 读者可以在自己的机器上进行测试 运行时需要用到msnm lib库 也就是msnm jar文件 下图是运行时候的一个截图

  

  关于多人聊天

  MSN有另外一个不错的功能就是多人同时聊天 msnm lib对这个功能支持也非常好 在MsnAdapter中定义的方法instantMessageReceived的第一个参数类型为SwitchboardSession 当接收到消息时 我们可以从这个参数中获取多人聊天的一个会话标识 同时可以通过getMsnFriends来读取参与当前聊天的所有好友 当你要主动发送消息的时候你就必须从SwitchboardSession中读取所有的好友并给他们一一发送信息

  关于文件传输

  可能这是我发现的关于msnm lib的唯一不足 或者说还不够完善的部分 经过测试发现使用微软的MSN程序可以正常传输文件的两台机器用jMSN却无法传输 错误信息都是说连接超时 这两台机器不在同一个子网 相信msnm lib对这个功能并没有进行处理 由于并没有两台直接连接Internet的机器 因此关于jMSN的文件传输一直都没有办法来做一个试验 希望新版本的msnm lib能解决好这个问题

  总结

cha138/Article/program/Java/hx/201311/26149

相关参考

知识大全 用什么软件可以获取对方微信聊天记录

用什么软件可以获取对方微信聊天记录查看他人的微信聊天记录,除非可以拿到对方手机设备直接登陆微信账户查看,在聊天对话框里面查看聊天记录。如果无法通过对方的手机设备显示查看到聊天记录信息,就永远不可能查看

知识大全 用Delphi开发视频聊天软件(一)

用Delphi开发视频聊天软件(一)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n

知识大全 用Delphi开发视频聊天软件(二)

用Delphi开发视频聊天软件(二)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n

知识大全 用Delphi开发视频聊天软件(三)

用Delphi开发视频聊天软件(三)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n

知识大全 怎样用line camera 更换微信聊天影象

怎样用linecamera更换微信聊天影象?工具/原料智慧手机手机APP(LINECamera)方法/步骤开启APP,选择照相机功能键。选择相簿那一栏,见图中黄色框标识。挑选你要修改的照片,点选编辑。

知识大全 我的笔记本用耳机怎么不能QQ语音聊天

我的笔记本用耳机怎么不能QQ语音聊天?上面说你的麦克风没有声音!怎么解决这问题啊?跪求各位电脑高手!  以下文字资料是由(历史新知网www.cha138.com)小编为大家搜集整理

知识大全 暗恋一个人可他从来都不跟我聊天,自动跟她聊天他也不理,后来用悄悄话表白了,他一直问我是谁,没有勇

暗恋一个人可他从来都不跟我聊天,自动跟她聊天他也不理,后来用悄悄话表白了,他一直问我是谁,,没有勇苏州过后无艇搭喜欢就应该表白吧(不能过直接要让他知道你的名)就算他不喜欢你自己心里也有个数是否继续去爱

知识大全 用IE和SQL2k开发一个XML聊天程序

用IE和SQL2k开发一个XML聊天程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  不同浏览

知识大全 用腾讯浏览器登入微信电脑版,聊天记录会像qq一样存在电脑的某个资料夹里吗

用腾讯浏览器登入微信电脑版,聊天记录会像qq一样存在电脑的某个资料夹里吗?如果有,从哪里找?检视语音聊天记录的方法>01语音聊天记录的备份和提取无需root,这些内容都备份在SD卡上。>0

知识大全 电脑精简系统和平时用的系统有什么区别,详细点谢谢了,大神帮忙啊

电脑精简系统和平时用的系统有什么区别,详细点谢谢了,大神帮忙啊所谓精简,就是去掉一些不常用的组件和帮助文件等。具体?比如,网络均衡组件,防火墙组件,IIS组件,messenger组件,outlooke