⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msnmidlet.java

📁 J2me实现的MSN Messeger客户端程序。聊天、添加好友、删除好友、阻止好友
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
package vitular.msnclient;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import vitular.msnp.event.*;
import vitular.msnp.entity.*;
import vitular.msnp.*;
import vitular.msnp.msg.*;
import vitular.msnp.BuddyList;
import java.util.Hashtable;
import vitular.ui.*;
import java.util.Vector;
import java.util.TimerTask;
import java.util.Timer;

/**
 * <p>Title: msn客户端</p>
 * <p>Description: 应用程序</p>
 * <p>Copyright: Copyright (c) 2004</p>
 * <p>Company: 维度动力</p>
 * @author JJ
 * @version 1.0
 */

public class msnMIDlet extends MIDlet implements MsnListener, CommandListener{
  static msnMIDlet instance;
  static final boolean DEBUG = true;
  private static final String[] login_menu_item = {"登陆MSN","设置默认用户","声音:开","帮  助","关  于","退  出"};

  static final byte STATUS_SPLASH = 0;  //闪屏
  static final byte STATUS_MENU_LOGIN = 1; //登陆菜单
  static final byte STATUS_MENU_MSN = 2; //MSN操作菜单
  static final byte STATUS_MENU_GROUP = 3; //分组菜单
  static final byte STATUS_MENU_FRIEND = 4; //分组内部好友名单
  static final byte STATUS_TEXTBOARD = 5;//显示文本板
  static final byte STATUS_FLASH = 6; //显示动画
  static final byte STATUS_FORM_LOGIN = 7;//登陆姓名框
  //static final byte STATUS_FORM_ASKNAME = 8; //询问姓名框
  static final byte STATUS_FORM_ADDBUDDY = 9; //添加好友
  static final byte STATUS_FORM_DELBUDDY = 10; //添加好友
  static final byte STATUS_FORM_INPUT = 11; //输入消息框
  static final byte STATUS_FORM_TEXT = 12; //显示消息框
  static final byte STATUS_MENU_MSG = 13; //未读消息菜单
  static final byte STATUS_MENU_OPERATION = 14; //操作菜单
  static final byte STATUS_MENU_ALLBUDDY = 15; //显示所有联系人
  static final byte STATUS_SAVE_MSG = 16; //存储消息
  static final byte STATUS_MENU_OLDMSG = 17; //查看保存的信息
  static final byte STATUS_DEL_MSG = 18; //删除消息状态

  static final int MENU_STRING_MAX_WIDTH = 80;//菜单项文字的最大宽度
  static final short MSG_MAX_COUNT = 20; //最多保存的记录数

  private static final String STR_HELP = "就是说怎么用这个东西";
  private static final String STR_ABOUT = "版本号啦";
  private byte loginError; //记录登陆错误数

  private byte status; //记录当前的状态
  //private byte oldStatus; //记录原来的状态
  private Image[] img_menu_img; //menuMsn的图片
  private static final String[] img_menu_item = {"添加联系人", "删除联系人","查看在线联系人","查看未读信息","查看保存的信息","注销"};

  private Vector msgUnreadVec; //未读信息列表
  //private Vector friendUnreadVec; //纪录对应扇面列表的发消息的好友的名字
  private ImgMenu menuMain; //主菜单
  private ImgMenu menuUnreadMsg;//未读消息菜单
  private ImgMenu menuFriendList; //好友列表菜单
  private ImgMenu menuOperation; //对好友的操作菜单
  private ImgMenu menuAllFriendList;//全部好友的列表
  private ImgMenu menuOldMsg; //历史消息列表
  private ImgMenu menuMsn;//msn菜单

  private Vector buddyOnline; //在线好友
  private Hashtable hashBuddyMsgCount; //用于记录好友发来的未读消息的数目


  UIControl canvas;
  MsgForm form;
  TextBox textbox;
  MSNMessenger msnMessenger;
  MsgDB db;



  String username = new String("ceze_dang@hotmail.com");
  String password = new String("cezedang");//用户名,密码
  private Image imgFlash;
  private boolean bSoundOn = true;//声音开关的状态
  private String flashStr;//播放动画的时候显示的文字
  private String textboxStr; //textbox中的文字
  private String leftCmdStr, rightCmdStr;//左右command显示的文字
  private String textboardTitle, textboardContent; //文本板的标题和内容
  private byte leftStatus, rightStatus;//左右的command被按下时应切换的状态
  //private int[] groupOnlineNumList; //好友分组的在线人数
  private int selOnlineFriend = -1; //当前选中的在线好友

  public msnMIDlet() {
    instance = this;
    status = 0;
    //初始化 canvas
    canvas = new UIControl();
    canvas.setCommandListener(this);
    Display.getDisplay(this).setCurrent(canvas);
    //初始化loginForm
    form = new MsgForm("", MsgForm.T_LOGIN);
    form.setCommandListener(this);
    //初始化textBox
    textbox = new TextBox("写信息", null, 100, TextField.ANY);
    textbox.addCommand(new Command("确定", Command.ITEM, 1));
    textbox.addCommand(new Command("取消", Command.ITEM, 1));
    textbox.setCommandListener(this);
    //初始化其他的内容
    flashStr = "";
    textboxStr = "";
    leftCmdStr = rightCmdStr = "";
    textboardTitle = textboardContent = "";
    leftStatus = rightStatus = 0;
    loginError = 0;
    username = form.getItemString(MsgForm.ITEM_LOGINNAME);
    password = form.getItemString(MsgForm.ITEM_PASSWORD);
    msgUnreadVec = new Vector();

    bSoundOn = true;

    // Debug 信息
    Debug.printOutput = true;
    Debug.printInput = true;
//    Debug.printMime = true;
    //end
    //图片
    try{
      imgFlash = Image.createImage("/res/flashmenu.png");
      img_menu_img = new Image[6];
      for (int i = 1; i <= 6; i++) {
        String s = "/res/menu" + i + ".png";
        Image img = Image.createImage("/res/menu" + i + ".png");
        img_menu_img[i-1] = img;//Image.createImage("/res/menu" + i + ".png");
      }

    }
    catch(Exception e){
      System.out.println("msnMIDlet error:" + e.toString());
    }
    try{
      //菜单
      menuMain = new ImgMenu(canvas, false);
      menuMain.setFlashImg(imgFlash);
      for (int i = 0; i < 6; i++) {
        menuMain.addItem(login_menu_item[i]);
      }

      menuUnreadMsg = new ImgMenu(canvas, false);
      menuUnreadMsg.setAlignType(ImgMenu.ALIGN_LEFT);

      menuFriendList = new ImgMenu(canvas, false);
      menuFriendList.setFlashImg(imgFlash);
      menuFriendList.setAlignType(ImgMenu.ALIGN_LEFT);

      menuOperation = new ImgMenu(canvas, false);
      menuOperation.addItem("送信息");
      menuOperation.addItem("察看未读信息");
      menuOperation.addItem("删除联系人");

      menuAllFriendList = new ImgMenu(canvas, false);
      menuAllFriendList.setAlignType(ImgMenu.ALIGN_LEFT);

      menuOldMsg = new ImgMenu(canvas, false);
      menuOldMsg.setAlignType(ImgMenu.ALIGN_LEFT);

      menuMsn = new ImgMenu(canvas, true);
      for (int i = 0; i < 6; i++){
         menuMsn.addItem(img_menu_item[i], img_menu_img[i]);
       }
      canvas.resetImgMenu(menuMsn);



      //在线好友
      buddyOnline = new Vector();
      //好友消息列表
      hashBuddyMsgCount = new Hashtable();
      //历史信息
      db = new MsgDB("oldmsg2");
      loadOldMsg();
    }catch(Exception e){
      System.out.println("MsnL...init error"+ e.toString());
    }
  }

  public void startApp() {

  }

  public void pauseApp() {
  }

  public void destroyApp(boolean unconditional) {
  }

  public static void quitApp() {
    instance.destroyApp(true);
    instance.notifyDestroyed();
    instance = null;
  }

//  /**
//   * 改变当前的显示状态
//   * @param status byte
//   */
//  public void changeStatus(byte status){
//    switch(status){
//      case STATUS_FORM_LOGIN:
//        form.changeFormType(MsgForm.T_LOGIN);
//        Display.getDisplay(this).setCurrent(form);
//        break;
//      case STATUS_FORM_ASKNAME:
//        form.changeFormType(MsgForm.T_ASKNAME);
//        Display.getDisplay(this).setCurrent(form);
//        break;
//
//    }
//  }


//监听MsnListener的消息
  /**
   * 登陆完成
   * @param own MsnFriend
   */
  public void loginComplete(MsnFriend own){
    System.out.println("loginComplete");
    canvas.stopFlash();
    setStatus(STATUS_MENU_MSN);
    freshMenuAllFriendList();
  }

  /**
   * 登陆错误
   * @param header String
   */
  public void loginError(String header){
    System.out.println(header);
    if (loginError++ < 3){//重新尝试登陆
      //msnMessenger.login();
    }else{
      canvas.stopFlash();
      this.showTextBoard("登陆MSN失败!$请确认用户名及密码后再试", "错误", "确定", "",
                         STATUS_MENU_LOGIN, this.status);
    }

  }

  /**
   * ??
   */
  public void listOnline(MsnFriend friend){
    freshBuddyOnLineVec();
    System.out.println(".....MsnL.....listOnline" + friend.getFriendlyName());
  }

  /**
   * 好友上线,或状态发生改变
   * @param friend MsnFriend
   */
  public void userOnline(MsnFriend friend){
    freshBuddyOnLineVec();
    System.out.println(".....MsnL.....userOnline" +friend.getFriendlyName());
  }

  /**
   * 好友下线
   * @param loginName String
   */
  public void userOffline(String loginName){
    freshBuddyOnLineVec();
    System.out.println("MsnL.....userOffline" + loginName);
  }

  /**
   * 开始一个中转服务器session
   * @param ss SwitchboardSession
   */
  public void switchboardSessionStarted(SwitchboardSession ss){

  }

  /**
   * 某好友加入到一个会话中
   * @param ss SwitchboardSession 会话中转服务器session
   * @param join MsnFriend 好友
   */
  public void whoJoinSession(SwitchboardSession ss, MsnFriend join){
    System.out.println("MsnL.....whoJoinSession" + join.getFriendlyName());
  }

  /**
   *  好友离开ss此会话
   * @param ss SwitchboardSession
   * @param part MsnFriend
   */
  public void whoPartSession(SwitchboardSession ss, MsnFriend part){
    System.out.println("whoPartSession" + part.getFriendlyName());
  }


  /**
   * 会话中转服务器结束
   * @param ss SwitchboardSession
   */
  public void switchboardSessionEnded(SwitchboardSession ss){

  }

  /**
  *  放弃???
  */
  public void switchboardSessionAbandon(SwitchboardSession ss,
                                        String targetName){

  }

  /**
   * 好友正在输入文字
   * @param ss SwitchboardSession 中转服务器session
   * @param friend MsnFriend
   * @param typingUser String
   */
  public void progressTyping(SwitchboardSession ss,
                             MsnFriend friend, String typingUser){
     System.out.println("MsnL.....progressTyping" +typingUser);
  }

  /**
   * 即时消息进入
   * @param ss SwitchboardSession 中转服务器session
   * @param friend MsnFriend
   * @param mime MimeMessage
   */
  public void instantMessageReceived(SwitchboardSession ss,
                                     MsnFriend friend, MimeMessage mime){
//    System.out.println("instantMessageReceived form "
//                       +friend.getFormattedFriendlyName() + ":"+ mime.getMessage());
    Msg msg = new Msg(mime.getMessage(),
                      Util.getCurTime(),
                      friend.getLoginName());
    //向未读消息列表中添加一项
    msgUnreadVec.addElement(msg);

    //向好友未读消息统计表中添加一项
    Integer n = (Integer)hashBuddyMsgCount.get(friend.getLoginName());
    if (n != null){//不为空,说明原来就有该好友的未读消息
      hashBuddyMsgCount.put(friend.getLoginName(), new Integer(n.intValue()+1));
    }else{
      hashBuddyMsgCount.put(friend.getLoginName(), new Integer(1));
      flashFriendMenu(friend.getLoginName(), true);
    }
    notifyCanvasNewMessage();
//    try{
//      msnMessenger.sendMessage(friend.getLoginName(), mime);
//    }
//    catch(Exception e){}
    }

