<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    gembin

    OSGi, Eclipse Equinox, ECF, Virgo, Gemini, Apache Felix, Karaf, Aires, Camel, Eclipse RCP

    HBase, Hadoop, ZooKeeper, Cassandra

    Flex4, AS3, Swiz framework, GraniteDS, BlazeDS etc.

    There is nothing that software can't fix. Unfortunately, there is also nothing that software can't completely fuck up. That gap is called talent.

    About Me

     

    用JAVA實現(xiàn)MSN Messenger的功能[zhuan]

    本文介紹了一個用Java編寫的可以訪問MSN服務(wù)的開發(fā)包-JMsn,利用這個開發(fā)包你可以編寫自己的具有MSN Messenger功能的客戶端程序。

    現(xiàn)在的即時通訊軟件琳瑯滿 目,大家耳熟能詳?shù)臒o非就是騰訊公司的QQ,微軟公司的MSN Messenger以及網(wǎng)易的泡泡,就用戶量而言這三者應(yīng)該是名列前茅的。但是騰訊公司的QQ以及網(wǎng)易的泡泡由于并沒有公開其客戶端與服務(wù)器之間的通訊協(xié) 議導(dǎo)致開發(fā)者很難利用起這一龐大的用戶群體來開辟另外的服務(wù)渠道。MSN Messenger這一由世界頭號軟件商-微軟公司開發(fā)的即時通訊軟件,憑借其與windows操作系統(tǒng)和整個微軟產(chǎn)品家族的緊密結(jié)合,簡單實用、性能穩(wěn) 定、世界通用等特點,很快被中國用戶接受,目前其用戶正在以幾何數(shù)字增長。但是讓開發(fā)者雀躍的是該軟件同時也提供了開放的API以及開放的通訊協(xié)議。著名 的MSN Plus就是一款利用其API開發(fā)的用于擴展MSN Messenger功能的插件。而我們今天要介紹的jMSN則是封裝了MSN Messenger開放的通訊協(xié)議的JAVA API,通過這個API開發(fā)者完全可以使用JAVA語言模擬出MSN Messenger軟件,API的作者也提供一個用JAVA語言編寫的在某方面功能甚至比MSN Messenger還強大的MSN 客戶端軟件。由于采用了跨平臺的JAVA語言開發(fā),因此該軟件也可同時運行于其他操作系統(tǒng),目前已經(jīng)經(jīng)過測試的有各種Linux系統(tǒng)以及Mac OS上,當(dāng)然還有視窗操作系統(tǒng)。

    jMSN是一個韓國人開發(fā)的開放源碼的API,可以從 http://sourceforge.net/projects/jmsn/站點上下載,該項目的首頁基本上以韓文為主,包括它的API文檔的說明都是 韓文。這個讓我非常頭疼,不過沒有關(guān)系,因為jMSN非常簡單,如果沒有什么特殊情況下不看那些說明也沒有關(guān)系。jMSN的主頁中提供兩個部件供下載如下 圖所示,其中jmsn是一個完整的JAVA應(yīng)用程序,下載解壓后可以直接運行,運行的界面跟微軟的MSN Messenger很類似,包括操作上都非常一致,如果你的操作系統(tǒng)是Linux或者其他那都可以直接用它來替代微軟的程序。另外一個是msnm- lib,這個就是我們今天要介紹的API,它僅僅是一個開發(fā)包,在jmsn組件中已經(jīng)包含了這個包。



    你 可能想先體驗一下jmsn自帶的程序看看到底能完成什么樣的功能吧?解壓jmsn壓縮包后的目錄中會有一個可執(zhí)行文件,不過如果你的JDK不是使用安裝程 序安裝的,建議你不用執(zhí)行它,它會找不到j(luò)re的。你可以使用命令行來啟動這個程序,這樣做有個好處是你還可以看到運行中打印出來的信息。 啟動jMSN的命令:java -jar jmsn.jar

    jMSN的登錄界面以及主窗口如下圖所示:





    應(yīng)該說這個界面跟MSN Messenger是非常類似的。用戶可以通過它發(fā)送和接收消息等。在啟動jMSN的命令行窗口中可以看到j(luò)MSN與服務(wù)器之間通訊的詳細(xì)信息。

    前 面我們主要在介紹jMSN大概的情況,介紹它能完成什么樣的功能。下面我們開始來了解怎么利用jMSN自帶的API:msnm-lib來實現(xiàn)這些功能。下 圖是msnm-lib與jMSN包括MSN系統(tǒng)之間的關(guān)系,也就是說我們可以通過msnm-lib來完成與MSN服務(wù)器之間的通訊而不需要我們?nèi)ゲ傩木唧w 的通訊協(xié)議的細(xì)節(jié)。事實上msnm-lib給我們做了更多的事情使得我們使用msnm-lib來開發(fā)一個MSN應(yīng)用程序變得非常的簡單,這也就是我前面提 到的我們完全可以不去可能它所提供的韓文API文檔的緣故,因為使用它實在是太簡單了。



    閩南語說:說破不值錢!閑話說了那么多,現(xiàn)在我們就開始來開發(fā)我們自己基于JAVA的跨平臺的MSN客戶端程序。相信聽到這句大家都會覺得血脈膨脹,沒錯,還有什么比動手寫程序更讓人興奮的事情呢?何況還是基于JAVA的、跨平臺的!

    我們先給出一段可運行的代碼來完成一個最簡單的功能:當(dāng)有人把它加入好友時,程序自動將之加入好友,當(dāng)有人給它發(fā)送信息,程序自動回復(fù)一條相同的信息。OK,完成這么簡單的功能的代碼如下:

    /*
    * Created on 2003-11-21 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("youraccount@hotmail.com", "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());
    }
    /**
    * 用戶中止程序執(zhí)行
    */
    public void run() {
    msn.logout();
    System.out.println("MSN Logout OK");
    }
    }
    /**
    * MSN消息事件處理類
    * @author Liudong
    */
    class MSNAdapter extends MsnAdapter {
    MSNMessenger messenger;
    public MSNAdapter(MSNMessenger messenger) {
    this.messenger = messenger;
    }
    /**
    * 某人正在輸入信息
    */
    public void progressTyping(
    SwitchboardSession ss,
    MsnFriend friend,
    String typingUser) {
    System.out.println(friend.getLoginName() + "正在輸入信息...");
    }
    /**
    * 收到消息的時候執(zhí)行該方法
    */
    public void instantMessageReceived(
    SwitchboardSession ss,
    MsnFriend friend,
    MimeMessage mime) {
    System.out.print("接收到消息:" + friend.getFriendlyName() + "->");
    System.out.println(mime.getMessage());
    try {
    //發(fā)送相同的回復(fù)信息給發(fā)送者
    messenger.sendMessage(friend.getLoginName(), mime);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    /**
    * 登錄成功后執(zhí)行該方法
    */
    public void loginComplete(MsnFriend own) {
    System.out.println(own.getLoginName() + " Login OK");
    }
    /**
    * 登錄失敗后執(zhí)行該方法
    */
    public void loginError(String header) {
    System.out.println("Login Failed: " + header);
    }
    /**
    * 好友離線時執(zhí)行該方法
    */
    public void userOffline(String loginName) {
    System.out.println("USER " + loginName + " Logout.");
    }
    /**
    * 好友上線時執(zhí)行該方法
    */
    public void userOnline(MsnFriend friend) {
    System.out.println("USER "+friend.getFriendlyName()+" Login.");
    }
    /**
    * 有人加我為好友時執(zhí)行
    */
    public void whoAddedMe(MsnFriend friend) {
    System.out.println("USER " + friend.getLoginName() + " Addme.");
    try {
    messenger.addFriend(friend.getLoginName());
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    /**
    * 有人把我從好友列表中刪除時執(zhí)行
    */
    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了。當(dāng)然了前 提是我們不需要除了聊天外的其他功能,例如文件傳輸?shù)鹊取n怣SNMessenger 對應(yīng)著一個帳號的一次登錄會話。我們僅僅是需要告訴MSNMessenger類我們登錄所用的帳號、密碼、登錄后的初始狀態(tài)以及我們怎么來處理從MSN服 務(wù)器上接收到的任何信息。在msnm-lib中,處理MSN信息是通過一個叫MsnAdapter類來處理的,這個類定義了如何處理例如收到消息、有人加 我為好友等等的事件,開發(fā)者可以重載這些方法以便進(jìn)行自行處理。我們自行擴展MsnAdapter的類必須告訴MSNMessenger實例知道,這也就 是我們前面代碼中的 msn.addMsnListener(new MSNAdapter(msn)); 自行擴展MsnAdapter的類是用來處理被動消息的,例如有人給我發(fā)消息等。當(dāng)我們要發(fā)送消息給別人的時候就需要用到MSNMessenger的實 例,這也就是我們?yōu)槭裁匆袽SNMessenger的實例傳遞給MSNAdapter的原因,因為當(dāng)我們接收到任何消息時要給發(fā)送人回復(fù)一條相同的信 息。

    到此我們前面提出的簡單功能已經(jīng)完成了,讀者可以在自己的機器上進(jìn)行測試,運行時需要用到msnm-lib庫,也就是msnm.jar文件。下圖是運行時候的一個截圖:



    關(guān)于多人聊天:

    MSN 有另外一個不錯的功能就是多人同時聊天,msnm-lib對這個功能支持也非常好。在MsnAdapter中定義的方法 instantMessageReceived的第一個參數(shù)類型為SwitchboardSession。當(dāng)接收到消息時,我們可以從這個參數(shù)中獲取多人 聊天的一個會話標(biāo)識,同時可以通過getMsnFriends來讀取參與當(dāng)前聊天的所有好友。當(dāng)你要主動發(fā)送消息的時候你就必須從 SwitchboardSession中讀取所有的好友并給他們一一發(fā)送信息。

    關(guān)于文件傳輸:

    可 能這是我發(fā)現(xiàn)的關(guān)于msnm-lib的唯一不足,或者說還不夠完善的部分。經(jīng)過測試發(fā)現(xiàn)使用微軟的MSN程序可以正常傳輸文件的兩臺機器用jMSN卻無法 傳輸,錯誤信息都是說連接超時,這兩臺機器不在同一個子網(wǎng)。相信msnm-lib對這個功能并沒有進(jìn)行處理。由于并沒有兩臺直接連接Internet的機 器,因此關(guān)于jMSN的文件傳輸一直都沒有辦法來做一個試驗,希望新版本的msnm-lib能解決好這個問題。

    總結(jié):

    盡 管在文件傳輸上有點瑕疵,但是msnm-lib所提供的功能已經(jīng)非常棒了,至少在我第一眼看到它的時候心里說:沒錯,這就是我想要的東西!本文旨在介紹如 何使用msnm-lib來完成一個簡單的MSN客戶端,至于如果讓它在實際的應(yīng)用系統(tǒng)中發(fā)揮作用,讀者們肯定有比我更多的想法,比如說是否可以利用它來豐 富客服的渠道等等,當(dāng)然這些都超過我們的題目。如在使用中發(fā)現(xiàn)任何問題,歡迎來信共同研究。



    參考資料

    jMSN網(wǎng)址(韓文) http://jmsn.sourceforge.net/

    posted on 2008-04-22 18:25 gembin 閱讀(1013) 評論(0)  編輯  收藏 所屬分類: JavaSE

    導(dǎo)航

    統(tǒng)計

    常用鏈接

    留言簿(6)

    隨筆分類(440)

    隨筆檔案(378)

    文章檔案(6)

    新聞檔案(1)

    相冊

    收藏夾(9)

    Adobe

    Android

    AS3

    Blog-Links

    Build

    Design Pattern

    Eclipse

    Favorite Links

    Flickr

    Game Dev

    HBase

    Identity Management

    IT resources

    JEE

    Language

    OpenID

    OSGi

    SOA

    Version Control

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    free counters
    主站蜘蛛池模板: 99久久免费精品国产72精品九九| 嫩草视频在线免费观看| 国内自产拍自a免费毛片| 亚洲午夜激情视频| 亚洲性一级理论片在线观看| 日本高清不卡中文字幕免费| 8x8x华人永久免费视频| www.亚洲色图.com| 亚洲成无码人在线观看| 国产美女视频免费观看的网站| 91在线视频免费播放| 亚洲一区二区三区偷拍女厕| 亚洲日本在线电影| 久久黄色免费网站| 亚洲AV无码乱码精品国产| 亚洲国产中文在线视频 | 亚洲深深色噜噜狠狠网站| aa午夜免费剧场| A级毛片内射免费视频| 亚洲国产精品无码成人片久久 | 久久久久se色偷偷亚洲精品av| 51午夜精品免费视频| 成人免费在线观看网站| 亚洲高清视频在线观看| 免费在线观看一区| 成人免费在线视频| 亚洲精品不卡视频| 国产在线观a免费观看| 免费看国产精品麻豆| 亚洲国产熟亚洲女视频| 91香蕉国产线在线观看免费| 中文字幕无码精品亚洲资源网| 亚洲精品无码久久久久A片苍井空 亚洲精品无码久久久久YW | 亚洲中文精品久久久久久不卡| 久久青草免费91线频观看站街| www.91亚洲| 亚洲第一成年免费网站| 三年片在线观看免费大全 | 亚洲人成网站在线观看播放动漫| 永久免费av无码网站yy| 亚洲一区日韩高清中文字幕亚洲 |