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

📄 chatserver.java

📁 打包
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
          addOnlineUser(user);
          if (broadcastExcluding)
            broadcastExcluding(object, connection);
          else
            broadcast(object);
        }
      }
    }

    else if (object instanceof ServerAdministrationRequest) {
      if (((ServerAdministrationRequest)object).key.equals(key)) {
        ((ServerAdministrationRequest)object).status = ServerAdministrationRequest.ACCEPTED;

        if (object instanceof ServerStopRequest) {
          Enumeration connectionEnum;
          Connection closingConnection;
          String[] command;

          try {
            log("Stopping server...");

            listener.close();
            serverThread.stop();

            connectionEnum = connectionVector.elements();
            while (connectionEnum.hasMoreElements()) {
              closingConnection = (Connection)connectionEnum.nextElement();
              if (closingConnection.getUserId() != 0)
                closeConnection(closingConnection);
            }

            Runtime.getRuntime().exit(0);

          }
          catch (IOException excpt) {
            log("Exception while stopping server: " + excpt);
          }
        }
        else if (object instanceof ServerUserListRequest) {
          log("Sending user list...");
          ((ServerUserListRequest)object).userListVector = getUserListVector();
          send(object, connection);
        }
        else if (object instanceof ServerGetUserDataRequest) {
          log("Retrieving data for user " + ((ServerGetUserDataRequest)object).user.getName());
          user = loadUser(((ServerGetUserDataRequest)object).user.getName());
          if (user != null) {
            ((ServerGetUserDataRequest)object).user.setPassword(user.getPassword());
            ((ServerGetUserDataRequest)object).user.setEmail(user.getEmail());
          }
          else {
            log("Error: User " + ((ServerGetUserDataRequest)object).user.getName() + " doesn't exist");
            ((ServerGetUserDataRequest)object).status = ServerAdministrationRequest.ERROR_OCCURED;
          }
          send(object, connection);
        }
        else if (object instanceof ServerUpdateUserDataRequest) {
          log("Updating data for user " + ((ServerUpdateUserDataRequest)object).user.getName());
          user = loadUser(((ServerUpdateUserDataRequest)object).user.getName());
          if (user != null) {
            user.setPassword(((ServerUpdateUserDataRequest)object).user.getPassword());
            user.setEmail(((ServerUpdateUserDataRequest)object).user.getEmail());
            saveUser(user);
            if (isOnline(user.getName()))
              handleUserUpdateEvent(new UserUpdateEvent(user), getConnection(user.getId()));
          }
          else {
            log("Error: User " + ((ServerUpdateUserDataRequest)object).user.getName() + " doesn't exist");
            ((ServerGetUserDataRequest)object).status = ServerAdministrationRequest.ERROR_OCCURED;
          }
          send(object, connection);
        }
        else if (object instanceof ServerDeleteUserRequest) {
          log("Deleting user " + ((ServerDeleteUserRequest)object).userName);
          userName = ((ServerDeleteUserRequest)object).userName;
          if (exists(userName)) {
            if (isOnline(userName))
              closeConnection(getConnection(getOnlineUserId(userName)));
            deleteUser(userName);
          }
          else {
            log("Error: User " + ((ServerDeleteUserRequest)object).userName + " doesn't exist");
            ((ServerDeleteUserRequest)object).status = ServerAdministrationRequest.ERROR_OCCURED;
          }
          send(object, connection);
        }
      }
      else {
        log("Wrong server key");
        ((ServerAdministrationRequest)object).status = ServerAdministrationRequest.DENIED;
        send(object, connection);
      }
    }
  }


/**
 * Handles a UserLoginRequest that has been accepted.
 *
 * @param loginRequest      the UserLoginRequest
 * @param connection        the Connection that received the UserLoginRequest
 */

  public synchronized void handleAcceptedUserLoginRequest(UserLoginRequest loginRequest, Connection connection) {
    User user;
    Room room;
    UserLoginEvent loginEvent;
    Enumeration userEnum, roomEnum;

    loginRequest.user.setId(getNextAvailableUserId());
    loginRequest.user.setRoom(0);
    loginRequest.user.setLoginDate(new Date());
    addOnlineUser(loginRequest.user);
    connection.setUserId(loginRequest.user.getId());
    send(loginRequest, connection);
    /*
    roomEnum = roomTable.elements();

    while(roomEnum.hasMoreElements()) {
      room = (Room)((Room)roomEnum.nextElement()).clone();
      room.removeAllUsers();
      if (room.getId() != 0)
        send(new RoomCreateEvent(room), connection);
    }
    */

    send(new RoomListEvent(roomTable), connection);

    userEnum = onlineTable.elements();

    while(userEnum.hasMoreElements()) {
      user = (User)userEnum.nextElement();
      if (user.getId() != loginRequest.user.getId()) {
        send(new UserLoginEvent(user), connection);
      }
    }

    loginEvent = new UserLoginEvent(loginRequest.user);
    broadcastExcluding(loginEvent, connection);

  }


/**
 * Handles an UserUpdateEvent.
 *
 * @param updateEvent      the UserUpdateEvent
 * @param connection       the Connection that received the UserUpdateEvent
 */

  public synchronized void handleUserUpdateEvent(UserUpdateEvent updateEvent, Connection connection) {
    log("Handling user update...");
    addOnlineUser(updateEvent.user);
    send(updateEvent, connection);
    updateEvent.user.setPassword("");
    updateEvent.statusString = "";
    broadcastExcluding(updateEvent, connection);
  }


