`
sjsky
  • 浏览: 906308 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

用JAVA实现MSN Messenger的功能

阅读更多

    blog迁移至 :http://www.micmiu.com

 

     JML是Java实现即时通讯软件MSN的lib包,目前支持的协议为MSNP8-MSNP15。


JML的官网:http://sourceforge.net/projects/java-jml/


【一】、基本介绍
        附件提供测试代码和lib文件:

      JML的lib还依赖的其他第三方lib包:

  • cindy.jar
  • commons-logging.jar
  • httpcore.jar
  • 第三方lib包下载:第三方lib.zip



【二】、DEMO代码
简单实现了MSN收发消息、好友添加等等基本功能。

MyJmsnClient.java

package michael.msn.jml;

import java.util.Scanner;

import net.sf.jml.MsnContact;
import net.sf.jml.MsnMessenger;
import net.sf.jml.MsnProtocol;
import net.sf.jml.MsnUserStatus;
import net.sf.jml.impl.MsnMessengerFactory;

import org.apache.log4j.PropertyConfigurator;

/**
 * @author michael
 * 
 */
public class MyJmsnClient {
    private String msnEmail;

    private String msnPassword;

    private MsnMessenger msn;

    /**
     * @param msnEmail
     * @param msnPassword
     */
    public MyJmsnClient(String msnEmail, String msnPassword) {
        this.msnEmail = msnEmail;
        this.msnPassword = msnPassword;
    }

    /**
     * 启动
     */
    public void start() {
        // 创建MsnMessenger
        msn = MsnMessengerFactory.createMsnMessenger(msnEmail, msnPassword);
        // 设置登录协议 MSNP15 可以发送离线消息
        msn.setSupportedProtocol(new MsnProtocol[] { MsnProtocol.MSNP15 });
        // 设置用户状态
        msn.getOwner().setInitStatus(MsnUserStatus.ONLINE);
        // 注册事件监听
        msn.addListener(new MyJmsnSimpleAdapter());
        msn.login();// 登录
    }

    /**
     * msn logout
     */
    public void stop() {
        msn.logout();
    }

    /**
     * 给所有的人发消息
     * @param msg
     */
    public void sendAllMsg(String msg) {
        MsnContact[] contactList = msn.getContactList().getContacts();
        for (MsnContact con : contactList) {
            msn.sendText(con.getEmail(), msg);
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        PropertyConfigurator.configure(MyJmsnClient.class
                .getResource("/log4j.properties"));
        MyJmsnClient client = new MyJmsnClient("yourmsnemail", "yourpassword");
        System.out.println(" MyJmsnClient start ...");
        client.start();
        try {
            Thread.sleep(5000);
        } catch (Exception e) {
            e.printStackTrace();
        }

        //获取控制台输入的信息发送给所有的好友
        Scanner input = new Scanner(System.in);
        while (input.hasNext()) {
            String s = input.next();
            if ("quit".equals(s)) {
                System.out.println(" MSN exit by quit");
                client.stop();
                break;
            } else {
                client.sendAllMsg(s);
            }
        }
        System.out.println("=====================");
    }
}


MyJmsnSimpleAdapter.java

package michael.msn.jml;

import net.sf.jml.MsnContact;
import net.sf.jml.MsnFileTransfer;
import net.sf.jml.MsnList;
import net.sf.jml.MsnMessenger;
import net.sf.jml.MsnSwitchboard;
import net.sf.jml.event.MsnAdapter;
import net.sf.jml.message.MsnControlMessage;
import net.sf.jml.message.MsnEmailInitEmailData;
import net.sf.jml.message.MsnInstantMessage;

import org.apache.log4j.Logger;

/**
 * 实现了一个简单的MsnAdapter
 * @author michael
 * 
 */
public class MyJmsnSimpleAdapter extends MsnAdapter {

    private static final Logger logger = Logger
            .getLogger(MyJmsnSimpleAdapter.class);

    /**
     * @see net.sf.jml.event.MsnAdapter#contactAddCompleted(net.sf.jml.MsnMessenger,
     *      net.sf.jml.MsnContact, net.sf.jml.MsnList)
     * @param pMessenger
     * @param pContact
     * @param pList
     */
    @Override
    public void contactAddCompleted(MsnMessenger pMessenger,
            MsnContact pContact, MsnList pList) {

        super.contactAddCompleted(pMessenger, pContact, pList);

        try {
            pMessenger.sendText(pContact.getEmail(), pContact.getFriendlyName()
                    + " 你好,已经加为好友");
        } catch (Exception e) {
            logger.error("contactAddCompleted sendText error", e);
        }

    }

    /**
     * @see net.sf.jml.event.MsnAdapter#contactAddedMe(net.sf.jml.MsnMessenger,
     *      net.sf.jml.MsnContact)
     * @param pMessenger
     * @param pContact
     */
    @Override
    public void contactAddedMe(MsnMessenger pMessenger, MsnContact pContact) {

        super.contactAddedMe(pMessenger, pContact);

        logger.info("user: " + pContact.getEmail() + " Add me.");
        try {
            pMessenger.addFriend(pContact.getEmail(), pContact
                    .getFriendlyName());
        } catch (Exception e) {
            logger.error("addFriend error:", e);
        }
    }

    /**
     * @see net.sf.jml.event.MsnAdapter#contactListInitCompleted(net.sf.jml.MsnMessenger)
     * @param pMessenger
     */
    @Override
    public void contactListInitCompleted(MsnMessenger pMessenger) {

        super.contactListInitCompleted(pMessenger);
        MsnContact[] cons = pMessenger.getContactList().getContactsInList(
                MsnList.AL);
        logger.info("你的联系人数量=" + cons.length);
        for (MsnContact con : cons) {
            logger.info("联系人:" + con.getEmail().getEmailAddress() + " 状态:"
                    + con.getStatus().getDisplayStatus());
        }

    }

    /**
     * @see net.sf.jml.event.MsnAdapter#contactListSyncCompleted(net.sf.jml.MsnMessenger)
     * @param pMessenger
     */
    @Override
    public void contactListSyncCompleted(MsnMessenger pMessenger) {
        super.contactListSyncCompleted(pMessenger);
        logger.info("MSN contactListSyncCompleted.");
    }

    /**
     * @see net.sf.jml.event.MsnAdapter#contactRemoveCompleted(net.sf.jml.MsnMessenger,
     *      net.sf.jml.MsnContact, net.sf.jml.MsnList)
     * @param pMessenger
     * @param pContact
     * @param pList
     */
    @Override
    public void contactRemoveCompleted(MsnMessenger pMessenger,
            MsnContact pContact, MsnList pList) {

        super.contactRemoveCompleted(pMessenger, pContact, pList);
        logger.info("user: " + pContact.getEmail() + " Remove Completed.");
    }

    /**
     * @see net.sf.jml.event.MsnAdapter#contactRemovedMe(net.sf.jml.MsnMessenger,
     *      net.sf.jml.MsnContact)
     * @param pMessenger
     * @param pContact
     */
    @Override
    public void contactRemovedMe(MsnMessenger pMessenger, MsnContact pContact) {

        super.contactRemovedMe(pMessenger, pContact);
        logger.info("user: " + pContact.getEmail() + " Remove me.");
    }

    /**
     * @see net.sf.jml.event.MsnAdapter#controlMessageReceived(net.sf.jml.MsnSwitchboard,
     *      net.sf.jml.message.MsnControlMessage, net.sf.jml.MsnContact)
     * @param pSwitchboard
     * @param pMessage
     * @param pContact
     */
    @Override
    public void controlMessageReceived(MsnSwitchboard pSwitchboard,
            MsnControlMessage pMessage, MsnContact pContact) {

        super.controlMessageReceived(pSwitchboard, pMessage, pContact);
        logger.info(pContact.getFriendlyName() + " 正在输入文字......");
    }

    /**
     * @see net.sf.jml.event.MsnAdapter#exceptionCaught(net.sf.jml.MsnMessenger,
     *      java.lang.Throwable)
     * @param pMessenger
     * @param pThrowable
     */
    @Override
    public void exceptionCaught(MsnMessenger pMessenger, Throwable pThrowable) {

        super.exceptionCaught(pMessenger, pThrowable);
        logger.error("exceptionCaught :", pThrowable);
    }

    /**
     * @see net.sf.jml.event.MsnAdapter#fileTransferRequestReceived(net.sf.jml.MsnFileTransfer)
     * @param pTransfer
     */
    @Override
    public void fileTransferRequestReceived(MsnFileTransfer pTransfer) {

        super.fileTransferRequestReceived(pTransfer);
        logger.info("receive fileTransferRequest from "
                + pTransfer.getContact().getDisplayName());
    }

    /**
     * @see net.sf.jml.event.MsnAdapter#initialEmailDataReceived(net.sf.jml.MsnSwitchboard,
     *      net.sf.jml.message.MsnEmailInitEmailData, net.sf.jml.MsnContact)
     * @param pSwitchboard
     * @param pMessage
     * @param pContact
     */
    @Override
    public void initialEmailDataReceived(MsnSwitchboard pSwitchboard,
            MsnEmailInitEmailData pMessage, MsnContact pContact) {

        super.initialEmailDataReceived(pSwitchboard, pMessage, pContact);
        logger.info("receive email from " + pContact.getDisplayName());
    }

    /**
     * @see net.sf.jml.event.MsnAdapter#instantMessageReceived(net.sf.jml.MsnSwitchboard,
     *      net.sf.jml.message.MsnInstantMessage, net.sf.jml.MsnContact)
     * @param pSwitchboard
     * @param pMessage
     * @param pContact
     */
    @Override
    public void instantMessageReceived(MsnSwitchboard pSwitchboard,
            MsnInstantMessage pMessage, MsnContact pContact) {

        super.instantMessageReceived(pSwitchboard, pMessage, pContact);

        logger.info("received  from: " + pContact.getDisplayName()
                + " with msg: " + pMessage.getContent());
        try {
            MsnInstantMessage msg = new MsnInstantMessage();
            msg.setContent("你好!我是机器人Michael,请勿回复消息。"
                    + "\r\n你可以访问我的blog http://sjsky.iteye.com");
            msg.setFontRGBColor(255);

            pSwitchboard.sendMessage(msg);// 发送信息
            pSwitchboard.close();// 关闭对话框
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @see net.sf.jml.event.MsnAdapter#loginCompleted(net.sf.jml.MsnMessenger)
     * @param pMessenger
     */
    @Override
    public void loginCompleted(MsnMessenger pMessenger) {

        super.loginCompleted(pMessenger);
        logger.info("MSN login success with ID="
                + pMessenger.getOwner().getEmail());
    }

    /**
     * @see net.sf.jml.event.MsnAdapter#logout(net.sf.jml.MsnMessenger)
     * @param pMessenger
     */
    @Override
    public void logout(MsnMessenger pMessenger) {

        super.logout(pMessenger);
        logger.info("MSN logout with ID=" + pMessenger.getOwner().getEmail());
    }

    /**
     * @see net.sf.jml.event.MsnAdapter#offlineMessageReceived(java.lang.String,
     *      java.lang.String, java.lang.String, net.sf.jml.MsnContact)
     * @param pBody
     * @param pContentType
     * @param pEncoding
     * @param pContact
     */
    @Override
    public void offlineMessageReceived(String pBody, String pContentType,
            String pEncoding, MsnContact pContact) {

        super.offlineMessageReceived(pBody, pContentType, pEncoding, pContact);
        logger.info("receive offline msg from: "
                + pContact.getEmail().getEmailAddress() + " msg:"
                + pContact.getPersonalMessage());
    }

    /**
     * @see net.sf.jml.event.MsnAdapter#ownerDisplayNameChanged(net.sf.jml.MsnMessenger)
     * @param pMessenger
     */
    @Override
    public void ownerDisplayNameChanged(MsnMessenger pMessenger) {

        super.ownerDisplayNameChanged(pMessenger);
        logger.info("MSN DisplayName : "
                + pMessenger.getOwner().getOldDisplayName() + " -> "
                + pMessenger.getOwner().getDisplayName());
    }

    /**
     * @see net.sf.jml.event.MsnAdapter#ownerStatusChanged(net.sf.jml.MsnMessenger)
     * @param pMessenger
     */
    @Override
    public void ownerStatusChanged(MsnMessenger pMessenger) {

        super.ownerStatusChanged(pMessenger);
        logger
                .info("MSN status :"
                        + pMessenger.getOwner().getOldStatus()
                                .getDisplayStatus() + " -> "
                        + pMessenger.getOwner().getStatus().getDisplayStatus());
    }

}



-----------------------------------分 ------------------------------------隔 ------------------------------------线 --------------------------------------

 

8
10
分享到:
评论
5 楼 ghostwjk 2012-10-31  
试了一下,MSNP15报错,官网上好像说是bug,MSNP12没问题。
4 楼 luoaz 2012-05-09  
sjsky 写道
luoaz 写道
楼主,根据JML官方说明,好像不支持MSNP15吧,我按照上面的例子跑了下,出现的问题同楼上一样,楼主有遇到这样的问题吗?求回复

我试试吧 我当时没有这样的问题的


楼主你有没有试啊,结果怎么样?会出现301吗?有没有解决办法?
3 楼 sjsky 2012-05-06  
luoaz 写道
楼主,根据JML官方说明,好像不支持MSNP15吧,我按照上面的例子跑了下,出现的问题同楼上一样,楼主有遇到这样的问题吗?求回复

我试试吧 我当时没有这样的问题的
2 楼 luoaz 2012-05-04  
楼主,根据JML官方说明,好像不支持MSNP15吧,我按照上面的例子跑了下,出现的问题同楼上一样,楼主有遇到这样的问题吗?求回复
1 楼 tywo45 2011-11-15  
跑是能跑了,但是报错,不知何故:
引用

MyJmsnClient start ...
2011-11-15 17:59:44,703 [net.sf.jml.net.SocketSession.msgDispatcher] INFO  [com.talent.platform.demo.openfire.msn.my.MyJmsnSimpleAdapter] - MSN login success with ID=tanyaowu45@hotmail.com
2011-11-15 17:59:51,343 [net.sf.jml.net.SocketSession.msgDispatcher] ERROR [net.sf.jml.protocol.soap.ContactList] - something wrong!
java.lang.Exception
at net.sf.jml.protocol.soap.ContactList.sendRequest(ContactList.java:276)
at net.sf.jml.protocol.soap.ContactList.sendRequest(ContactList.java:271)
at net.sf.jml.protocol.soap.ContactList.sendRequest(ContactList.java:160)
at net.sf.jml.protocol.soap.ContactList.dispatch(ContactList.java:395)
at net.sf.jml.protocol.incoming.IncomingUSR.messageReceived(IncomingUSR.java:150)
at net.sf.jml.protocol.MsnSession$1.messageReceived(MsnSession.java:107)
at net.sf.jml.net.Session.fireMessageReceived(Session.java:301)
at net.sf.jml.net.Session.access$1200(Session.java:30)
at net.sf.jml.net.Session$MsgDispatcher.run(Session.java:283)
at java.lang.Thread.run(Thread.java:722)
2011-11-15 17:59:51,359 [net.sf.jml.net.SocketSession.msgDispatcher] INFO  [net.sf.jml.protocol.soap.ContactList] - Error xml:<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Header><ServiceHeader xmlns="http://www.msn.com/webservices/AddressBook"><Version>16.02.2225.0001</Version><CacheKey>14r2;bbpT2KMyAQeqUGL2pLhFFIW3+ye7cNYX5M2PX0c8z0ZmUJNekjieQ2lyubqcM9oT0xiBZ72ftMeO8Z0G8VS7Kkb8ZW6Qy+LneCjoa/hqyitiGwTWU7iy8CIDp5xmT7BxZ5cmjiolg7iIAfYsM8XDHA3d4BRljM3PfZL7341yc2w=</CacheKey><CacheKeyChanged>true</CacheKeyChanged><PreferredHostName>proxy-sn.contacts.msn.com</PreferredHostName><SessionId>ABCH.a6847870-918c-4bc9-8327-589b0f33c57a</SessionId></ServiceHeader></soap:Header><soap:Body><FindMembershipResponse xmlns="http://www.msn.com/webservices/AddressBook" /></soap:Body></soap:Envelope>

相关推荐

    用JAVA实现MSN Messenger的功能.doc

    用JAVA实现MSN Messenger的功能

    Java MSN Messenger library-开源

    JML是一个支持MSNP8-MSNP15的Java Msn Messenger库。 它针对多个用户进行了优化,旨在使其易于遵循和使用。

    手机MSN v6.0.2 java

    手机MSN是著名的即时聊天软件MSN(Windows Live Messenger)的手机版本,通过移动运营商的GPRS无线网络,来实现随时随地的自由上网交流 产品及卖点 沟通:IM聊天、打招呼、同步PC联系人分组、语音通话、查找交友 ...

    基于JAVA毕业设计-JAVA网络通信系统的研究与开发(论文+源代码+开题报告).rar

    当今主流的聊天工具有QQ,ICQ,MSN Messenger,Yahoo Messenger等,国内最热门的当属QQ,腾讯QQ(OICQ)是由深圳市腾讯计算机系统有限公司开发的,基于Internet的即时寻呼软件。您可以使用QQ和好友用户进行交流,...

    英文原版-Instant Messaging in Java 1st Edition

    Instant Messaging has exploded into the online world and is a wildly popular service of the largest Internet Service Providers (ISP) like AOL with AOL Instant Messenger, MSN with Microsoft Messenger,...

    Vincent Live Messenger-开源

    Vincent Live Messenger是一个用Java编写的开源可换肤多平台MSN(WLM)客户端。 它将实现并扩展官方MSN(WLM)客户端的功能。

    MSN to XMPP-开源

    提供一个 Java 库,允许不支持 MSN(例如 iChat)但支持 XMPP(又名 Jabber)的客户端使用 MSN。 使用 Java MSN Messenger 库 (JML)。

    基于java scoket的聊天工具开题报告

    2000年前后,全球范围内的IM普及已经展开,在美国,AOL收购ICQ,微软推出MSN,雅虎推出Messenger。不同从业者的加入极大的推动了IM产品在应用层面的发展,逐渐地,用户的交流已经不满足于单纯的文字沟通,他们需要...

    Anastacia Messenger-开源

    Anastacia Messenger是一个多协议即时通讯工具,目前支持ICQ,MSN和Yahoo。 它使用Java编写,为使用不同操作系统的人们提供了一种解决方案,使他们有机会在任何地方使用相同的Messenger / GUI。

    JMSN-开源

    JMSN是纯Java Microsoft MSN Messenger克隆,包括即时消息,文件发送/接收,msnlib(供开发人员使用)和其他聊天日志等。JMSN具有MSN所没有的许多有趣功能。

    theClient-开源

    theClient是基于Java的标准MSN Messenger即时消息传递软件的替代产品,旨在不仅提供当前MSN Messenger客户端的几乎所有现有功能,而且还添加了大量的附加功能。

    MSNj-开源

    支持Java中的MSN Messenger协议的库。

    Casanova-开源

    Java中的Microsoft MSN Messenger客户端/库

    jitsi-2.8.5426-x64

    Jitsi是当最功能最完整的高级通信工具。Jitsi让你可以在同一个软件中连到Facebook、GoogleTalk、XMPP、Windows Live、Yahoo!、AIM和ICQ进行通信。 Jitsi 是Java 编写的开源的、多平台的音频/视频网络电话和即时通信...

    bims-4-mobiles:从 code.google.compbims-4-mobiles 自动导出

    有趣、快速且易于使用,BIMS 利用蓝牙技术在线搜索朋友并与他们聊天,就像您在计算机上使用 MSN/Windows Live Messenger、ICQ、Yahoo AIM 或其他即时消息程序一样.未来计划支持图片传输,支持LaTeX。

    java irc and chatting tool-开源

    JIRC_Chatting是一个基于Java的客户端/服务器应用程序(聊天和IRC工具),您可以在其中创建自己的服务器,还可以连接到公共IRC的..还支持普通的聊天功能,例如msn-messenger或icq! (ALPHA开发阶段!)

    GQMessenger-开源

    开源的多合一即时通讯客户端。 客户包括AOL OSCAR,IRC,MSN Messenger,Yahoo!。 Messenger和ICQ(OSCAR)。 用Java编写,用于跨平台支持。

Global site tag (gtag.js) - Google Analytics