3 * http://www.robodesign.ro
5 * $Date: 2010-05-18 20:11:33 +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 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
;
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 // pornire conexiune socket
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
);
85 } catch (Exception ex
) {
86 System
.err
.println("appClient.conectare: Conectarea la server a esuat. " + ex
);
96 serverConectat
= true;
98 // pornire thread separat de monitorizare a socketului
104 // metoda ce ruleaza constant intr-un thread separat, cat timp utilizatorul
105 // este conectat la server.
107 if (!serverConectat
|| clientIn
== null || clientSocket
== null || clientSocket
.isClosed()) {
108 System
.err
.println("appClient.run: starea aplicatiei este invalida.");
112 myApp
.afisarePaginaChat();
114 if (!trimiteComanda("/conectare " + numeUtilizator
)) {
115 System
.err
.println("appClient.run: trimiteComanda('/conectare') a esuat. ");
116 serverConectat
= false;
121 while (serverConectat
&& clientIn
!= null && clientSocket
!= null && !clientSocket
.isClosed()) {
123 cmd
= clientIn
.readLine();
124 } catch (Exception ex
) {
125 System
.err
.println("appClient.run: clientIn.readLine a esuat. " + ex
);
126 ex
.printStackTrace();
130 if (cmd
== null || cmd
.trim().isEmpty()) {
134 procesareComanda(cmd
);
138 serverConectat
= false;
141 if (clientOut
!= null) {
144 if (clientIn
!= null) {
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();
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.");
174 clientOut
.println(cmd
);
175 } catch (Exception ex
) {
176 System
.err
.println("appClient.trimiteComanda a esuat. " + ex
);
177 ex
.printStackTrace();
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.");
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) {
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
);
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.");
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.");
231 return trimiteComanda("/nume " + numeUtilizator
+ " " + numeNou
);
234 // urmeaza cateva metode care sunt chemate in funcite de comenzile primite de
237 private void ev_conectareClient (String nume
) {
238 if (nume
.equals("#server")) {
239 System
.err
.println("appClient.ev_conectareClient numele este invalid: " + nume
);
243 if (!listaClienti
.contains(nume
)) {
244 listaClienti
.addElement(nume
);
245 myApp
.ev_conectareClient(nume
);
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
)) {
254 myApp
.ev_deconectareClient(nume
);
255 } else if (listaClienti
.contains(nume
)) {
256 listaClienti
.removeElement(nume
);
257 myApp
.ev_deconectareClient(nume
);
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();
270 numeUtilizator
= numeNou
;
271 trimiteComanda("/conectare " + numeNou
);
274 private void ev_schimbareNume (String numeVechi
, String numeNou
) {
275 if (numeVechi
.equals("#server") || numeNou
.equals("#server")) {
279 int i
= listaClienti
.indexOf(numeVechi
);
281 listaClienti
.set(i
, numeNou
);
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");
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
);
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
) {
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 () {
340 public int getServerPort () {
344 public String
getNumeUtilizator () {
345 return numeUtilizator
;
348 public DefaultListModel
getListaClienti () {
353 // vim:set fo=wancroql tw=80 ts=2 sw=2 sts=2 sta et ai cin ff=unix: