- java ChatApp --debug permite afisarea de mesaje debug, in timpul rularii.
- stilul a fost imbunatatit, sa arate mai bine pe Windows.
- suport pentru caractere Unicode pe Windows.
- imbunatatiri ce tin de threading.
  * © 2010 ROBO Design
  * http://www.robodesign.ro
  *
- * $Date: 2010-05-18 20:11:58 +0300 $
+ * $Date: 2010-05-19 18:46:10 +0300 $
  */
 
 import ChatApp.appMain;
@@ -11,6 +11,11 @@ import javax.swing.SwingUtilities; 
 public class ChatApp {
   public static void main (String[] args) {
     appMain app = new appMain();
+
+    if (args != null && args.length > 0 && args[0].equals("--debug")) {
+      app.debug = true;
+    }
+
     SwingUtilities.invokeLater(app);
   }
 }
 
  * © 2010 ROBO Design
  * http://www.robodesign.ro
  *
- * $Date: 2010-05-18 20:19:43 +0300 $
+ * $Date: 2010-05-19 18:52:50 +0300 $
  */
 
 package ChatApp;
@@ -82,7 +82,8 @@ public class PaginaChat extends JPanel implements ActionListener, ChangeListener 
     btnTrimite.addActionListener(this);
 
     msgField = new JTextField();
-    msgField.addKeyListener(fieldKeyListener);
+    msgField.setActionCommand("trimiteMesaj");
+    msgField.addActionListener(this);
 
     // lista de clienti conectati la server.
 
@@ -398,20 +399,14 @@ public class PaginaChat extends JPanel implements ActionListener, ChangeListener 
     }
   };
 