  /**
   * 告诉canvas受到了新消息
   * canvas的信息做相应的改变
   * 在instantMessageReceived中被调用
   */
  private void notifyCanvasNewMessage(){
    System.out.println("MsnL.....notifyCanvasNewMessage: unreadmsg "+ msgUnreadVec.size());
    canvas.showMsg(true);
    canvas.setMsg("有"+msgUnreadVec.size()+"条未读信息,按5查看");
    canvas.playSound();
    //String strList[] = new String[msgUnreadVec.size()];
    //boolean  bList[] = new boolean[msgUnreadVec.size()];
    menuUnreadMsg.removeAllItem();
    Font font = menuUnreadMsg.getFont();
    for (int i = 0; i < msgUnreadVec.size(); i++){
      //strList[i] = ((Msg)msgUnreadVec.elementAt(i)).getName().substring(0,5) + "...";
      menuUnreadMsg.addItem(Util.getShowString(font, ((Msg)msgUnreadVec.elementAt(i)).getMsg(),
                                                   MENU_STRING_MAX_WIDTH, "..."));
      //menuUnreadMsg.addItem(((Msg)msgUnreadVec.elementAt(i)).getName().substring(0,5) + "...");
      //bList[i] = false;
    }
    //canvas.resetTextMenu(menuUnreadMsg);
    //canvas.resetTextMenu(strList, bList);

  }

  /**
   * 设置指定名字的菜单项的闪烁情况
   * @param loginName String 好友的账号
   * @param bFlash boolean 是否闪烁
   */
  private void flashFriendMenu(String loginName, boolean bFlash){
    System.out.println("MsnL.....flashFriendMenu:" + loginName + "bfalsh = " + bFlash);

    for (int i = 0; i < buddyOnline.size(); i++){
      if (((MsnFriend)buddyOnline.elementAt(i)).getLoginName().equals(loginName)){
        this.menuFriendList.flashMenuItem(i, bFlash);
        return;
      }
    }
  }

  /**
   * 更新buddyOnline列表
   */
  private void freshBuddyOnLineVec(){
    BuddyList  forwardList = msnMessenger.getBuddyGroup().getForwardList();

try{

      menuFriendList.removeAllItem();
      buddyOnline.removeAllElements();
      Font font = menuFriendList.getFont();
      for (int i = 0; i < forwardList.size(); i++) {
        //只有当对方为空闲状态时才显示为在线联系人
        System.out.println(forwardList.get(i).getLoginName() + "'s state = " + forwardList.get(i).getStatus());
        if (!(forwardList.get(i).getStatus().equals("FLN") || forwardList.get(i).getStatus().equals("HDN"))){
          buddyOnline.addElement(forwardList.get(i));
          menuFriendList.addItem(Util.getShowString(font,
                                                    forwardList.get(i).getFriendlyName()
                                                   , MENU_STRING_MAX_WIDTH,
                                                   "..."));
//          if (forwardList.get(i).getFriendlyName().length() > 8)
//            menuFriendList.addItem(forwardList.get(i).getFriendlyName().substring(
//                0, 8)+"...");
//          else
//            menuFriendList.addItem(forwardList.get(i).getFriendlyName());
          if (hashBuddyMsgCount.get(forwardList.get(i).getLoginName()) != null){
            menuFriendList.flashMenuItem(i, true);
          }
        }
      }
       canvas.resetTextMenu(menuFriendList);
      System.out.println("forwardList.size =  " + forwardList.size());
    }catch(Exception e){
      System.out.println("showOnlineBuddy error: "+e.toString());
    }

  }

  /**
   * 从menuUnreadMsg中读取第index条信息
   * @param index int
   * @return String 信息内容
   */
  private String readMsg(int index){
    String myMsg = ((Msg) msgUnreadVec.elementAt(index)).toString();
    String s =  Util.getField(myMsg, 1, "$");
    Integer n = (Integer) hashBuddyMsgCount.get(s);
    if (n != null) {
      if (n.intValue() == 1){
        hashBuddyMsgCount.remove(Util.getField(myMsg, 1, "$"));
        flashFriendMenu(Util.getField(myMsg, 1, "$"), false);
      }else{
        hashBuddyMsgCount.put(Util.getField(myMsg, 1, "$"), new Integer(n.intValue()-1));
      }
    }
    msgUnreadVec.removeElementAt(index);
    this.menuUnreadMsg.removeItemAt(index);
    if (msgUnreadVec.size() == 0)
       canvas.showMsg(false);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -