JML实现控制台界面的MSN客户端(不支持离线发消息)

来源:互联网 发布:北京外国语网络教育 编辑:程序博客网 时间:2024/05/29 17:44

IM.java


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.sun.xml.internal.bind.v2.runtime.reflect.Accessor.SetterOnlyReflection;
import net.sf.jml.Email;
import net.sf.jml.MsnMessenger;
import net.sf.jml.MsnProtocol;
import net.sf.jml.MsnUserStatus;
import net.sf.jml.impl.MsnMessengerFactory;

   /**
     * BY 黄金 RY0821119@buaa     

     * 欢迎转载,请注明作者,谢谢!
     */


public class IM implements Runnable{

   
    private MsnMessenger messenger;// msn
   
    // msn

    private String receiveMessage;
    private String errorText;
    private String serverName;
    private String email;
    private String password;
   

    public void login(String serverName, String email, String password) {
        // TODO Auto-generated method stub
        String result = "";
        this.serverName=serverName;
        this.email=email;
        this.password=password;
        if (serverName.equals("") || email.equals("") || password.equals("")) {
            result = "{/"type/":/"error/",/"body/":{/"reason/":/"参数servername、email、password都不能为空!/"}}";
            System.out.println(result);
        }
           
        this.MSNLogin(email, password);
           
    }
    private void MSNLogin(String email, String password) {
        MsnMessenger messenger = null;
        messenger = MsnMessengerFactory.createMsnMessenger(email, password);// 创建MsnMessenger
        messenger
                .setSupportedProtocol(new MsnProtocol[] { MsnProtocol.MSNP12 });// 设置登录协议
        messenger.getOwner().setInitStatus(MsnUserStatus.ONLINE);// 设置用户状态
        messenger.addListener(new MsnListener(messenger));// 注册事件
        messenger.login();// 登录
        setMessenger(messenger);
       
           
    }
    public void logout() {
        messenger.logout();
       
    }

    public void sendMessage(String emailTo,String content) {
        String result = "";
       
            if (serverName.equals("msn")) {
                getMessenger().sendText(Email.parseStr(emailTo), content);
                result = "{/"type/":/"sucsses/"}";
                //System.out.println(result);
                System.out.println("["+new SimpleDateFormat("MM-dd HH:mm").format(new Date())+"] "+"我对"+emailTo+ "说:"+content);
            } else {
                result = "{/"type/":/"error/",/"body/":{/"reason/":/"你还没有登入MSN!/"}}";
                //System.out.println(result);
            }   
       
    }
    public void receiveMessage() {
        if (serverName.equals("msn")) {
            //String result = "{/"type/":/"sucsses/",/"body/":{/"text/":/""+ getReceiveMessage() + "/"}}";
            setReceiveMessage(null);
            //System.out.println(result);
            } else {
                //String result = "{/"type/":/"error/",/"body/":{/"reason/":/"对方还没有回复!/"}}";
                //System.out.println(result);
        }             
    }

   

    public MsnMessenger getMessenger() {
        return messenger;
    }

    public void setMessenger(MsnMessenger messenger) {
        this.messenger = messenger;
    }

    public String getReceiveMessage() {
        return receiveMessage;
    }

    public void setReceiveMessage(String receiveMessage) {
        this.receiveMessage = receiveMessage;
    }

    public String getErrorText() {
        return errorText;
    }

    public void setErrorText(String errorText) {
        this.errorText = errorText;
    }
   
    public void run(){
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
        }
        String content = null;
        String emailTo = null;
        while(true){
         try{
            BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
            String input=in.readLine();
            String[] temp=input.split(":",2);
            if(temp.length==2){
                emailTo=temp[0];
                content=temp[1];
            }
            if(temp.length==1){
                if(emailTo!=null)
                    content=temp[0];
                else
                    System.err.println("未指定联系人!");
            }
        }catch(IOException e){
        }
        this.sendMessage(emailTo,content);
        Thread.yield();
        }
    }
   
    public static void main(String[] args){
        IM msn = new IM();
        msn.login("msn", "********@hotmail.com", "********");
        msn.run();   
    }
}

 

MsnListener.java

 

import java.text.SimpleDateFormat;
import java.util.Date;

import net.sf.jml.MsnContact;
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.impl.MsnContactImpl;

import net.sf.jml.message.MsnControlMessage;
import net.sf.jml.message.MsnDatacastMessage;
import net.sf.jml.message.MsnInstantMessage;
import net.sf.jml.message.MsnSystemMessage;
import net.sf.jml.message.MsnUnknownMessage;

    /**
     * BY 黄金 RY0821119@buaa

     * 欢迎转载,请注明作者,谢谢!
     */

public class MsnListener extends MsnAdapter {
    private MsnMessenger messenger = null;
    private String user_id;
   

    /** Creates a new instance of msntest */
    public MsnListener(MsnMessenger messenger) {
        this.messenger=messenger;
       
    }
   
    public MsnListener() {
       
    }