-  // event handler pentru tastare in campul de text msgField si in listaClienti.
+  // event handler pentru tastare in listaClienti.
   private KeyListener fieldKeyListener = new KeyAdapter () {
     public void keyPressed (KeyEvent ev) {
-      if (ev.getKeyCode() != KeyEvent.VK_ENTER) {
-        return;
-      }
-
-      if (ev.getSource() == listaClienti) {
+      if (ev.getKeyCode() == KeyEvent.VK_ENTER && ev.getSource() == listaClienti) {
         int i = listaClienti.getSelectedIndex();
         if (i != -1) {
           activareChatPrivat(i);
         }
-      } else if (ev.getSource() == msgField) {
-        trimiteMesaj();
       }
     }
   };
@@ -528,7 +523,7 @@ public class PaginaChat extends JPanel implements ActionListener, ChangeListener 
     int t = chatTabs.indexOfTab(numeTab);
     int ts = chatTabs.getSelectedIndex();
 
-    System.out.println("PaginaChat.adaugaMesajInTab " + numeTab + " t " + t + " ts " + ts + " class " + cssClass + " msg " + msg);
+    //myApp.mesajDebug("PaginaChat.adaugaMesajInTab " + numeTab + " t " + t + " ts " + ts + " class " + cssClass + " msg " + msg);
 
     if (numeTab.equals("#server")) {
       mesajeServer.adaugaMesaj(msg, cssClass);
@@ -679,11 +674,11 @@ public class PaginaChat extends JPanel implements ActionListener, ChangeListener 
 
   public void ev_mesajPrimit (String dela, String catre, String msg) {
     if (dela.equals("#server") || dela.equals(myApp.getNumeUtilizator())) {
-      System.out.println("PaginaChat.ev_mesajPrimit dela = " + dela);
+      //myApp.mesajDebug("PaginaChat.ev_mesajPrimit dela = " + dela);
       return;
     }
 
-    System.out.println("PaginaChat.ev_mesajPrimit dela " + dela + " catre " + catre + " msg " + msg);
+    //myApp.mesajDebug("PaginaChat.ev_mesajPrimit dela " + dela + " catre " + catre + " msg " + msg);
 
     String msgf = "<span class='nume'>" + htmlEscape(dela) + "</span>: " + htmlEscape(msg);
 
 
  * © 2010 ROBO Design
  * http://www.robodesign.ro
  *
- * $Date: 2010-05-18 20:09:07 +0300 $
+ * $Date: 2010-05-19 18:35:24 +0300 $
  */
 
 package ChatApp;
@@ -35,8 +35,8 @@ public class PrimaPagina extends JPanel implements ActionListener, ChangeListene 
   private JTabbedPane panouTaburi;
   private JSpinner serverPortField;
   private JSpinner clientPortField;
-  private int portMin = 1024;
-  private int portMax = 65535;
+  private final int portMin = 1024;
+  private final int portMax = 65535;
   private JTextField serverNickField;
   private JTextField clientNickField;
   private JTextField serverAddressField;
 
  * © 2010 ROBO Design
  * http://www.robodesign.ro
  *
- * $Date: 2010-05-19 14:09:54 +0300 $
+ * $Date: 2010-05-19 18:42:42 +0300 $
  */
 
 package ChatApp;
 
 import java.io.BufferedReader;
 import java.io.InputStreamReader;
-import java.io.PrintWriter;
+import java.io.PrintStream;
 import java.net.Socket;
 import java.net.UnknownHostException;
 import javax.swing.DefaultListModel;
+import javax.swing.SwingUtilities;
 
 // clasa ce se ocupa de conectarea unui client la un server de chat.
 
@@ -23,7 +24,7 @@ public class appClient extends Thread { 
   private volatile String numeUtilizator;
   private volatile boolean serverConectat;
   private Socket clientSocket;
-  private PrintWriter clientOut;
+  private PrintStream clientOut;
   private BufferedReader clientIn;
   private DefaultListModel listaClienti;
 
@@ -66,13 +67,13 @@ public class appClient extends Thread { 
     serverPort = port;
     numeUtilizator = nume;
 
-    System.out.println("appClient.conectare " + numeUtilizator + " " + serverAdresa + " " + serverPort);
+    myApp.mesajDebug("appClient.conectare " + numeUtilizator + " " + serverAdresa + " " + serverPort);
 
     // pornire conexiune socket
     try {
       clientSocket = new Socket(serverAdresa, serverPort);
-      clientOut = new PrintWriter(clientSocket.getOutputStream(), true);
-      clientIn = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
+      clientOut = new PrintStream(clientSocket.getOutputStream(), true, "utf-8");
+      clientIn = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(), "utf-8"));
 
     } catch (UnknownHostException ex) {
       System.err.println("appClient.conectare: Serverul nu poate fi gasit: " + serverAdresa + ". " + ex);
@@ -108,12 +109,23 @@ public class appClient extends Thread { 
   public void run () {
     if (!serverConectat || clientIn == null || clientSocket == null || clientSocket.isClosed()) {
       System.err.println("appClient.run: starea aplicatiei este invalida.");
+      serverConectat = false;
       return;
     }
 
-    System.out.println("appClient.run start " + numeUtilizator);
+    myApp.mesajDebug("appClient.run start " + numeUtilizator);
 
-    myApp.afisarePaginaChat();
+    try {
+      SwingUtilities.invokeAndWait(new Runnable () {
+        public void run () {
+          myApp.afisarePaginaChat();
+        }
+      });
+    } catch (Exception ex) {
+      System.err.println("appClient.run: afisarePaginaChat() a esuat. " + ex);
+      ex.printStackTrace();
+      serverConectat = false;
+    }
 
     if (!trimiteComanda("/conectare " + numeUtilizator)) {
       System.err.println("appClient.run: trimiteComanda('/conectare') a esuat. ");
@@ -139,7 +151,7 @@ public class appClient extends Thread { 
       cmd = null;
     }
 
-    System.out.println("appClient.run end " + numeUtilizator);
+    myApp.mesajDebug("appClient.run end " + numeUtilizator);
 
     serverConectat = false;
 
@@ -166,17 +178,21 @@ public class appClient extends Thread { 
       listaClienti.clear();
     }
 
-    myApp.deconectareClientCompleta();
+    SwingUtilities.invokeLater(new Runnable () {
+      public void run () {
+        myApp.deconectareClientCompleta();
+      }
+    });
   }
 
   // metoda ce permite trimiterea de comenzi de la client catre server.
   private synchronized boolean trimiteComanda (String cmd) {
-    if (!serverConectat || clientSocket == null || clientSocket.isClosed() || clientOut == null || cmd == null || cmd.isEmpty()) {
+    if (!serverConectat || clientSocket == null || clientSocket.isClosed() || clientOut == null || clientOut.checkError() || cmd == null || cmd.isEmpty()) {
       System.err.println("appClient.trimiteComanda a esuat. Serverul nu este conectat, sau starea aplicatiei este invalida.");
       return false;
     }
 
-    System.out.println("appClient.trimiteComanda " + cmd);
+    myApp.mesajDebug("appClient.trimiteComanda " + cmd);
 
     try {
       clientOut.println(cmd);
@@ -186,7 +202,7 @@ public class appClient extends Thread { 
       return false;
     }
 
-    return true;
+    return !clientOut.checkError();
   }
 
   // metoda ce proceseaza comenzile primite de la server.
@@ -199,7 +215,7 @@ public class appClient extends Thread { 
     String[] arg = cmd.split(" ");
     String fn = arg[0]; // functia, primul element
 
-    System.out.println("appClient.procesareComanda " + fn + " cmd " + cmd);
+    myApp.mesajDebug("appClient.procesareComanda " + fn + " cmd " + cmd);
 
     if ("/conectare".equals(fn) && arg.length == 2) {
       ev_conectareClient(arg[1]);
@@ -245,7 +261,8 @@ public class appClient extends Thread { 
   // la server.
 
   private synchronized void ev_conectareClient (String nume) {
-    System.out.println("appClient.ev_conectareClient " + nume);
+    myApp.mesajDebug("appClient.ev_conectareClient " + nume);
+
     if (nume.equals("#server")) {
       System.err.println("appClient.ev_conectareClient numele este invalid: " + nume);
       return;
@@ -260,7 +277,7 @@ public class appClient extends Thread { 
   }
 
   private synchronized void ev_deconectareClient (String nume) {
-    System.out.println("appClient.ev_deconectareClient " + nume);
+    myApp.mesajDebug("appClient.ev_deconectareClient " + nume);
 
     if (nume.equals("#server") || nume.equals(numeUtilizator)) {
       deconectare();
@@ -306,7 +323,7 @@ public class appClient extends Thread { 
   }
 
   private synchronized void ev_listaClienti (String[] raw) {
-    System.out.println("appClient.ev_listaClienti");
+    myApp.mesajDebug("appClient.ev_listaClienti");
 
     if (!raw[0].equals("/lista")) {
       System.err.println("appClient.ev_listaClienti raw[0] != /lista");
@@ -322,7 +339,7 @@ public class appClient extends Thread { 
   }
 
   private void ev_mesajPrimit (String dela, String catre, String msg) {
-    System.out.println("appClient.ev_mesajPrimit dela " + dela + " catre " + catre);
+    myApp.mesajDebug("appClient.ev_mesajPrimit dela " + dela + " catre " + catre);
 
     if (dela.equals(catre) || dela.equals("#server")) {
       System.err.println("appClient.ev_mesajPrimit eronat dela " + dela + " catre " + catre);
@@ -338,7 +355,7 @@ public class appClient extends Thread { 
     if (!serverConectat) {
       return;
     }
-    System.out.println("appClient.deconectare " + numeUtilizator);
+    myApp.mesajDebug("appClient.deconectare " + numeUtilizator);
 
     trimiteComanda("/deconectare " + numeUtilizator);
 
 
  * © 2010 ROBO Design
  * http://www.robodesign.ro
  *
- * $Date: 2010-05-19 13:59:10 +0300 $
+ * $Date: 2010-05-19 18:47:29 +0300 $
  */
 
 package ChatApp;
@@ -18,6 +18,7 @@ import javax.swing.UIManager; 
 
 // codul principal de gestionare a rularii aplicatiei ChatApp
 public class appMain implements Runnable {
+  public static boolean debug = false;
   private PrimaPagina primapag;
   private PaginaChat chatpag;
   private volatile String paginaActiva = "";
@@ -28,6 +29,8 @@ public class appMain implements Runnable { 
 
   // initializarea aplicatiei
   public void run () {
+    mesajDebug("appMain.run pornire");
+
     try {
       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
     } catch (Exception e) {
@@ -64,12 +67,14 @@ public class appMain implements Runnable { 
 
   // metoda porneste serverul local de gazduire chat.
   public boolean startServer (String nick, int port) {
+    mesajDebug("appMain.startServer nick " + nick + " port " + port);
+
     if (getServerPornit()) {
       if (getServerPort() == port) {
         return true;
       } else {
-        System.err.println("appMain.startServer: serverul este pornit deja.");
-        JOptionPane.showMessageDialog(myFrame, "Serverul este pornit deja pe un alt port.", "Eroare pornire server - ChatApp", JOptionPane.ERROR_MESSAGE);
+        System.err.println("appMain.startServer: serverul este pornit deja pe portul " + getServerPort() + ".");
+        JOptionPane.showMessageDialog(myFrame, "Serverul este pornit deja pe portul" + getServerPort() + ".", "Eroare pornire server - ChatApp", JOptionPane.ERROR_MESSAGE);
         return false;
       }
     }
@@ -85,6 +90,8 @@ public class appMain implements Runnable { 
 
   // metoda permite conectarea la un server de chat.
   public boolean conectareServer (String nick, String server, int port) {
+    mesajDebug("appMain.conectareServer nick " + nick + " server " + server + " port " + port);
+
     if (getServerConectat()) {
       if (nick.equals(getNumeUtilizator()) && server.equals(getServerAdresa()) && port == getServerPort()) {
         return true;
@@ -106,33 +113,35 @@ public class appMain implements Runnable { 
 
   // metoda permite deconectarea de la serverul de chat.
   public void deconectareServer () {
-    System.out.println("appMain.deconectareServer");
+    mesajDebug("appMain.deconectareServer");
     if (getServerPornit()) {
       serverLocal.oprire();
     }
   }
 
   protected void deconectareServerCompleta () {
-    System.out.println("appMain.deconectareServerCompleta");
+    mesajDebug("appMain.deconectareServerCompleta");
     serverLocal = null;
     serverLocal = new appServer(this);
   }
 
   // metoda permite deconectarea clientului de la serverul de chat.
   public void deconectareClient () {
-    System.out.println("appMain.deconectareClient");
+    mesajDebug("appMain.deconectareClient");
     if (getServerConectat()) {
       clientServer.deconectare();
     }
   }
 
   protected void deconectareClientCompleta () {
-    System.out.println("appMain.deconectareClientCompleta");
+    mesajDebug("appMain.deconectareClientCompleta");
     clientServer = null;
     clientServer = new appClient(this);
   }
 
   protected void deconectareGUI () {
+    mesajDebug("appMain.deconectareGUI");
+
     deconectareClient();
     if (paginaActiva.equals("PaginaChat")) {
       afisarePrimaPagina();
@@ -169,7 +178,7 @@ public class appMain implements Runnable { 
   // de la server, de catre clientul conectat.
 
   protected void ev_conectareClient (String nume) {
-    System.out.println("appMain.ev_conectareClient " + nume);
+    mesajDebug("appMain.ev_conectareClient " + nume);
     if (paginaActiva.equals("PaginaChat")) {
       chatpag.ev_conectareClient(nume);
     } else {
@@ -178,7 +187,7 @@ public class appMain implements Runnable { 
   }
 
   protected void ev_deconectareClient (String nume) {
-    System.out.println("appMain.ev_deconectareClient " + nume);
+    mesajDebug("appMain.ev_deconectareClient " + nume);
     if (paginaActiva.equals("PaginaChat")) {
       chatpag.ev_deconectareClient(nume);
       if (nume.equals(getNumeUtilizator())) {
@@ -217,7 +226,8 @@ public class appMain implements Runnable { 
   }
 
   protected void ev_mesajPrimit (String dela, String catre, String msg) {
-    System.out.println("appMain.ev_mesajPrimit dela " + dela + " catre " + catre);
+    mesajDebug("appMain.ev_mesajPrimit dela " + dela + " catre " + catre);
+
     if (paginaActiva.equals("PaginaChat")) {
       chatpag.ev_mesajPrimit(dela, catre, msg);
     } else {
@@ -226,7 +236,8 @@ public class appMain implements Runnable { 
   }
 
   protected void ev_listaClienti () {
-    System.out.println("appMain.ev_listaClienti");
+    mesajDebug("appMain.ev_listaClienti");
+
     if (paginaActiva.equals("PaginaChat")) {
       chatpag.ev_listaClienti();
     } else {
@@ -242,7 +253,7 @@ public class appMain implements Runnable { 
   };
 
   public void iesireApp () {
-    System.out.println("appMain.iesireApp");
+    mesajDebug("appMain.iesireApp");
     deconectareClient();
     deconectareServer();
     System.exit(0);
@@ -302,6 +313,12 @@ public class appMain implements Runnable { 
     }
     return sb.toString();
   }
+
+  public static void mesajDebug (String msg) {
+    if (appMain.debug) {
+      System.out.println(msg);
+    }
+  }
 }
 
 // vim:set fo=wancroql tw=80 ts=2 sw=2 sts=2 sta et ai cin ff=unix:
 
  * © 2010 ROBO Design
  * http://www.robodesign.ro
  *
- * $Date: 2010-05-19 14:07:04 +0300 $
+ * $Date: 2010-05-19 18:46:37 +0300 $
  */
 
 package ChatApp;
 
 import java.net.ServerSocket;
 import java.util.concurrent.ConcurrentHashMap;
+import javax.swing.SwingUtilities;
 
 // clasa ce se ocupa de gazduirea unui server de chat.
 
 public class appServer extends Thread {
-  private appMain myApp;
+  protected appMain myApp;
   private volatile int port = 0;
   private final int portMin = 1024;
   private final int portMax = 65535;
@@ -28,7 +29,7 @@ public class appServer extends Thread { 
 
   // pornirea serverului
   public boolean pornire (int p) {
-    System.out.println("appServer.pornire " + p);
+    myApp.mesajDebug("appServer.pornire " + p);
 
     if (serverPornit || srvSocket != null || p < portMin || p > portMax) {
       System.err.println("appServer.pornire: serverul este pornit deja");
@@ -42,7 +43,7 @@ public class appServer extends Thread { 
 
     try {
       srvSocket = new ServerSocket(p);
-      System.out.println("appServer.pornire: srvSocket ready port " + p);
+      myApp.mesajDebug("appServer.pornire: srvSocket ready port " + p);
     } catch (Exception ex) {
       System.err.println("appServer.pornire: eroare pornire server. " + ex);
       ex.printStackTrace();
@@ -65,7 +66,7 @@ public class appServer extends Thread { 
     appServerThread thread = null;
     String nume = "";
 
-    System.out.println("appServer.run start");
+    myApp.mesajDebug("appServer.run start");
 
     // asculta la infinit conexiuni
     while (serverPornit && !srvSocket.isClosed()) {
@@ -87,7 +88,7 @@ public class appServer extends Thread { 
       thread = null;
     }
 
-    System.out.println("appServer.run end");
+    myApp.mesajDebug("appServer.run end");
 
     if (serverPornit) {
       oprire();
@@ -105,7 +106,7 @@ public class appServer extends Thread { 
     String[] arg = cmd.split(" ");
     String fn = arg[0]; // functia, primul element
 
-    System.out.println("appServer.procesareComanda " + t.getNumeUtilizator() + " fn " + fn + " cmd " + cmd);
+    myApp.mesajDebug("appServer.procesareComanda " + t.getNumeUtilizator() + " fn " + fn + " cmd " + cmd);
 
     if ("/conectare".equals(fn) && arg.length == 2) {
       ev_conectareClient(cmd, t, arg[1]);
@@ -125,13 +126,13 @@ public class appServer extends Thread { 
   }
 
   // aceasta metoda trimite o comanda la toti clientii.
-  private boolean trimiteComanda (String cmd) {
+  private synchronized boolean trimiteComanda (String cmd) {
     if (!serverPornit || srvSocket == null || srvSocket.isClosed() || listaClienti.isEmpty()) {
       System.err.println("appServer.trimiteComanda: starea serverului este invalida.");
       return false;
     }
 
-    System.out.println("appServer.trimiteComanda " + cmd);
+    myApp.mesajDebug("appServer.trimiteComanda " + cmd);
 
     for (appServerThread t : listaClienti.values()) {
       t.trimiteComanda(cmd);
@@ -150,12 +151,12 @@ public class appServer extends Thread { 
     }
 
     if (nume.equals("#server") || listaClienti.containsKey(nume)) {
-      System.err.println("appServer.ev_conectareClient(" + nume + ") clientul incearca sa foloseasca un nume existent");
+      myApp.mesajDebug("appServer.ev_conectareClient(" + nume + ") clientul incearca sa foloseasca un nume existent");
       t.trimiteComanda("/conflict-nume");
       return;
     }
 
-    System.out.println("appServer.ev_conectareClient " + nume);
+    myApp.mesajDebug("appServer.ev_conectareClient " + nume);
 
     String numeVechi = t.getNumeUtilizator();
     if (!numeVechi.equals(nume)) {
@@ -185,7 +186,7 @@ public class appServer extends Thread { 
       return;
     }
 
-    System.out.println("appServer.ev_deconectareClient " + nume);
+    myApp.mesajDebug("appServer.ev_deconectareClient " + nume);
 
     String numeThread = t.getNumeUtilizator();
     if (!numeThread.equals(nume) || !listaClienti.containsKey(numeThread)) {
@@ -226,7 +227,7 @@ public class appServer extends Thread { 
       return;
     }
 
-    System.err.println("appServer.ev_listaClienti pentru " + nume);
+    myApp.mesajDebug("appServer.ev_listaClienti pentru " + nume);
 
     String listaCmd = getListaClientiTextual();
     if (!listaCmd.isEmpty()) {
@@ -237,7 +238,7 @@ public class appServer extends Thread { 
   private void ev_mesajPrimit (String cmd, appServerThread t, String dela, String catre) {
     String nume = t.getNumeUtilizator();
 
-    System.out.println("appServer.ev_mesajPrimit(" + nume + ") dela " + dela + " catre " + catre);
+    myApp.mesajDebug("appServer.ev_mesajPrimit(" + nume + ") dela " + dela + " catre " + catre);
 
     if (!t.getClientInitializat() || !listaClienti.containsKey(nume) || !nume.equals(dela) || catre.equals(dela) || (!catre.equals("#server") && !listaClienti.containsKey(catre))) {
       System.err.println("appServer.ev_mesajPrimit(" + nume + "): clientul nu este initializat sau a trimis un mesaj invalid.");
@@ -255,7 +256,7 @@ public class appServer extends Thread { 
 
   // aceasta metoda returneaza lista de clienti, sub forma de comanda, pentru a 
   // fi trimisa la client.
-  private String getListaClientiTextual () {
+  private synchronized String getListaClientiTextual () {
     if (listaClienti.isEmpty()) {
       return "";
     }
@@ -271,20 +272,20 @@ public class appServer extends Thread { 
 
   // metoda este chemata atunci cand un client se opreste.
   protected synchronized void clientIesire (appServerThread t) {
-    System.out.println("appServer.clientIesire " + t.getNumeUtilizator());
+    myApp.mesajDebug("appServer.clientIesire " + t.getNumeUtilizator());
 
     if (listaClienti.containsKey(t.getNumeUtilizator())) {
       listaClienti.remove(t.getNumeUtilizator());
     }
 
-    System.out.println("appServer.clientIesire listaClienti.size() = " + listaClienti.size());
+    myApp.mesajDebug("appServer.clientIesire listaClienti.size() = " + listaClienti.size());
 
     if (serverPornit && t.getClientInitializat()) {
       trimiteComanda("/deconectare " + t.getNumeUtilizator());
     }
 
     if (serverPornit && listaClienti.isEmpty()) {
-      System.out.println("appServer.clientIesire oprire server");
+      myApp.mesajDebug("appServer.clientIesire oprire server");
 
       if (srvSocket != null && !srvSocket.isClosed()) {
         try {
@@ -298,7 +299,12 @@ public class appServer extends Thread { 
       srvSocket = null;
       port = 0;
       serverPornit = false;
-      myApp.deconectareServerCompleta();
+
+      SwingUtilities.invokeLater(new Runnable () {
+        public void run () {
+          myApp.deconectareServerCompleta();
+        }
+      });
     }
   }
 
@@ -308,7 +314,7 @@ public class appServer extends Thread { 
       return;
     }
 
-    System.out.println("appServer.oprire");
+    myApp.mesajDebug("appServer.oprire");
 
     trimiteComanda("/deconectare #server");
 
 
  * © 2010 ROBO Design
  * http://www.robodesign.ro
  *
- * $Date: 2010-05-19 14:06:38 +0300 $
+ * $Date: 2010-05-19 18:44:30 +0300 $
  */
 
 package ChatApp;
 
 import java.io.BufferedReader;
 import java.io.InputStreamReader;
-import java.io.PrintWriter;
+import java.io.PrintStream;
 import java.net.Socket;
 
 // clasa de tip thread ce gestioneaza o conexiune cu un client. pentru fiecare 
@@ -18,7 +18,7 @@ import java.net.Socket; 
 public class appServerThread extends Thread {
   private Socket client = null;
   private appServer server;
-  private PrintWriter out = null;
+  private PrintStream out = null;
   private BufferedReader in = null;
   private volatile String numeUtilizator = null;
   private volatile boolean clientInitializat = false;
@@ -29,7 +29,7 @@ public class appServerThread extends Thread { 
     server = srv;
     client = sock;
     numeUtilizator = nume;
-    System.out.println("appServerThread initializare " + nume);
+    server.myApp.mesajDebug("appServerThread initializare " + nume);
 
     if (!server.getServerPornit()) {
       System.err.println("appServerThread: serverul nu este pornit");
@@ -38,9 +38,9 @@ public class appServerThread extends Thread { 
     }
 
     try {
-      out = new PrintWriter(client.getOutputStream(), true);
-      in = new BufferedReader(new InputStreamReader(client.getInputStream()));
-      System.out.println("appServerThread initializare reusita " + numeUtilizator);
+      out = new PrintStream(client.getOutputStream(), true, "utf-8");
+      in = new BufferedReader(new InputStreamReader(client.getInputStream(), "utf-8"));
+      server.myApp.mesajDebug("appServerThread initializare reusita " + numeUtilizator);
 
     } catch (Exception ex) {
       System.err.println("appServerThread: esec initializare. " + ex);
@@ -66,13 +66,13 @@ public class appServerThread extends Thread { 
 
   // metoda care ruleaza in thread separat
   public void run () {
-    if (!server.getServerPornit() || client == null || client.isClosed() || out == null || in == null) {
+    if (!server.getServerPornit() || client == null || client.isClosed() || out == null || out.checkError() || in == null) {
       System.err.println("appServerThread.run esec " + numeUtilizator);
       oprire();
       return;
     }
 
-    System.out.println("appServerThread.run " + numeUtilizator);
+    server.myApp.mesajDebug("appServerThread.run " + numeUtilizator);
 
     // primire comenzi de la client
     String cmd = null;
@@ -93,19 +93,19 @@ public class appServerThread extends Thread { 
       cmd = null;
     }
 
-    System.out.println("appServerThread.run end " + numeUtilizator);
+    server.myApp.mesajDebug("appServerThread.run end " + numeUtilizator);
 
     oprire();
   }
 
   // metoda ce permite trimiterea de mesaje la client
   public synchronized boolean trimiteComanda (String cmd) {
-    if (out == null || !server.getServerPornit() || client == null || client.isClosed() || eroare || cmd == null || cmd.trim().isEmpty()) {
+    if (out == null || out.checkError() || !server.getServerPornit() || client == null || client.isClosed() || eroare || cmd == null || cmd.trim().isEmpty()) {
       System.err.println("appServerThread.trimiteComanda " + numeUtilizator + " esec. Starea conexiunii este invalida.");
       return false;
     }
 
-    System.out.println("appServerThread.trimiteComanda " + numeUtilizator + " " + cmd);
+    server.myApp.mesajDebug("appServerThread.trimiteComanda " + numeUtilizator + " " + cmd);
 
     try {
       out.println(cmd);
@@ -115,7 +115,7 @@ public class appServerThread extends Thread { 
       return false;
     }
 
-    return true;
+    return !out.checkError();
   }
 
   public String getNumeUtilizator () {
@@ -155,7 +155,7 @@ public class appServerThread extends Thread { 
 
   // oprire conexiune cu client
   public void oprire () {
-    System.out.println("appServerThread.oprire " + numeUtilizator);
+    server.myApp.mesajDebug("appServerThread.oprire " + numeUtilizator);
 
     try {
       if (in != null) {
 
  */
 
 body {
+  font-family: sans-serif;
   color: #000000;
   background: #ffffff;
   padding: 10px;