|
From: <car...@us...> - 2003-03-24 02:54:30
|
Update of /cvsroot/madsserv/madsserv/src/server In directory sc8-pr-cvs1:/tmp/cvs-serv21811/server Modified Files: DialogClient.java DialogSimulator.java DialogSocket.java ErrNoListen.java ServerFrame.java ServerInit.java ThreadListenClients.java ThreadListenSimulator.java ThreadRead.java ThreadWrite.java Added Files: MadsservServer.java Removed Files: TestServer.java Log Message: Version stable et fonctionnelle --- NEW FILE: MadsservServer.java --- import java.awt.*; import java.net.*; /** * <code>MadsservServer</code> contient la methode main du serveur et se charge * de disposer correctement la fenetre a l'ecran. * @author Julien Carbonell * @see ServerFrame **/ public class MadsservServer { private boolean packFrame = true; /** * Constructeur */ public MadsservServer() { ServerFrame frame = new ServerFrame(); if (packFrame) { frame.pack(); } else { frame.validate(); } // On centre ici la fenetre Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize = frame.getSize(); if (frameSize.height > screenSize.height) { frameSize.height = screenSize.height; } if (frameSize.width > screenSize.width) { frameSize.width = screenSize.width; } frame.setLocation( (screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2); frame.setVisible(true); } /** * Lance le serveur du projet Madsserv */ public static void main(String[] args) { new MadsservServer(); } } Index: DialogClient.java =================================================================== RCS file: /cvsroot/madsserv/madsserv/src/server/DialogClient.java,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** DialogClient.java 21 Mar 2003 04:08:24 -0000 1.9 --- DialogClient.java 24 Mar 2003 02:54:24 -0000 1.10 *************** *** 2,12 **** /** ! * <code>DialogClient</code> gere la communication par socket du serveur vers le ! * client grace a deux threads (lecture et ecriture). <code>DialogClient</code> ! * est dedie a un client. * <p> ! * <code>DialogClient</code> fournit des methodes d'envoi de message et de ! * reception de message en utilisant des threads de classe {@link ThreadRead} et ! * {@link ThreadWrite} pour acceder au socket. * @see DialogSocket * @see ThreadRead --- 2,12 ---- /** ! * <code>DialogClient</code> gère la communication par socket entre le serveur et le ! * client (côté serveur) grâce à deux threads (lecture et écriture). <code>DialogClient</code> ! * est dedié à un client. * <p> ! * <code>DialogClient</code> fournit des méthodes d'envoi de messages et de ! * réception de messages en utilisant des threads de classe {@link ThreadRead} et ! * {@link ThreadWrite} pour accéder au socket. * @see DialogSocket * @see ThreadRead *************** *** 18,38 **** extends DialogSocket { ! final static int SEND_ID = 1; ! final static int REQUEST_MEDIA = 2; ! final static int PROCESS_MEDIA = 3; ! final static int END_CONNEXION_FROM_CLIENT = 4; ! final static int END_CONNEXION_FROM_SERVER = 5; ! final static int REPEAT_MESSAGE = 6; ! final static int REQUEST_CURRENT_TIME = 7; ! final static int ANSWER_CURRENT_TIME = 8; ! final static int ERROR_MESSAGE = 9; ! final static int INFORMATION = 11; ! // reference sur l'objet parent de classe ServerInit private ServerInit serverInit; /** * Constructeur de <code>DialogClient</code> ! * @param _clientID ID du client auquel est dedie <code>DialogClient</code>. * @param _socketClient le {@link Socket} de communication avec le client. * @param _serverInit le {@link ServerInit} parent. --- 18,68 ---- extends DialogSocket { ! /** ! * Type du message envoyant au client l'ID affectée. ! */ ! public final static int SEND_ID = 1; ! /** ! * Type du message provenant du client contenant l'adresse du media demandé. ! */ ! public final static int REQUEST_MEDIA = 2; ! /** ! * Type du message indiquant au client qu'il peut instancier le RTPManager. ! */ ! public final static int PROCESS_MEDIA = 3; ! /** ! * Type du message envoyé par le client indiquant qu'il coupe la connexion. ! */ ! public final static int END_CONNEXION_FROM_CLIENT = 4; ! /** ! * Type du message envoyé au client pour l'avertir de la déconnexion. ! */ ! public final static int END_CONNEXION_FROM_SERVER = 5; ! /** ! * Type du message envoyé par le client pour demander la répétition du message. ! */ ! public final static int REPEAT_MESSAGE = 6; ! /** ! * Type du message envoyé au client pour lui demander le temps media courant. ! */ ! public final static int REQUEST_CURRENT_TIME = 7; ! /** ! * Type du message envoyé par le client communiquant le temps media courant. ! */ ! public final static int ANSWER_CURRENT_TIME = 8; ! /** ! * Type du message envoyé au client pour lui signaler une erreur. ! */ ! public final static int ERROR_MESSAGE = 9; ! /** ! * Type du message envoyé au client transmettant des informations contextuelles. ! */ ! public final static int INFORMATION = 11; ! // Reference sur l'objet parent de classe ServerInit private ServerInit serverInit; /** * Constructeur de <code>DialogClient</code> ! * @param _clientID ID du client auquel est dédié <code>DialogClient</code>. * @param _socketClient le {@link Socket} de communication avec le client. * @param _serverInit le {@link ServerInit} parent. *************** *** 44,56 **** clientID = _clientID; if (clientID == -1) { - /* serverInit.setIP(clientID, - mySocket.getInetAddress().getHostAddress().toString()); - } - else {*/ String[] warning = new String[1]; warning[0] = "Trop de clients connectes au serveur."; - // System.out.println("Envoi du message " + warning[0]); sendMessage(ERROR_MESSAGE, warning); try { --- 74,83 ---- clientID = _clientID; + // Si le serveur a atteint le nombre maximum de client il renvoie une ID de -1 + // Le client est prevenu que le serveur est trop charge puis il est deconnecte if (clientID == -1) { String[] warning = new String[1]; warning[0] = "Trop de clients connectes au serveur."; sendMessage(ERROR_MESSAGE, warning); try { *************** *** 58,62 **** } catch (Exception e) { - } this.stop(); --- 85,88 ---- *************** *** 65,74 **** /** ! * Traite l'arrivee d'un nouveau message sur le socket. Le message passe en ! * parametre de <code>incomingMessage</code> est deja pre-formate sous forme * d'un tableau de {@link String}. * @param _type le type du message. * @param _message le tableau de <code>String</code> contenant les champs du ! * message recu. */ public void incomingMessage(int _type, String[] _message) { --- 91,100 ---- /** ! * Traite l'arrivée d'un nouveau message sur le socket. Le message passé en ! * paramètre de <code>incomingMessage</code> est déjà pré-formaté sous forme * d'un tableau de {@link String}. * @param _type le type du message. * @param _message le tableau de <code>String</code> contenant les champs du ! * message reçu. */ public void incomingMessage(int _type, String[] _message) { *************** *** 87,100 **** switch (_type) { case REQUEST_MEDIA: { String[] messageToSend = new String[1]; try { serverInit.setMediaAddress(clientID, _message[1]); ! System.out.println("Nouvelle URL pour le client " + clientID + ! ": " + ! _message[1]); ! serverInit.addLog("ID"+clientID+";Reception message type "+_type+";Nouvelle URL : "+_message[1]+";"); serverInit.createReencode(clientID, _message[1]); ! serverInit.setQualityLevel(clientID, serverInit.getQualityLevel(clientID), true); } catch (Exception e) { --- 113,126 ---- switch (_type) { + // Reception de l'URL media case REQUEST_MEDIA: { String[] messageToSend = new String[1]; try { serverInit.setMediaAddress(clientID, _message[1]); ! serverInit.addLog("ID" + clientID + ";Reception message type " + ! _type + ";Nouvelle URL : " + _message[1] + ";"); serverInit.createReencode(clientID, _message[1]); ! serverInit.setQualityLevel(clientID, ! serverInit.getQualityLevel(clientID), true); } catch (Exception e) { *************** *** 103,108 **** break; } case END_CONNEXION_FROM_CLIENT: { ! serverInit.addLog("ID"+clientID+";Reception message type "+_type+";"+_message[1]+";"); serverInit.endConnexionClient(clientID); break; --- 129,136 ---- break; } + // Le client a envoye un message de deconnexion case END_CONNEXION_FROM_CLIENT: { ! serverInit.addLog("ID" + clientID + ";Reception message type " + ! _type + ";" + _message[1] + ";"); serverInit.endConnexionClient(clientID); break; *************** *** 112,119 **** break; } case ANSWER_CURRENT_TIME: { double currentMediaTime; try { ! serverInit.addLog("ID"+clientID+";Reception message type "+_type+";Temps media="+_message[1]+";"); currentMediaTime = Double.parseDouble(_message[1]); serverInit.setCurrentMediaTime(clientID, currentMediaTime); --- 140,149 ---- break; } + // Le client renvoie son temps media courant case ANSWER_CURRENT_TIME: { double currentMediaTime; try { ! serverInit.addLog("ID" + clientID + ";Reception message type " + ! _type + ";Temps media=" + _message[1] + ";"); currentMediaTime = Double.parseDouble(_message[1]); serverInit.setCurrentMediaTime(clientID, currentMediaTime); *************** *** 135,139 **** /** ! * ErrMessage prend en charge les erreurs survenues lors de la reception de message sur le socket. */ class ErrMessageServer --- 165,169 ---- /** ! * ErrMessage prend en charge les erreurs survenues lors de la réception de messages sur le socket. */ class ErrMessageServer Index: DialogSimulator.java =================================================================== RCS file: /cvsroot/madsserv/madsserv/src/server/DialogSimulator.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** DialogSimulator.java 21 Mar 2003 04:08:24 -0000 1.3 --- DialogSimulator.java 24 Mar 2003 02:54:25 -0000 1.4 *************** *** 2,12 **** /** ! * <code>DialogClient</code> gere la communication par socket du serveur vers le ! * client grace a deux threads (lecture et ecriture). <code>DialogClient</code> ! * est dedie a un client. * <p> ! * <code>DialogClient</code> fournit des methodes d'envoi de message et de ! * reception de message en utilisant des threads de classe {@link ThreadRead} et ! * {@link ThreadWrite} pour acceder au socket. * @see DialogSocket * @see ThreadRead --- 2,11 ---- /** ! * <code>DialogSimulator</code> gère la communication par socket entre le serveur et le ! * simulateur (côté serveur) grâce à deux threads (lecture et écriture). * <p> ! * <code>DialogSimulator</code> fournit des méthodes d'envoi de messages et de ! * réception de messages en utilisant des threads de classe {@link ThreadRead} et ! * {@link ThreadWrite} pour accéder au socket. * @see DialogSocket * @see ThreadRead *************** *** 18,28 **** extends DialogSocket { ! final static int UPDATE_FROM_SERVER = 1; ! final static int UPDATE_FROM_SIMU = 2; ! final static int CLIENT_DECONNEXION = 3; ! final static int DECONNEXION_FROM_SIMU = 4; ! final static int DECONNEXION_FROM_SERVER = 5; ! // reference sur l'objet parent de classe ServerInit private ServerInit serverInit; --- 17,42 ---- extends DialogSocket { ! /** ! * Type du message envoye au simulateur pour mettre a jour sa table clients. ! */ ! public final static int UPDATE_FROM_SERVER = 1; ! /** ! * Type du message envoye par le simulateur pour signaler un changement de qualite. ! */ ! public final static int UPDATE_FROM_SIMU = 2; ! /** ! * Type du message envoye au simulateur pour signaler la deconnexion d'un client. ! */ ! public final static int CLIENT_DECONNEXION = 3; ! /** ! * Type du message envoye par le simulateur pour signaler sa deconnexion. ! */ ! public final static int DECONNEXION_FROM_SIMU = 4; ! /** ! * Type du message envoye au simulateur pour signaler sa deconnexion. ! */ ! public final static int DECONNEXION_FROM_SERVER = 5; ! // Reference sur l'objet parent de classe ServerInit private ServerInit serverInit; *************** *** 56,59 **** --- 70,74 ---- else { switch (_type) { + // Reception d'un changement de niveau de qualite case UPDATE_FROM_SIMU: { try { *************** *** 73,76 **** --- 88,92 ---- break; } + // Le simulateur se deconnecte case DECONNEXION_FROM_SIMU: { serverInit.endConnexionSimulator("Deconnexion du simulateur"); *************** *** 84,88 **** --- 100,106 ---- String logDesc = ""; + // Creation d'un thread d'ecriture sur le socket threadOutput = new ThreadWrite("Thread d'ecriture Simulateur", output, this); + // On met le message dans un seul String if (_message != null) { for (int i = 0; i < _message.length; i++) { Index: DialogSocket.java =================================================================== RCS file: /cvsroot/madsserv/madsserv/src/server/DialogSocket.java,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** DialogSocket.java 21 Mar 2003 04:08:24 -0000 1.6 --- DialogSocket.java 24 Mar 2003 02:54:25 -0000 1.7 *************** *** 3,14 **** /** ! * <code>DialogServer</code> fournit le modele d'objet permettant la gestion ! * de la communication par socket entre deux stations grace a deux threads ! * (lecture et ecriture). <code>DialogSocket</code> assure une communication ! * dediee. * <p> ! * <code>DialogServer</code> fournit une methode d'envoi de messages sur le ! * socket (par l'intermediaire de {@link ThreadWrite} et declare la methode ! * abstraite de reception des messages. * @see ThreadRead * @see ThreadWrite --- 3,14 ---- /** ! * <code>DialogServer</code> fournit le modèle de classe permettant la gestion ! * de la communication par socket entre deux stations grâce a deux threads ! * (lecture et écriture). <code>DialogSocket</code> assure une communication ! * dédiée. * <p> ! * <code>DialogSocket</code> fournit une méthode d'envoi de messages sur le ! * socket (par l'intermédiaire de {@link ThreadWrite}) et déclare une méthode abstraite ! * de traitement des messages reçus (par l'intermédiaire de {@link ThreadRead}). * @see ThreadRead * @see ThreadWrite *************** *** 18,39 **** public abstract class DialogSocket { ! // identite du client protected int clientID; ! // socket gere par DialogSocket protected Socket mySocket; ! // streams d'entree et de sortie protected PrintWriter output; protected InputStreamReader input; protected BufferedReader binput; ! // Thread d'entree et thread de sortie protected ThreadRead threadInput; protected ThreadWrite threadOutput; /** * Constructeur de <code>DialogSocket</code>. ! * @param _mySocket le {@link Socket} de communication. */ --- 18,56 ---- public abstract class DialogSocket { ! /** ! * Identité du client ! */ protected int clientID; ! /** ! * Le socket géré par <code>DialogSocket</code> ! */ protected Socket mySocket; ! /** ! * <code>PrintWriter</code> lié au flux de sortie de <code>mySocket</code>. ! */ protected PrintWriter output; + /** + * <code>InputStreamReader</code> lié au flux d'entrée de <code>mySocket</code>. + */ protected InputStreamReader input; + /** + * <code>BufferedReader</code> lié à <code>input</code>. + */ protected BufferedReader binput; ! /** ! * Thread de lecture de <code>mySocket</code>. ! */ protected ThreadRead threadInput; + /** + * Thread d'écriture sur <code>mySocket</code>. + */ protected ThreadWrite threadOutput; /** * Constructeur de <code>DialogSocket</code>. ! * @param _mySocket le <code>Socket</code> de communication. */ *************** *** 42,45 **** --- 59,63 ---- try { + // Ouverture des flux d'entree et de sortie sur le socket output = new PrintWriter(mySocket.getOutputStream()); input = new InputStreamReader(mySocket.getInputStream()); *************** *** 54,61 **** /** ! * Traite l'arrivee d'un nouveau message sur le socket. * @param _type le type du message. * @param _message le tableau de <code>String</code> contenant les champs du ! * message recu. */ --- 72,79 ---- /** ! * Traite l'arrivée d'un nouveau message sur le socket. * @param _type le type du message. * @param _message le tableau de <code>String</code> contenant les champs du ! * message reçu. */ *************** *** 63,80 **** /** ! * Traite une deconnexion brutale de l'utilisateur distant du socket. */ public abstract void resetByRemote(); /** ! * Traite la demande d'envoi d'un message sur le socket. Le message a envoyer * est fourni sous la forme d'un tableau de {@link String} contenant les ! * champs du message * @param _type le type du message. * @param _message le tableau de <code>String</code> contenant les champs du ! * message a envoyer. */ public synchronized void sendMessage(int _type, String[] _message) { threadOutput = new ThreadWrite("Thread d'ecriture ID", output, this); String[] messageToSend; --- 81,99 ---- /** ! * Traite une déconnexion brutale de l'utilisateur distant du socket. */ public abstract void resetByRemote(); /** ! * Traite la demande d'envoi d'un message sur le socket. Le message à envoyer * est fourni sous la forme d'un tableau de {@link String} contenant les ! * champs du message. * @param _type le type du message. * @param _message le tableau de <code>String</code> contenant les champs du ! * message à envoyer. */ public synchronized void sendMessage(int _type, String[] _message) { + // Creation d'un thread d'ecriture sur le socket threadOutput = new ThreadWrite("Thread d'ecriture ID", output, this); String[] messageToSend; *************** *** 96,100 **** /** * Renvoie l'ID du client. ! * @return ID du client. */ --- 115,119 ---- /** * Renvoie l'ID du client. ! * @return l'ID du client. */ *************** *** 104,108 **** /** ! * Renvoie l'etat du socket. */ public boolean socketIsClosed() { --- 123,127 ---- /** ! * Renvoie l'état du socket. */ public boolean socketIsClosed() { *************** *** 111,115 **** /** ! * Demarre l'ecoute du socket */ --- 130,134 ---- /** ! * Lance l'écoute du socket. */ *************** *** 124,134 **** public synchronized void stop() { try { - // System.err.println("j'entre dans le stop de dialog socket"); if (!mySocket.isClosed()) { mySocket.close(); } - - // System.err.println("le socket est mort"); - // System.out.println("Fin DialogSocket " + clientID); } catch (Exception e) {} --- 143,149 ---- Index: ErrNoListen.java =================================================================== RCS file: /cvsroot/madsserv/madsserv/src/server/ErrNoListen.java,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** ErrNoListen.java 21 Mar 2003 04:08:24 -0000 1.4 --- ErrNoListen.java 24 Mar 2003 02:54:25 -0000 1.5 *************** *** 2,16 **** /** ! * Exception levee quand un <code>ServerSocket</code> n'arrive pas a ouvrir * le socket. * @see java.net.ServerSocket * @author Julien Carbonell */ ! public class ErrNoListen extends Exception { ! ! final static int NO_LISTEN_CLIENTS = 0; ! final static int NO_LISTEN_SIMULATOR = 1; protected int type; protected int port; --- 2,28 ---- /** ! * Exception lévée quand un <code>ServerSocket</code> n'arrive pas à ouvrir * le socket. * @see java.net.ServerSocket * @author Julien Carbonell */ ! public class ErrNoListen ! extends Exception { + /** + * Type de l'erreur quand on n'arrive pas à ouvrir le socket d'écoute des connexions clients. + */ + public final static int NO_LISTEN_CLIENTS = 0; + /** + * Type de l'erreur quand on n'arrive pas à ouvrir le socket d'écoute de la connexion simulateur. + */ + public final static int NO_LISTEN_SIMULATOR = 1; + /** + * Type d'erreur + */ protected int type; + /** + * Le port à l'origine de l'exception. + */ protected int port; *************** *** 32,39 **** switch (type) { case NO_LISTEN_CLIENTS: { ! return ("Impossible d'ouvrir un socket d'ecoute clients sur le port "+port); } case NO_LISTEN_SIMULATOR: { ! return ("Impossible d'ouvrir un socket d'ecoute simulateur sur le port "+port); } default: { --- 44,54 ---- switch (type) { case NO_LISTEN_CLIENTS: { ! return ("Impossible d'ouvrir un socket d'ecoute clients sur le port " + ! port); } case NO_LISTEN_SIMULATOR: { ! return ( ! "Impossible d'ouvrir un socket d'ecoute simulateur sur le port " + ! port); } default: { Index: ServerFrame.java =================================================================== RCS file: /cvsroot/madsserv/madsserv/src/server/ServerFrame.java,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** ServerFrame.java 21 Mar 2003 04:08:24 -0000 1.5 --- ServerFrame.java 24 Mar 2003 02:54:25 -0000 1.6 *************** *** 12,18 **** /** ! * <code>ServerFrame</code> cree l'interface graphique de Madsserv Serveur. * <p> ! * L'interface graphique se sépare en un tableau d'onglets et une barre de boutons. */ public class ServerFrame --- 12,20 ---- /** ! * <code>ServerFrame</code> crée l'interface graphique de Madsserv Serveur. * <p> ! * L'interface graphique se sépare en un tableau d'onglets et une barre de boutons. ! * @see ServerInit ! * @author Julien Carbonell */ public class ServerFrame *************** *** 24,27 **** --- 26,32 ---- final static int TEXTFIELD_HEIGHT = 25; + /** + * Le {@link ServerInit} auquel est rattaché cette interface graphique. + */ protected ServerInit serverInit = null; *************** *** 79,85 **** jTabbedPane.addTab("Rapports", null, jPanelReport, "Affiche les connexions"); jTabbedPane.addTab("Formats", null, jPanelFormats, ! "Affiche les formats support� par le serveur"); jTabbedPane.addTab("Qualite", null, jPanelQuality, ! "Affiche l'association format/niveau de qualit�"); contentPane.add(jTabbedPane, BorderLayout.CENTER); --- 84,90 ---- jTabbedPane.addTab("Rapports", null, jPanelReport, "Affiche les connexions"); jTabbedPane.addTab("Formats", null, jPanelFormats, ! "Affiche les formats supportes par le serveur"); jTabbedPane.addTab("Qualite", null, jPanelQuality, ! "Affiche l'association format/niveau de qualite"); contentPane.add(jTabbedPane, BorderLayout.CENTER); *************** *** 174,179 **** /** ! * Definit les operations effectues par un clic sur le bouton Demarrer. ! * @param evt l'evenement qui lance cette methode. */ public void Button_Start_actionPerformed(ActionEvent evt) { --- 179,184 ---- /** ! * Définit les opérations effectuées par un clic sur le bouton Démarrer. ! * @param evt l'événement qui lance cette méthode. */ public void Button_Start_actionPerformed(ActionEvent evt) { *************** *** 183,187 **** int portBaseRTP = ServerInit.PORT_BASE_RTP; int nbClients = ServerInit.NB_CLIENTS; ! int bytesSent = ServerInit.BYTES_SENT; Integer integer1 = null; Integer integer2 = null; --- 188,192 ---- int portBaseRTP = ServerInit.PORT_BASE_RTP; int nbClients = ServerInit.NB_CLIENTS; ! int bytesSent = ServerInit.BITRATE; Integer integer1 = null; Integer integer2 = null; *************** *** 195,198 **** --- 200,204 ---- integer3 = Integer.valueOf(jTextFieldPortRTP.getText()); integer4 = Integer.valueOf(jTextFieldNbMax.getText()); + // Verification des valeurs renvoyees if (integer1 == null || integer2 == null || integer3 == null || integer4 == null) { displayError("Erreur de saisie", *************** *** 205,209 **** nbClients = integer4.intValue(); if (serverInit == null) { ! // Creation du thread d'ecoute clients serverInit = new ServerInit(port, portSim, portBaseRTP, nbClients, this); --- 211,215 ---- nbClients = integer4.intValue(); if (serverInit == null) { ! // Creation du ServerInit serverInit = new ServerInit(port, portSim, portBaseRTP, nbClients, this); *************** *** 213,217 **** } else { - System.err.println("ServerInit est deja cree"); serverInit.start(); } --- 219,222 ---- *************** *** 223,226 **** --- 228,232 ---- } catch (ErrNoListen e) { + // Impossible de creer les sockets d'ecoute serverInit = null; displayError("Port occupe", *************** *** 232,237 **** /** ! * Definit les operations effectues par un clic sur le bouton Arreter. ! * @param evt l'evenement qui lance cette methode. */ public void Button_Stop_actionPerformed(ActionEvent evt) { --- 238,243 ---- /** ! * Définit les opérations effectuées par un clic sur le bouton Arrêter. ! * @param evt l'événement qui lance cette méthode. */ public void Button_Stop_actionPerformed(ActionEvent evt) { *************** *** 244,249 **** /** ! * Definit les operations effectues par un clic sur le bouton Quitter. ! * @param evt l'evenement qui lance cette methode. */ public void Button_Quit_actionPerformed(ActionEvent evt) { --- 250,255 ---- /** ! * Définit les opérations effectuées par un clic sur le bouton Quitter. ! * @param evt l'événement qui lance cette méthode. */ public void Button_Quit_actionPerformed(ActionEvent evt) { *************** *** 255,260 **** /** ! * Permet de quitter le client quand on clique pour fermer la fenetre ! * @param e l'evenement qui indique que l'on a clique sur le bouton pour fermer la fenetre */ protected void processWindowEvent(WindowEvent e) { --- 261,266 ---- /** ! * Permet de quitter le client quand on clique pour fermer la fenêtre ! * @param e l'événement qui indique que l'on a cliqué sur le bouton pour fermer la fenêtre. */ protected void processWindowEvent(WindowEvent e) { *************** *** 264,284 **** } } - - public static void main(String[] args) { - ServerFrame serverFrame = new ServerFrame(); - serverFrame.pack(); - // Centre la fenetre - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - Dimension frameSize = serverFrame.getSize(); - if (frameSize.height > screenSize.height) { - frameSize.height = screenSize.height; - } - if (frameSize.width > screenSize.width) { - frameSize.width = screenSize.width; - } - serverFrame.setLocation( (screenSize.width - frameSize.width) / 2, - (screenSize.height - frameSize.height) / 2); - serverFrame.show(); - } } --- 270,273 ---- *************** *** 326,330 **** /** ! * TableClients est une table permettant le suivi des connexions. */ class TableClients --- 315,319 ---- /** ! * TableClients est une table (JTable) permettant le suivi des connexions. */ class TableClients *************** *** 369,373 **** * @return l'index de la ligne du tableau */ ! protected int getRowForClient(int _clientID) { for (int i = 0; i < myModel.getRowCount(); i++) { if (_clientID == ( (Integer) myModel.getValueAt(i, COL_ID)).intValue()) { --- 358,362 ---- * @return l'index de la ligne du tableau */ ! protected synchronized int getRowForClient(int _clientID) { for (int i = 0; i < myModel.getRowCount(); i++) { if (_clientID == ( (Integer) myModel.getValueAt(i, COL_ID)).intValue()) { *************** *** 405,409 **** * @param _status le statut de la connexion. */ ! public void newClientRecord(int _clientID, int _portRTP, String _IP, String _status) { Object[] newRow = { --- 394,398 ---- * @param _status le statut de la connexion. */ ! public synchronized void newClientRecord(int _clientID, int _portRTP, String _IP, String _status) { Object[] newRow = { *************** *** 424,428 **** * @param _qualityLevel le niveau de qualite pour le client. */ ! public void updateClientRecord(int _clientID, String _IP, int _portRTP, String _status, String _media, float _bytesSent, --- 413,417 ---- * @param _qualityLevel le niveau de qualite pour le client. */ ! public synchronized void updateClientRecord(int _clientID, String _IP, int _portRTP, String _status, String _media, float _bytesSent, *************** *** 454,458 **** * @param _clientID l'ID du client a supprimer. */ ! public void removeClientRecord(int _clientID) { int row = getRowForClient(_clientID); if (row != -1) { --- 443,447 ---- * @param _clientID l'ID du client a supprimer. */ ! public synchronized void removeClientRecord(int _clientID) { int row = getRowForClient(_clientID); if (row != -1) { Index: ServerInit.java =================================================================== RCS file: /cvsroot/madsserv/madsserv/src/server/ServerInit.java,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** ServerInit.java 21 Mar 2003 04:08:24 -0000 1.10 --- ServerInit.java 24 Mar 2003 02:54:25 -0000 1.11 *************** *** 7,11 **** /** ! * <code>ServerInit</code> constitue la classe de demarrage du serveur Madsserv. * Elle gere les connexions multiples de clients ainsi que l'instanciation des * modules necessaires au traitement des requetes de diffusion media. --- 7,11 ---- /** ! * <code>ServerInit</code> constitue la classe de principale du serveur Madsserv. * Elle gere les connexions multiples de clients ainsi que l'instanciation des * modules necessaires au traitement des requetes de diffusion media. *************** *** 20,29 **** public class ServerInit { ! final static int PORT_LISTEN_CLIENTS = 5200; ! final static int PORT_LISTEN_SIMULATOR = 5100; ! final static int PORT_BASE_RTP = 40000; ! final static int NB_CLIENTS = 10; ! final static int BYTES_SENT = 0; ! final static int DEFAULT_QUALITY = 1; // tabClients enregistre l'ensemble des clients connectes --- 20,47 ---- public class ServerInit { ! /** ! * Port d'ecoute client par defaut ! */ ! public final static int PORT_LISTEN_CLIENTS = 5200; ! /** ! * Port d'ecoute simulateur par defaut ! */ ! public final static int PORT_LISTEN_SIMULATOR = 5100; ! /** ! * Port de base RTP ! */ ! public final static int PORT_BASE_RTP = 40000; ! /** ! * Nombre maximum de clients ! */ ! public final static int NB_CLIENTS = 10; ! /** ! * Debit initial d'une connexion ! */ ! public final static int BITRATE = 0; ! /** ! * Niveau de qualite par defaut ! */ ! public final static int DEFAULT_QUALITY = 1; // tabClients enregistre l'ensemble des clients connectes *************** *** 48,54 **** private DialogSimulator dialogSimulator = null; - // Reference sur le module de logs - LogCenter log; - // Parametres de connexion du serveur private int portListenClients; --- 66,69 ---- *************** *** 68,71 **** --- 83,91 ---- /** + * Reference sur le module de logs du serveur. + */ + public LogCenter log=null; + + /** * Constructeur de <code>ServerInit</code>. * @param _portListenClients le port d'ecoute des clients sur le serveur. *************** *** 105,108 **** --- 125,129 ---- try { + // Ouverture du socket d'ecoute clients log.open(); sockListenClients = new ServerSocket(portListenClients); *************** *** 118,121 **** --- 139,143 ---- try { + // Ouverture du socket d'ecoute simulateur sockListenSimulator = new ServerSocket(portListenSimulator); threadListenSimulator = new ThreadListenSimulator(this, *************** *** 137,140 **** --- 159,163 ---- public synchronized void stop() { + // Deconnexion des clients for (int i = 0; i < nbMaxClients; i++) { if (tabClients[i] != null) { *************** *** 143,153 **** } } threadListenSimulator.close(); threadListenSimulator = null; threadListenClients.close(); threadListenClients = null; - endConnexionSimulator("Arret du serveur"); sockListenClients = null; sockListenSimulator = null; log.close(); System.gc(); --- 166,179 ---- } } + // Deconnexion simulateur threadListenSimulator.close(); threadListenSimulator = null; + endConnexionSimulator("Arret du serveur"); + // Arret du thread d'ecoute clients threadListenClients.close(); threadListenClients = null; sockListenClients = null; sockListenSimulator = null; + // Fermeture des logs, log.close(); System.gc(); *************** *** 167,175 **** while (i < nbMaxClients) { if (tabClients[i] == null) { tabClients[i] = new ClientRecord(i, portBaseRTP + 4 * i, _sockClient.getInetAddress(). getHostAddress().toString()); - //tabClients[i].setPortRTP(); tabStreaming[i] = new Streaming(i, this); tabTransition[i] = new Transition(i, this); --- 193,201 ---- while (i < nbMaxClients) { + // Recherche d'un emplacement libre pour le nouveau client if (tabClients[i] == null) { tabClients[i] = new ClientRecord(i, portBaseRTP + 4 * i, _sockClient.getInetAddress(). getHostAddress().toString()); tabStreaming[i] = new Streaming(i, this); tabTransition[i] = new Transition(i, this); *************** *** 177,180 **** --- 203,207 ---- tabTransition[i].setGestionAdapta(gestionAdapta); if (dialogSimulator != null) { + // Mise a jour du simulateur String[] messageToSend = new String[2]; messageToSend[0] = String.valueOf(i); *************** *** 184,189 **** --- 211,218 ---- } addLog(i + ";" + "Connexion du client;"); + // Creation d'un nouveau module de dialogue pour le client tabDialogs[i] = new DialogClient(i, _sockClient, this); tabDialogs[i].start(); + // Envoi du message de connexion au client welcome = new String[1]; welcome[0] = String.valueOf(portBaseRTP + 4 * i); *************** *** 193,197 **** i++; } ! // Trop de clients il faut deconnecter le client if (i == nbMaxClients) { addLog("Trop de clients connectes -> deconnexion"); --- 222,226 ---- i++; } ! // Trop de clients il faut deconnecter le client essayant de se connecter if (i == nbMaxClients) { addLog("Trop de clients connectes -> deconnexion"); *************** *** 202,224 **** /** - * Cree un nouveau <code>DialogClient</code> pour gerer la communication avec - * un client. - * @param _clientID l'ID du client. - * @param _socketClient le {@link Socket} dedie a la communication avec le client. - * @return le <code>DialogClient</code> cree. - */ - /* public DialogClient createDialogClient(int _clientID, - Socket _sockClient) { - if (_clientID == -1) { - return tempDialog; - } - else { - synchronized (tabDialogs) { - tabDialogs[_clientID] = new DialogClient(_clientID, _sockClient, this); - return tabDialogs[_clientID]; - } - }*/ - - /** * Deconnecte un client en effacant tous les objets relatifs au traitement de sa connexion. * @param _clientID l'ID du client a deconnecter. --- 231,234 ---- *************** *** 228,238 **** if (tabClients[_clientID] != null) { ! if (_clientID == -1) { warning[0] = "Trop de clients connectes au serveur."; } ! else { warning[0] = "Deconnexion du client " + String.valueOf(_clientID); ! ! } try { sendMessage(_clientID, DialogClient.END_CONNEXION_FROM_SERVER, --- 238,247 ---- if (tabClients[_clientID] != null) { ! /* if (_clientID == -1) { warning[0] = "Trop de clients connectes au serveur."; } ! else {*/ warning[0] = "Deconnexion du client " + String.valueOf(_clientID); ! // } try { sendMessage(_clientID, DialogClient.END_CONNEXION_FROM_SERVER, *************** *** 287,291 **** /** ! * Cree un nouveau <code>Reencode</code> pour gerer l'encodage pour un client. * @param _clientID l'ID du client. * @param _URL l'adresse media demande. --- 296,300 ---- /** ! * Cree un nouveau <code>Reencode</code> pour gerer l'encodage pour un client. * @param _clientID l'ID du client. * @param _URL l'adresse media demande. *************** *** 310,313 **** --- 319,323 ---- synchronized (simulatorConnected) { if (simulatorConnected.booleanValue()) { + // Si un simulateur est deja connecte DialogSimulator dialogSimulatorTemp = new DialogSimulator( _socketSimulator, this); *************** *** 316,319 **** --- 326,330 ---- } else { + // Creation d'une connexion avec le simulateur simulatorConnected = new Boolean(true); dialogSimulator = new DialogSimulator(_socketSimulator, this); *************** *** 354,357 **** --- 365,369 ---- dialogSimulator.sendMessage(DialogSimulator.DECONNEXION_FROM_SERVER, messageToSend); + // Intervalle de temps pour laisser le temps au simulateur de recevoir le message try { Thread.sleep(100); *************** *** 382,385 **** --- 394,398 ---- synchronized (tabDialogs[_clientID]) { tabDialogs[_clientID].sendMessage(_type, _message); + // Log du message if (_message != null) { for (int i = 0; i < _message.length; i++) { *************** *** 392,395 **** --- 405,412 ---- } + /** + * Inscrit une ligne de log dans le fichier de logs. + * @param logDesc la description du log. + */ public void addLog(String logDesc) { log.writeLog("ServerInit;" + logDesc); *************** *** 475,479 **** /** ! * Modifie le niveau de qualite courant d'un client ce qui entraine le lancement * d'un processus de reencodage et de transition. * @param _clientID l'ID du client. --- 492,496 ---- /** ! * Modifie le niveau de qualite courant d'un client ce qui entraine le lancement * d'un processus de reencodage et de transition. * @param _clientID l'ID du client. *************** *** 484,489 **** --- 501,508 ---- Streaming streamingTemp = tabStreaming[_clientID]; + // Modification du champ de qualite au niveau de l'enregistrement du client tabClients[_clientID].setQualityLevel(_qualityLevel); + // Initialisation du Streaming si necessaire if (!streamingTemp.isInitialized()) { streamingTemp.setClientIP(getIP(_clientID)); *************** *** 499,505 **** } catch (Exception e) { e.printStackTrace(); String[] error = new String[1]; - //System.err.println("JB m'a envoye :" + e.getMessage()); if ( (error[0] = e.getMessage()) != null) { serverFrame.tableClients.setMedia(_clientID, "Erreur adresse media"); --- 518,524 ---- } catch (Exception e) { + // Une erreur lors du reencodage -> deconnexion du client e.printStackTrace(); String[] error = new String[1]; if ( (error[0] = e.getMessage()) != null) { serverFrame.tableClients.setMedia(_clientID, "Erreur adresse media"); *************** *** 510,513 **** --- 529,535 ---- } + /** + * Enregistrement d'un client + */ class ClientRecord { Index: ThreadListenClients.java =================================================================== RCS file: /cvsroot/madsserv/madsserv/src/server/ThreadListenClients.java,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** ThreadListenClients.java 21 Mar 2003 04:08:24 -0000 1.8 --- ThreadListenClients.java 24 Mar 2003 02:54:25 -0000 1.9 *************** *** 53,57 **** /** ! * Redefinit la methode <code>run</code> de la classe parent <code>Thread</code>. */ public void run() { --- 53,57 ---- /** ! * Redefinit la methode <code>run</code> de la classe parent <code>Thread</code>. */ public void run() { *************** *** 65,77 **** port); while (true) { sockClient = sockListen.accept(); ! /* clientIDTemp = */serverInit.createClient(sockClient); ! /*dialogClient = serverInit.createDialogClient(clientIDTemp, sockClient); ! dialogClient.start(); ! if (clientIDTemp != -1) { ! portRTP = serverInit.getPortRTP(clientIDTemp); ! welcome[0] = String.valueOf(portRTP); ! dialogClient.sendMessage(1, welcome); ! }*/ } } --- 65,71 ---- port); while (true) { + // Attente sur le socket d'ecoute sockClient = sockListen.accept(); ! serverInit.createClient(sockClient); } } *************** *** 81,89 **** finally { try { if (sockListen != null) { sockListen.close(); sockListen = null; } ! System.out.println("Listen-Clients" + Thread.currentThread() + " : Stopped !!! "); } --- 75,84 ---- finally { try { + // Ferme le socket avant de se terminer if (sockListen != null) { sockListen.close(); sockListen = null; } ! System.out.println("Listen-Clients " + Thread.currentThread() + " : Stopped !!! "); } Index: ThreadListenSimulator.java =================================================================== RCS file: /cvsroot/madsserv/madsserv/src/server/ThreadListenSimulator.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** ThreadListenSimulator.java 19 Mar 2003 02:14:00 -0000 1.2 --- ThreadListenSimulator.java 24 Mar 2003 02:54:25 -0000 1.3 *************** *** 56,64 **** public void run() { Socket sockSimulator = null; - //DialogSimulator dialogSimulator = null; try { System.out.println("Serveur(" + Thread.currentThread() + ") attend sur " + port); ! while (true) { sockSimulator = sockListen.accept(); serverInit.createDialogSimulator(sockSimulator); --- 56,63 ---- public void run() { Socket sockSimulator = null; try { System.out.println("Serveur(" + Thread.currentThread() + ") attend sur " + port); ! while (true) { sockSimulator = sockListen.accept(); serverInit.createDialogSimulator(sockSimulator); Index: ThreadRead.java =================================================================== RCS file: /cvsroot/madsserv/madsserv/src/server/ThreadRead.java,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** ThreadRead.java 21 Mar 2003 04:08:24 -0000 1.5 --- ThreadRead.java 24 Mar 2003 02:54:25 -0000 1.6 *************** *** 18,32 **** boolean end = false; ! // objet parent qui gere les entrees-sorties sur le socket protected DialogSocket parent; ! // BufferedReader sur lequel sont lus les messages protected BufferedReader binput; - protected String temp = ""; - protected String message = ""; - protected boolean waitingMessage = true; - protected int messageType = -1; - /** * Constructeur de <code>ThreadRead</code>. --- 18,31 ---- boolean end = false; ! /** ! * Objet qui gere les entrees-sorties sur le socket. ! */ protected DialogSocket parent; ! /** ! * <code>BufferedReader</code> sur lequel sont lus les messages. ! */ protected BufferedReader binput; /** * Constructeur de <code>ThreadRead</code>. *************** *** 46,58 **** */ public void run() { try { while ( (temp = binput.readLine()) != null) { if (temp != null) { if (waitingMessage && (temp.charAt(0) == '#')) { ! // un nouveau message commence waitingMessage = false; } else { if (!waitingMessage && (temp.charAt(0) == '#')) { waitingMessage = true; messageType = Integer.parseInt(message.substring(0, --- 45,64 ---- */ public void run() { + String temp = ""; + String message = ""; + boolean waitingMessage = true; + int messageType = -1; + + // # est le caractere de debut et de fin d'un message try { while ( (temp = binput.readLine()) != null) { if (temp != null) { if (waitingMessage && (temp.charAt(0) == '#')) { ! // Un nouveau message commence waitingMessage = false; } else { if (!waitingMessage && (temp.charAt(0) == '#')) { + // On etait en train de lire un message et on a recu le caractere de fin waitingMessage = true; messageType = Integer.parseInt(message.substring(0, *************** *** 65,73 **** } else { message = message.concat(temp + "\n"); } } } - } } --- 71,79 ---- } else { + // On lit un message message = message.concat(temp + "\n"); } } } } } *************** *** 78,84 **** try { if (!parent.socketIsClosed()) { - System.err.println("je fais un reset remote"); parent.resetByRemote(); - } System.out.println(getName() + Thread.currentThread() + --- 84,88 ---- *************** *** 89,95 **** } } - } protected String[] parseMessage(String _message) { return _message.split("\n"); --- 93,104 ---- } } } + /** + * Parse le message recu pour le decouper en un tableau de chaines de caracteres + * contenant les champs du message. + * @param _message la chaine de caracteres recue sur le socket. + * @return le tableau des champs du message recu. + */ protected String[] parseMessage(String _message) { return _message.split("\n"); Index: ThreadWrite.java =================================================================== RCS file: /cvsroot/madsserv/madsserv/src/server/ThreadWrite.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** ThreadWrite.java 18 Mar 2003 03:20:27 -0000 1.3 --- ThreadWrite.java 24 Mar 2003 02:54:25 -0000 1.4 *************** *** 16,27 **** extends Thread { ! // objet parent qui gere les entrees-sorties sur le socket protected DialogSocket parent; ! // objet sur lequel sont dirigees les ecritures protected PrintWriter output; protected String messageToSend = ""; /** * Constructeur de <code>ThreadWrite</code>. --- 16,35 ---- extends Thread { ! /** ! * Objet qui gere les entrees-sorties sur le socket. ! */ protected DialogSocket parent; ! /** ! * <code>PrintWriter</code> sur lequel est ecrit le message a envoyer. ! */ protected PrintWriter output; + /** + * Le message a envoyer. + */ protected String messageToSend = ""; + /** * Constructeur de <code>ThreadWrite</code>. *************** *** 43,46 **** --- 51,55 ---- */ public synchronized void setMessageToSend(int _type, String[] _message) { + messageToSend=""; messageToSend = _type + "\n"; --- TestServer.java DELETED --- |