    // 打印信息
    private static void msg(Object obj) {
        SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm");
        if (obj instanceof Throwable)
            System.err.println("[" + sdf.format(new Date()) + "] " + obj);
        else
            System.out.println("[" + sdf.format(new Date()) + "] " + obj);
    }

   

    // 收到正常信息的时候发生
    public void instantMessageReceived(MsnSwitchboard switchboard,
            MsnInstantMessage message, MsnContact contact) {
        msg(contact.getDisplayName() + "对我说:" + message.getContent());
        // 如果聊天内容为exit,退出
//        if (message.getContent().trim().equalsIgnoreCase("exit")) {
//            msg(contact.getDisplayName() + "对我发出退出指令。");
//            messenger.logout();
//            //System.exit(0);
//        }
//        String email = messenger.getOwner().getEmail().getEmailAddress();
//       
        //System.out.println(email);
//        if(IM.getReceiveMessage()!=null){
//            String text = IM.getReceiveMessage()+"/r/n"+contact.getDisplayName() + "对我说:" + message.getContent();
//            IM.setReceiveMessage(text);
//        }
//        else{
//            IM.setReceiveMessage(contact.getDisplayName() + "对我说:" + message.getContent());
//        }
    }

    // 收到系统信息的时候发生,登录时
    public void systemMessageReceived(MsnMessenger messenger,
            MsnSystemMessage message) {
        // msg(messenger + " recv system message " + message);
    }

    // 当在联系人聊天窗口获得光标并按下第一个键时发生
    public void controlMessageReceived(MsnSwitchboard switchboard,
            MsnControlMessage message, MsnContact contact) {
        msg(contact.getFriendlyName() + "正在输入文字。");
    }

    // 异常时发生
    public void exceptionCaught(MsnMessenger messenger, Throwable throwable) {
        //msg(messenger + throwable.toString());
        msg(throwable);
        //System.out.println(throwable);
        //String email = messenger.getOwner().getEmail().getEmailAddress();

    }

    // 登录完成时发生
    public void loginCompleted(MsnMessenger messenger) {
        msg(messenger.getOwner().getDisplayName() + "登录成功!");
        String email = messenger.getOwner().getEmail().getEmailAddress();
        messenger.getOwner().setDisplayName("黄金");
    }

    public MsnMessenger getMessenger() {
        return messenger;
    }

    public void setMessenger(MsnMessenger messenger) {
        this.messenger = messenger;
    }

    public String getUser_id() {
        return user_id;
    }

    public void setUser_id(String user_id) {
        this.user_id = user_id;
    }

    // 注销时发生
    public void logout(MsnMessenger messenger) {
        msg(messenger + " logout");
        //String email = messenger.getOwner().getEmail().getEmailAddress();
       
    }

    // 收到系统广播信息时发生
    public void datacastMessageReceived(MsnSwitchboard switchboard,
            MsnDatacastMessage message, MsnContact friend) {
        msg(switchboard + " recv datacast message " + message);
        switchboard.sendMessage(message, false);
    }

    // 收到目前不能处理的信息时发生
    public void unknownMessageReceived(MsnSwitchboard switchboard,
            MsnUnknownMessage message, MsnContact friend) {
        // msg(switchboard + " recv unknown message " + message);
    }

    public void contactListInitCompleted(MsnMessenger messenger) {
        listContacts();
    }

    /** */
    /**
     * 更新好友列表完成时发生
     */
//    public void contactListSyncCompleted(MsnMessenger messenger) {
//        listContacts();
//    }

    /** */
    /**
     * 关闭一个聊天窗口时发生
     */
    public void switchboardClosed(MsnSwitchboard switchboard) {
        //msg("switchboardEnded " + switchboard);
    }

    /** */
    /**
     * 打开一个聊天窗口时发生
     */
    public void switchboardStarted(MsnSwitchboard switchboard) {
        //msg("switchboardStarted " + switchboard);
    }

    // 打印联系人
    private void listContacts() {
        MsnContact[] cons = messenger.getContactList().getContactsInList(
                MsnList.AL);
        if (cons.length == 0)
            msg("空");
        else
            msg("你现在有" + cons.length + "个联系人");
        for (int i = 0; i < cons.length; i++) {
            String personal = ((MsnContactImpl) cons[i]).getPersonalMessage()
                    .equals("") ? "空" : ((MsnContactImpl) cons[i])
                    .getPersonalMessage();
            msg(cons[i].getDisplayName() + " " + cons[i].getEmail() + " "
                    + cons[i].getStatus() + " " + personal);
        }
    }

}

 

 

使用说明:

登陆成功后,如果想向在线的朋友发信息,采用“对方账号:我要发的信息”这种格式发送消息,例如“abc@hotmail.com:Hello!”

如果下次还是向同一个人发消息,可以直接发送消息而不写对方账号,例如

“Hello!”

 

大家可以开一个MSN正式客户端和这个MSN客户端收发消息,是好用的版本O(∩_∩)O哈哈~

原创粉丝点击