3 * http://www.robodesign.ro
5 * $Date: 2010-05-19 14:09:54 +0300 $
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 volatile String serverAdresa
;
22 private volatile int serverPort
;
23 private volatile String numeUtilizator
;
24 private volatile boolean serverConectat
;
25 private Socket clientSocket
;
26 private PrintWriter clientOut
;
27 private BufferedReader clientIn
;
28 private DefaultListModel listaClienti
;
31 public appClient (appMain rootApp
) {
33 listaClienti
= new DefaultListModel();
38 serverConectat
= false;
45 // conectare la server
46 public boolean conectare (String nume
, String server
, int port
) {
48 if (server
.equals(serverAdresa
) && port
== serverPort
&& nume
.equals(numeUtilizator
)) {
51 System
.err
.println("appClient.conectare: aplicatia este deja conectata la un alt server.");
54 } else if (clientSocket
!= null) {
55 System
.err
.println("appClient.conectare: aplicatia este intr-o stare invalida.");
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
);
65 serverAdresa
= server
;
67 numeUtilizator
= nume
;
69 System
.out
.println("appClient.conectare " + numeUtilizator
+ " " + serverAdresa
+ " " + serverPort
);
71 // pornire conexiune socket
73 clientSocket
= new Socket(serverAdresa
, serverPort
);
74 clientOut
= new PrintWriter(clientSocket
.getOutputStream(), true);
75 clientIn
= new BufferedReader(new InputStreamReader(clientSocket
.getInputStream()));
77 } catch (UnknownHostException ex
) {
78 System
.err
.println("appClient.conectare: Serverul nu poate fi gasit: " + serverAdresa
+ ". " + ex
);
87 } catch (Exception ex
) {
88 System
.err
.println("appClient.conectare: Conectarea la server a esuat. " + ex
);
98 serverConectat
= true;
100 // pornire thread separat de monitorizare a socketului
106 // metoda ce ruleaza constant intr-un thread separat, cat timp utilizatorul
107 // este conectat la server.
109 if (!serverConectat
|| clientIn
== null || clientSocket
== null || clientSocket
.isClosed()) {
110 System
.err
.println("appClient.run: starea aplicatiei este invalida.");
114 System
.out
.println("appClient.run start " + numeUtilizator
);
116 myApp
.afisarePaginaChat();
118 if (!trimiteComanda("/conectare " + numeUtilizator
)) {
119 System
.err
.println("appClient.run: trimiteComanda('/conectare') a esuat. ");
120 serverConectat
= false;
125 while (serverConectat
&& clientIn
!= null && clientSocket
!= null && !clientSocket
.isClosed()) {
127 cmd
= clientIn
.readLine();
128 } catch (Exception ex
) {
129 System
.err
.println("appClient.run: clientIn.readLine a esuat. " + ex
);
130 ex
.printStackTrace();
134 if (cmd
== null || cmd
.trim().isEmpty()) {
138 procesareComanda(cmd
);
142 System
.out
.println("appClient.run end " + numeUtilizator
);
144 serverConectat
= false;
147 if (clientOut
!= null) {
150 if (clientIn
!= null) {
153 if (clientSocket
!= null && !clientSocket
.isClosed()) {
154 clientSocket
.close();
156 } catch (Exception ex
) {
157 System
.err
.println("appClient.deconectare: inchidere socket esuata. " + ex
);
158 ex
.printStackTrace();
165 if (!listaClienti
.isEmpty()) {
166 listaClienti
.clear();
169 myApp
.deconectareClientCompleta();
172 // metoda ce permite trimiterea de comenzi de la client catre server.
173 private synchronized boolean trimiteComanda (String cmd
) {
174 if (!serverConectat
|| clientSocket
== null || clientSocket
.isClosed() || clientOut
== null || cmd
== null || cmd
.isEmpty()) {
175 System
.err
.println("appClient.trimiteComanda a esuat. Serverul nu este conectat, sau starea aplicatiei este invalida.");
179 System
.out
.println("appClient.trimiteComanda " + cmd
);
182 clientOut
.println(cmd
);
183 } catch (Exception ex
) {
184 System
.err
.println("appClient.trimiteComanda a esuat. " + ex
);
185 ex
.printStackTrace();
192 // metoda ce proceseaza comenzile primite de la server.
193 private boolean procesareComanda (String cmd
) {
194 if (!serverConectat
) {
195 System
.err
.println("appClient.procesareComanda: serverul nu este conectat.");
199 String
[] arg
= cmd
.split(" ");
200 String fn
= arg
[0]; // functia, primul element
202 System
.out
.println("appClient.procesareComanda " + fn
+ " cmd " + cmd
);
204 if ("/conectare".equals(fn
) && arg
.length
== 2) {
205 ev_conectareClient(arg
[1]);
206 } else if ("/deconectare".equals(fn
) && arg
.length
== 2) {
207 ev_deconectareClient(arg
[1]);
208 } else if ("/conflict-nume".equals(fn
) && arg
.length
== 1) {
210 } else if ("/mesaj".equals(fn
) && arg
.length
> 2) {
211 ev_mesajPrimit(arg
[1], arg
[2], myApp
.stringArrayJoin(arg
, " ", 3));
212 } else if ("/nume".equals(fn
) && arg
.length
== 3) {
213 ev_schimbareNume(arg
[1], arg
[2]);
214 } else if ("/lista".equals(fn
) && arg
.length
> 1) {
215 ev_listaClienti(arg
);
223 // metoda permite trimiterea de mesaje catre alti utilizatori, de la
224 // utilizatorul/clientul actual.
225 public boolean trimiteMesaj (String catre
, String msg
) {
226 if (!serverConectat
|| catre
== null || catre
.trim().isEmpty() || catre
.indexOf(" ") != -1 || msg
== null || msg
.trim().isEmpty() || catre
.equals(numeUtilizator
) || (!catre
.equals("#server") && !listaClienti
.contains(catre
))) {
227 System
.err
.println("appClient.trimiteMesaj: parametrii nu sunt validati.");
231 return trimiteComanda("/mesaj " + numeUtilizator
+ " " + catre
+ " " + msg
);
234 // metoda permite clientului sa-si schimbe numele.
235 public boolean schimbareNume (String numeNou
) {
236 if (!serverConectat
|| numeNou
== null || numeNou
.trim().isEmpty() || numeNou
.indexOf(" ") != -1 || numeNou
.equals("#server") || listaClienti
.contains(numeNou
)) {
237 System
.err
.println("appClient.schimbareNume: parametrii nu sunt validati.");
241 return trimiteComanda("/nume " + numeUtilizator
+ " " + numeNou
);
244 // urmeaza cateva metode care sunt chemate in funcite de comenzile primite de
247 private synchronized void ev_conectareClient (String nume
) {
248 System
.out
.println("appClient.ev_conectareClient " + nume
);
249 if (nume
.equals("#server")) {
250 System
.err
.println("appClient.ev_conectareClient numele este invalid: " + nume
);
254 if (!listaClienti
.contains(nume
)) {
255 listaClienti
.addElement(nume
);
256 myApp
.ev_conectareClient(nume
);
258 System
.err
.println("appClient.ev_conectareClient numele exista deja " + nume
);
262 private synchronized void ev_deconectareClient (String nume
) {
263 System
.out
.println("appClient.ev_deconectareClient " + nume
);
265 if (nume
.equals("#server") || nume
.equals(numeUtilizator
)) {
267 myApp
.ev_deconectareClient(nume
);
268 } else if (listaClienti
.contains(nume
)) {
269 listaClienti
.removeElement(nume
);
270 myApp
.ev_deconectareClient(nume
);
272 System
.err
.println("appClient.ev_deconectareClient numele nu exista " + nume
);
276 private void ev_conflictNume () {
277 String numeNou
= myApp
.ev_conflictNume();
278 if (numeNou
== null || numeNou
.trim().isEmpty() || numeNou
.indexOf(" ") != -1 || numeNou
.equals("#server")) {
279 myApp
.deconectareGUI();
283 numeUtilizator
= numeNou
;
284 trimiteComanda("/conectare " + numeNou
);
287 private synchronized void ev_schimbareNume (String numeVechi
, String numeNou
) {
288 if (numeVechi
.equals("#server") || numeNou
.equals("#server")) {
292 int i
= listaClienti
.indexOf(numeVechi
);
294 listaClienti
.set(i
, numeNou
);
296 System
.err
.println("appClient.ev_schimbareNume numeVechi nu exista: " + numeVechi
);
297 listaClienti
.addElement(numeNou
);
300 // schimbarea numelui, la clientul local
301 if (numeVechi
.equals(numeUtilizator
)) {
302 numeUtilizator
= numeNou
;
305 myApp
.ev_schimbareNume(numeVechi
, numeNou
);
308 private synchronized void ev_listaClienti (String
[] raw
) {
309 System
.out
.println("appClient.ev_listaClienti");
311 if (!raw
[0].equals("/lista")) {
312 System
.err
.println("appClient.ev_listaClienti raw[0] != /lista");
316 listaClienti
.clear();
317 for (int i
= 1; i
< raw
.length
; i
++) {
318 listaClienti
.addElement(raw
[i
]);
321 myApp
.ev_listaClienti();
324 private void ev_mesajPrimit (String dela
, String catre
, String msg
) {
325 System
.out
.println("appClient.ev_mesajPrimit dela " + dela
+ " catre " + catre
);
327 if (dela
.equals(catre
) || dela
.equals("#server")) {
328 System
.err
.println("appClient.ev_mesajPrimit eronat dela " + dela
+ " catre " + catre
);
329 } else if (catre
.equals("#server") || dela
.equals(numeUtilizator
) || catre
.equals(numeUtilizator
)) {
330 myApp
.ev_mesajPrimit(dela
, catre
, msg
);
332 System
.err
.println("appClient.ev_mesajPrimit eronat dela " + dela
+ " catre " + catre
);
336 // metoda permite deconectarea de la server
337 public void deconectare () {
338 if (!serverConectat
) {
341 System
.out
.println("appClient.deconectare " + numeUtilizator
);
343 trimiteComanda("/deconectare " + numeUtilizator
);
345 serverConectat
= false;
346 if (!listaClienti
.isEmpty()) {
347 listaClienti
.clear();
351 public boolean getServerConectat () {
352 return serverConectat
;
355 public String
getServerAdresa () {
359 public int getServerPort () {
363 public String
getNumeUtilizator () {
364 return numeUtilizator
;
367 public DefaultListModel
getListaClienti () {
372 // vim:set fo=wancroql tw=80 ts=2 sw=2 sts=2 sta et ai cin ff=unix: