Erori fixate si curatare.
[ChatApp.git] / ChatApp / appClient.java
blobb675cdb5e3f477550ca5fb552b129ae89fbd84f4
1 /*
2 * © 2010 ROBO Design
3 * http://www.robodesign.ro
5 * $Date: 2010-05-18 20:11:33 +0300 $
6 */
8 package ChatApp;
10 import java.io.BufferedReader;
11 import java.io.InputStreamReader;
12 import java.io.PrintWriter;
13 import java.net.Socket;
14 import java.net.UnknownHostException;
15 import javax.swing.DefaultListModel;
17 // clasa ce se ocupa de conectarea unui client la un server de chat.
19 public class appClient extends Thread {
20 private appMain myApp;
21 private String serverAdresa;
22 private int serverPort;
23 private String numeUtilizator;
24 private boolean serverConectat;
25 private Socket clientSocket;
26 private PrintWriter clientOut;
27 private BufferedReader clientIn;
28 private DefaultListModel listaClienti;
30 // initializare clasa
31 public appClient (appMain rootApp) {
32 myApp = rootApp;
33 listaClienti = new DefaultListModel();
35 serverAdresa = "";
36 serverPort = 0;
37 numeUtilizator = "";
38 serverConectat = false;
40 clientSocket = null;
41 clientOut = null;
42 clientIn = null;
45 // conectare la server
46 public boolean conectare (String nume, String server, int port) {
47 if (serverConectat) {
48 if (server.equals(serverAdresa) && port == serverPort && nume.equals(numeUtilizator)) {
49 return true;
50 } else {
51 System.err.println("appClient.conectare: aplicatia este deja conectata la un alt server.");
52 return false;
54 } else if (clientSocket != null) {
55 System.err.println("appClient.conectare: aplicatia este intr-o stare invalida.");
56 return false;
59 // verificare nume
60 if (nume == null || nume.isEmpty() || nume.trim().isEmpty() || nume.indexOf(" ") != -1 || nume.equals("#server") || listaClienti.contains(nume)) {
61 System.err.println("appClient.conectare: numele dat este invalid. " + nume);
62 return false;
65 serverAdresa = server;
66 serverPort = port;
67 numeUtilizator = nume;
69 // pornire conexiune socket
70 try {
71 clientSocket = new Socket(serverAdresa, serverPort);
72 clientOut = new PrintWriter(clientSocket.getOutputStream(), true);
73 clientIn = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
75 } catch (UnknownHostException ex) {
76 System.err.println("appClient.conectare: Serverul nu poate fi gasit: " + serverAdresa + ". " + ex);
77 ex.printStackTrace();
79 clientSocket = null;
80 clientOut = null;
81 clientIn = null;
83 return false;
85 } catch (Exception ex) {
86 System.err.println("appClient.conectare: Conectarea la server a esuat. " + ex);
87 ex.printStackTrace();
89 clientSocket = null;
90 clientOut = null;
91 clientIn = null;
93 return false;
96 serverConectat = true;
98 // pornire thread separat de monitorizare a socketului
99 start();
101 return true;
104 // metoda ce ruleaza constant intr-un thread separat, cat timp utilizatorul
105 // este conectat la server.
106 public void run () {
107 if (!serverConectat || clientIn == null || clientSocket == null || clientSocket.isClosed()) {
108 System.err.println("appClient.run: starea aplicatiei este invalida.");
109 return;
112 myApp.afisarePaginaChat();
114 if (!trimiteComanda("/conectare " + numeUtilizator)) {
115 System.err.println("appClient.run: trimiteComanda('/conectare') a esuat. ");
116 serverConectat = false;
119 String cmd = null;
121 while (serverConectat && clientIn != null && clientSocket != null && !clientSocket.isClosed()) {
122 try {
123 cmd = clientIn.readLine();
124 } catch (Exception ex) {
125 System.err.println("appClient.run: clientIn.readLine a esuat. " + ex);
126 ex.printStackTrace();
127 break;
130 if (cmd == null || cmd.trim().isEmpty()) {
131 break;
134 procesareComanda(cmd);
135 cmd = null;
138 serverConectat = false;
140 try {
141 if (clientOut != null) {
142 clientOut.close();
144 if (clientIn != null) {
145 clientIn.close();
147 if (clientSocket != null && !clientSocket.isClosed()) {
148 clientSocket.close();
150 } catch (Exception ex) {
151 System.err.println("appClient.deconectare: inchidere socket esuata. " + ex);
152 ex.printStackTrace();
155 clientSocket = null;
156 clientOut = null;
157 clientIn = null;
159 if (!listaClienti.isEmpty()) {
160 listaClienti.clear();
163 myApp.deconectareClientCompleta();
166 // metoda ce permite trimiterea de comenzi de la client catre server.
167 private boolean trimiteComanda (String cmd) {
168 if (!serverConectat || clientSocket == null || clientSocket.isClosed() || clientOut == null || cmd == null || cmd.isEmpty()) {
169 System.err.println("appClient.trimiteComanda a esuat. Serverul nu este conectat, sau starea aplicatiei este invalida.");
170 return false;
173 try {
174 clientOut.println(cmd);
175 } catch (Exception ex) {
176 System.err.println("appClient.trimiteComanda a esuat. " + ex);
177 ex.printStackTrace();
178 return false;
181 return true;
184 // metoda ce proceseaza comenzile primite de la server.
185 private boolean procesareComanda (String cmd) {
186 if (!serverConectat) {
187 System.err.println("appClient.procesareComanda: serverul nu este conectat.");
188 return false;
191 String[] arg = cmd.split(" ");
192 String fn = arg[0]; // functia, primul element
194 if ("/conectare".equals(fn) && arg.length == 2) {
195 ev_conectareClient(arg[1]);
196 } else if ("/deconectare".equals(fn) && arg.length == 2) {
197 ev_deconectareClient(arg[1]);
198 } else if ("/conflict-nume".equals(fn) && arg.length == 1) {
199 ev_conflictNume();
200 } else if ("/mesaj".equals(fn) && arg.length > 2) {
201 ev_mesajPrimit(arg[1], arg[2], myApp.stringArrayJoin(arg, " ", 3));
202 } else if ("/nume".equals(fn) && arg.length == 3) {
203 ev_schimbareNume(arg[1], arg[2]);
204 } else if ("/lista".equals(fn) && arg.length > 1) {
205 ev_listaClienti(arg);
206 } else {
207 return false;
210 return true;
213 // metoda permite trimiterea de mesaje catre alti utilizatori, de la
214 // utilizatorul/clientul actual.
215 public boolean trimiteMesaj (String catre, String msg) {
216 if (!serverConectat || catre == null || catre.trim().isEmpty() || catre.indexOf(" ") != -1 || msg == null || msg.trim().isEmpty() || catre.equals(numeUtilizator) || (!catre.equals("#server") && !listaClienti.contains(catre))) {
217 System.err.println("appClient.trimiteMesaj: parametrii nu sunt validati.");
218 return false;
221 return trimiteComanda("/mesaj " + numeUtilizator + " " + catre + " " + msg);
224 // metoda permite clientului sa-si schimbe numele.
225 public boolean schimbareNume (String numeNou) {
226 if (!serverConectat || numeNou == null || numeNou.trim().isEmpty() || numeNou.indexOf(" ") != -1 || numeNou.equals("#server") || listaClienti.contains(numeNou)) {
227 System.err.println("appClient.schimbareNume: parametrii nu sunt validati.");
228 return false;
231 return trimiteComanda("/nume " + numeUtilizator + " " + numeNou);
234 // urmeaza cateva metode care sunt chemate in funcite de comenzile primite de
235 // la server.
237 private void ev_conectareClient (String nume) {
238 if (nume.equals("#server")) {
239 System.err.println("appClient.ev_conectareClient numele este invalid: " + nume);
240 return;
243 if (!listaClienti.contains(nume)) {
244 listaClienti.addElement(nume);
245 myApp.ev_conectareClient(nume);
246 } else {
247 System.err.println("appClient.ev_conectareClient numele exista deja " + nume);
251 private void ev_deconectareClient (String nume) {
252 if (nume.equals("#server") || nume.equals(numeUtilizator)) {
253 deconectare();
254 myApp.ev_deconectareClient(nume);
255 } else if (listaClienti.contains(nume)) {
256 listaClienti.removeElement(nume);
257 myApp.ev_deconectareClient(nume);
258 } else {
259 System.err.println("appClient.ev_deconectareClient numele nu exista " + nume);
263 private void ev_conflictNume () {
264 String numeNou = myApp.ev_conflictNume();
265 if (numeNou == null || numeNou.trim().isEmpty() || numeNou.indexOf(" ") != -1 || numeNou.equals("#server")) {
266 myApp.deconectareGUI();
267 return;
270 numeUtilizator = numeNou;
271 trimiteComanda("/conectare " + numeNou);
274 private void ev_schimbareNume (String numeVechi, String numeNou) {
275 if (numeVechi.equals("#server") || numeNou.equals("#server")) {
276 return;
279 int i = listaClienti.indexOf(numeVechi);
280 if (i != -1) {
281 listaClienti.set(i, numeNou);
282 } else {
283 System.err.println("appClient.ev_schimbareNume numeVechi nu exista: " + numeVechi);
284 listaClienti.addElement(numeNou);
287 // schimbarea numelui, la clientul local
288 if (numeVechi.equals(numeUtilizator)) {
289 numeUtilizator = numeNou;
292 myApp.ev_schimbareNume(numeVechi, numeNou);
295 private void ev_listaClienti (String[] raw) {
296 if (!raw[0].equals("/lista")) {
297 System.err.println("appClient.ev_listaClienti raw[0] != /lista");
298 return;
301 listaClienti.clear();
302 for (int i = 1; i < raw.length; i++) {
303 listaClienti.addElement(raw[i]);
306 myApp.ev_listaClienti();
309 private void ev_mesajPrimit (String dela, String catre, String msg) {
310 if (dela.equals(catre) || dela.equals("#server")) {
311 System.err.println("appClient.ev_mesajPrimit eronat dela " + dela + " catre " + catre);
312 } else if (catre.equals("#server") || dela.equals(numeUtilizator) || catre.equals(numeUtilizator)) {
313 myApp.ev_mesajPrimit(dela, catre, msg);
314 } else {
315 System.err.println("appClient.ev_mesajPrimit eronat dela " + dela + " catre " + catre);
319 // metoda permite deconectarea de la server
320 public void deconectare () {
321 if (!serverConectat) {
322 return;
324 trimiteComanda("/deconectare " + numeUtilizator);
326 serverConectat = false;
327 if (!listaClienti.isEmpty()) {
328 listaClienti.clear();
332 public boolean getServerConectat () {
333 return serverConectat;
336 public String getServerAdresa () {
337 return serverAdresa;
340 public int getServerPort () {
341 return serverPort;
344 public String getNumeUtilizator () {
345 return numeUtilizator;
348 public DefaultListModel getListaClienti () {
349 return listaClienti;
353 // vim:set fo=wancroql tw=80 ts=2 sw=2 sts=2 sta et ai cin ff=unix: