📄 chatserver.java
字号:
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 + -