//package server; import java.util.Hashtable; import java.net.ServerSocket; import java.net.Socket; import java.io.ObjectOutputStream; import java.io.ObjectInputStream; import java.io.IOException; import java.util.Vector; public class CWIcqServerEngine extends CConnectionKeeper{ // Ther can be only one serve, though, variuos server interfaces. // So I choosed to MakeIt a Singleton ! private static CWIcqServerEngine instance = null; // User Manager Class to Control All users protected CUserManager userManager = null; // Default contructor // But also it Can not be instanciated by others // so It is protected !! can only be instanciated by the GetInstance Method // As you see my dear teacher a DO know a lot of things about OO : ) !! // REMARK:: it can be private but in this case, it will not be Instanciated by Derivated Calasses !! protected CWIcqServerEngine() { // .. super(); // Call CConnection Keeper userManager = CUserManager.getInstance(); } public static CWIcqServerEngine getInstance() { if ( instance == null ) { instance = new CWIcqServerEngine(); } return instance; } // Start Socket Service public boolean startServer() { checkConnection (); try { System.out.println("Starting Server: " + getHostName() + ": " + getPort() ); // Raise Servaer Tracking system .. new CServerStatusTracker ().start(); while (listening) { // accept pass to Server Listener .. new CServerListener( accept() ).start(); // So here a thread stay listening ... } // Close Server Connection socketServer.close(); return true; } catch (IOException ex) { System.out.println("deu merda no Start Server" + ex.getMessage()); ex.printStackTrace(); if (listening) { startServer(); } } return false; } public synchronized boolean requestLogin(int userId) { sendMessage(CServerMessageManager.getServerRequestLoginMessage(userId)); return true; } // this is used to Server to send a message to a given user or store the massage on his message queue public synchronized boolean sendMessage(CMessage msg) { try { CUser user = null; user = userManager.getUser( msg.getUserTo() ); if (user == null) return false; if ( user.isUserOnline() ) { user.getOutputStream().writeObject(new CMessage(msg)); user.getOutputStream().flush(); return true; } else { // if was the server trying to send message .. if (msg.getUserFrom() == CServerMessageManager.MESSAGE_FROM_SERVER ) { return false; } user = userManager.getUser(msg.getUserFrom()); if (user == null) { return false; } if (user.isUserOnline()) { user.getOutputStream().writeObject( CServerMessageManager.getOfflineMessage(user.getId()) ); user.getOutputStream().flush(); } userManager.saveOfflineMessage(msg.getUserFrom(),msg.getUserTo(),msg.getContent()); return true; } } catch(IOException ex) { ex.printStackTrace(); } catch (Exception ex){ ex.printStackTrace(); } return false; } public synchronized boolean sendGlobalMessage(CMessage msg) { try { CUser user = null; System.out.println("GLOBAL MESSAGE"); Vector temp = userManager.getAllUsers(); for (int i=0; i < temp.size();i++) { user = (CUser)temp.elementAt(i) ; if (user != null) { if (user.isUserOnline()) { user.getOutputStream().writeObject(msg); user.getOutputStream().flush(); } } else { return false; } } return true; } catch(IOException ex) { ex.printStackTrace(); } catch (Exception ex){ ex.printStackTrace(); } return false; } public synchronized CUser loginUser(CMessage msg , CUser client) { try { ObjectOutputStream userOutput = client.getOutputStream(); ObjectInputStream userInput = client.getInputStream(); CUser aRegUSer = userManager.getUser(msg.getUserFrom()); if (aRegUSer == null) { System.out.println("[Server]:Invalid USer"); userOutput.writeObject( CServerMessageManager.getLoginFailedMessage( client.getId() )); userOutput.flush(); userOutput.writeObject( CServerMessageManager.getServerRequestLoginMessage( client.getId() )); userOutput.flush(); return null; } aRegUSer.setUserOnline(); aRegUSer.setOutputStream(userOutput); aRegUSer.setInputStream(userInput); aRegUSer.setSocket(client.getSocket()); aRegUSer.getOutputStream().writeObject(CServerMessageManager.getLoginSuccessfulMessage( aRegUSer.getId() )); aRegUSer.getOutputStream().flush(); System.out.println("user logged (id):" + aRegUSer.getId() ); return aRegUSer; } catch (IOException ex) { ex.printStackTrace(); } return null; } public synchronized void logoutUser(CMessage msg) { try { CUser aRegUSer = userManager.getUser(msg.getUserFrom()); aRegUSer.setUserOffLine(); aRegUSer.getOutputStream().writeObject(CServerMessageManager.getCloseConnectionMessage( aRegUSer.getId() )); aRegUSer.getOutputStream().flush(); aRegUSer.getOutputStream().close(); aRegUSer.getInputStream().close(); aRegUSer.getSocket().close(); } catch(IOException ex){ //ex.printStackTrace(); System.out.println("User Id: " + msg.getUserFrom() + " has gone offline" ); } } public synchronized void logoutUser(CUser client) { try { client.setUserOffLine(); client.getOutputStream().writeObject(CServerMessageManager.getCloseConnectionMessage( client.getId() )); client.getOutputStream().close(); client.getInputStream().close(); client.getSocket().close(); } catch(IOException ex) { //ex.printStackTrace(); System.out.println("User Id: " + client.getId() + " has gone offline" ); } } public synchronized CUser createNewLogin(CUser user) { CUser p_user = null; if (CUserManager.getInstance().isUserExists(user.getId())) { p_user = userManager.createUser(user); } return p_user; } public synchronized Vector getOnlineFriends (int clientId ){ CUserManager p_UserManager = CUserManager.getInstance(); CUser user = null; // OBS friends is comming only with a valid Id for a while Vector friends = p_UserManager.getUserFriends(clientId); Vector onlineFriends = new Vector(); for (int offset =0 ; offset < friends.size() ;offset++){ user = p_UserManager.getUser( ((CUser)friends.elementAt(offset)).getId() ); if (user.isUserOnline() ) { onlineFriends.addElement(user); } } return onlineFriends; } }