/**
 * Handles an RoomUpdateEvent.
 *
 * @param updateEvent      the RoomUpdateEvent
 * @param connection       the Connection that received the UserUpdateEvent
 */

  public synchronized void handleRoomUpdateEvent(RoomUpdateEvent updateEvent, Connection connection) {
    User user;
    Room room;
    Enumeration userEnum;

    log("Handling room update...");
    room = updateEvent.room;

    addRoom(room);
    broadcast(updateEvent);
    userEnum = onlineTable.elements();

    while(userEnum.hasMoreElements()) {
      user = (User)userEnum.nextElement();
      if (user.getRoom() == room.getId() && ((room.isPrivate() && !room.getInvitedUsers().contains(user.getName())) || (!room.isPrivate() && room.getKickedUsers().contains(user.getName())))) {
        user.setRoom(0);
        user.setPosition(getAvailablePosition(0));
        addOnlineUser(user);
        broadcast(new UserRoomEvent(user.getId(), user.getRoom(), user.getPosition()));
      }
    }
  }


/**
 * Handles an RoomRemoveEvent.
 *
 * @param updateEvent      the RoomRemoveEvent
 * @param connection       the Connection that received the UserUpdateEvent
 */

  public synchronized void handleRoomRemoveEvent(RoomRemoveEvent removeEvent, Connection connection) {
    User user;
    Room room;
    Enumeration userEnum;

    log("Handling room removal...");

    if ((room = (Room)roomTable.get(removeEvent.roomId)) != null) {

      userEnum = onlineTable.elements();

      while(userEnum.hasMoreElements()) {
        user = (User)userEnum.nextElement();
        if (user.getRoom() == room.getId()) {
          user.setRoom(0);
          user.setPosition(getAvailablePosition(0));
          addOnlineUser(user);
          broadcast(new UserRoomEvent(user.getId(), user.getRoom(), user.getPosition()));
        }
      }

      broadcast(removeEvent);
    }
  }


/**
 * Broadcasts a UserEvent over all except one Connection.
 *
 * @param broadcastObject         the UserEvent to be broadcasted
 * @param excludeConnection       the Connection to be excluded from the broadcast
 */

  public synchronized void broadcastExcluding(Object broadcastObject, Connection excludeConnection) {
    Enumeration connectionEnum;
    Connection broadcastConnection;

    log("Broadcasting...", LOGLEVEL3);

    connectionEnum = connectionVector.elements();
    while (connectionEnum.hasMoreElements()) {
      broadcastConnection = (Connection)connectionEnum.nextElement();
      if (broadcastConnection.getUserId() != 0 && broadcastConnection != excludeConnection)
        broadcastConnection.send(broadcastObject);
    }
  }


/**
 * Broadcasts a UserEvent over all Connections.
 *
 * @param broadcastObject      the UserEvent to be broadcasted
 */

  public synchronized void broadcast(Object broadcastObject) {
    broadcastExcluding(broadcastObject, null);
  }


/**
 * Sends a UserEvent or UserLoginRequest over one connection.
 *
 * @param broadcastObject      the UserEvent to be broadcasted
 */

  public synchronized void send(Object broadcastObject, Connection connection) {
    log("Sending...", LOGLEVEL3);
    connection.send(broadcastObject);
  }


/**
 * Closes a Connection.
 *
 * @param connection      the Connection to be closed
 */

  public void closeConnection(Connection connection) {
    log("Closing connection...");

    try {
      if (connection.getUserId() != 0) {
        broadcastExcluding(new UserLogoutEvent(connection.getUserId()), connection);
        getRoom(getOnlineUser(connection.getUserId()).getRoom()).removeUser(getOnlineUser(connection.getUserId()).getName());
      }
    }
    catch (Exception excpt) {
      log("Exception while closing connection: " + excpt);
    }
    removeOnlineUser(connection.getUserId());
    connectionVector.removeElement(connection);
    connection.close();
  }


/**
 * Returns the connection of a certain User currently being logged in.
 *
 * @param userIdParam      the User's id
 */

  public synchronized Connection getConnection(int userIdParam) {
    Enumeration connectionEnum;
    Connection connection;

    connectionEnum = connectionVector.elements();

    while (connectionEnum.hasMoreElements()) {
      connection = (Connection)connectionEnum.nextElement();
      if (connection.getUserId() == userIdParam)
        return connection;
    }

    return null;
  }


/**
 * Returns true if a Room of a given name exists.
 *
 * @param roomNameParam      the Room's name
 */

  public synchronized boolean roomExists(String roomNameParam) {
    Enumeration roomEnum;

    roomEnum = roomTable.elements();

    while(roomEnum.hasMoreElements()) {
      if (((Room)roomEnum.nextElement()).getName().equals(roomNameParam))
        return true;
    }
    return false;
  }


/**
 * Returns the true if a certain User is curently logged in.
 *
 * @param userIdParam      the User's id
 */

  public boolean isOnline(int userIdParam) {
    return onlineTable.containsKey(userIdParam);
  }


/**
 * Returns the true if a certain User is curently logged in.
 *
 * @param userNameParam      the User's name
 */

  public boolean isOnline(String userNameParam) {
    return getOnlineUserId(userNameParam) != -1;
  }

⌨️ 快捷键说明

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