예제 #1
0
  /**
   * 读消息以及处理消息,抛出异常
   *
   * @throws IOException
   * @throws ClassNotFoundException
   */
  public void readMessage() throws IOException, ClassNotFoundException {
    Object readObject = ois.readObject(); // 从流中读取对象
    UserDao dao = UserDaoFactory.getInstance(); // 通过dao模式管理后台
    if (readObject != null && readObject instanceof TranObject) {
      TranObject<?> readTranObject = (TranObject<?>) readObject; // 转换成传输对象
      switch (readTranObject.getType()) {
        case REGISTER: // 如果用户是注册
          User registerUser = (User) readTranObject.getObject();
          int registerResult = dao.register(registerUser);
          System.out.println(MyDate.getDateCN() + " 新用户注册:" + registerResult);
          // 给用户回复消息
          TranObject<User> register2TranObject = new TranObject<User>(TranObjectType.REGISTER);
          User register2user = new User();
          register2user.setId(registerResult);
          register2TranObject.setObject(register2user);
          out.setMessage(register2TranObject);
          break;
        case LOGIN:
          User loginUser = (User) readTranObject.getObject();
          ArrayList<User> list = dao.login(loginUser);
          TranObject<ArrayList<User>> login2Object =
              new TranObject<ArrayList<User>>(TranObjectType.LOGIN);
          if (list != null) { // 如果登录成功
            TranObject<User> onObject = new TranObject<User>(TranObjectType.LOGIN);
            User login2User = new User();
            login2User.setId(loginUser.getId());
            onObject.setObject(login2User);
            for (OutputThread onOut : map.getAll()) {
              onOut.setMessage(onObject); // 广播一下用户上线
            }
            map.add(loginUser.getId(), out); // 先广播,再把对应用户id的写线程存入map中,以便转发消息时调用
            login2Object.setObject(list); // 把好友列表加入回复的对象中
          } else {
            login2Object.setObject(null);
          }
          out.setMessage(login2Object); // 同时把登录信息回复给用户

          System.out.println(MyDate.getDateCN() + " 用户:" + loginUser.getId() + " 上线了");
          break;
        case LOGOUT: // 如果是退出,更新数据库在线状态,同时群发告诉所有在线用户
          User logoutUser = (User) readTranObject.getObject();
          int offId = logoutUser.getId();
          System.out.println(MyDate.getDateCN() + " 用户:" + offId + " 下线了");
          dao.logout(offId);
          isStart = false; // 结束自己的读循环
          map.remove(offId); // 从缓存的线程中移除
          out.setMessage(null); // 先要设置一个空消息去唤醒写线程
          out.setStart(false); // 再结束写线程循环

          TranObject<User> offObject = new TranObject<User>(TranObjectType.LOGOUT);
          User logout2User = new User();
          logout2User.setId(logoutUser.getId());
          offObject.setObject(logout2User);
          for (OutputThread offOut : map.getAll()) { // 广播用户下线消息
            offOut.setMessage(offObject);
          }
          break;
        case MESSAGE: // 如果是转发消息(可添加群发)
          // 获取消息中要转发的对象id,然后获取缓存的该对象的写线程
          int id2 = readTranObject.getToUser();
          OutputThread toOut = map.getById(id2);
          if (toOut != null) { // 如果用户在线
            toOut.setMessage(readTranObject);
          } else { // 如果为空,说明用户已经下线,回复用户
            TextMessage text = new TextMessage();
            text.setMessage("亲!对方不在线哦,您的消息将暂时保存在服务器");
            TranObject<TextMessage> offText = new TranObject<TextMessage>(TranObjectType.MESSAGE);
            offText.setObject(text);
            offText.setFromUser(0);
            out.setMessage(offText);
          }
          break;
        case REFRESH:
          List<User> refreshList = dao.refresh(readTranObject.getFromUser());
          TranObject<List<User>> refreshO = new TranObject<List<User>>(TranObjectType.REFRESH);
          refreshO.setObject(refreshList);
          out.setMessage(refreshO);
          break;
        default:
          break;
      }
    }
  }
예제 #2
0
파일: InputThread.java 프로젝트: CraftIRC/3
 /**
  * Sends a raw line to the IRC server as soon as possible, bypassing the outgoing message queue.
  *
  * @param line The raw line to send to the IRC server.
  */
 void sendRawLine(String line) {
   OutputThread.sendRawLine(_bot, _bwriter, line);
 }