Presentation is loading. Please wait.

Presentation is loading. Please wait.

Aplicatii client-server

Similar presentations


Presentation on theme: "Aplicatii client-server"— Presentation transcript:

1 Aplicatii client-server
aplicatia utilizeaza Socket-uri si Thread-uri pentru a realiza o implementare client-server. server-ul se ruleaza pe o singura masina al carei IP (in acest caz localhost) este data la clientii care se leaga la ea. mai multi clienti, de pe aceeasi masina sau de pe altele, se pot lega simultan la server, conexiunea cu fiecare client fiind un Thread separat. implementarea are doua variante de server, una simpla, ce accepta o singura comexiune si una ce foloseste Thread-uri multiple ; in ambele cazuri, terminarea unui Thdread se face prin apasarea tastei <Enter>.

2 Clasele aplicatiei client-server

3 Conceptul de Thread Thread-ul permite ca pe o singura Masina Virtuala sa avem senzatia de mai multe Masini Virtuale ce lucreaza in paralel; o aplicatie cu un singur Thread are un singur punct de intrare, metoda main() si unul singur de iesire; o aplicatie cu mai multe Thread-uri (fire de executie) are un singur punct de intrare (metoda main()) urmat de puncte multiple de intrare sau iesire din alte metode; clasele pentru suportul lucrului cu Thread-uri sunt: java.lang.Thread; java.lang.Object; limbajul Java si Masina Virtuala Java; Thread-urile se executa prin apelul metodei start() ce nu lanseaza in executie neaparat Thread-ul dar il face sigur eligibil pentru executie prin inregistrarea lui in planificatorul de thread-uri (acesta decide care Thread pe care procesor se executa); un Thred poate fi in curs de rulare sau in mai multe stari ne-executabile.

4 Executia si oprirea Thread-ului
cand Thread-ul se executa atunci executa o metoda numita run() ce poate fi proprie sau a unui obiect; pentru ca sa execute metoda run() proprie clasa Thread trebuie derivata iar metoda run() trebuie implementata; pentru a executa metoda run() a unui alt obiect se construieste o instanta a clasei Thread iar la apelul constructorului lui Thread trebuie specificat obiectul a carui run() se porneste; din acest motiv construnctia de Thread-uri se poate face prin extinderea lui Thread si implementarea lui Runnable; la revenirea din metoda run() Thread-ul este terminat si considerat mort (nu mai poate fi repornit desi datele si metodele sunt disponibile); Thread-ul poate fi terminat fortat prin folosirea metodelor stop() si interrupt().

5 Starile Thread-ului running: Thread-ul are toata atentia Masinii Virtuale pentru execuria metodei run(); suspended: permite ca orice Thread (arbitrar) sa faca un al Thread sa nu fie rulat o durata de timp nedefinita; sleeping: nu face nimic si nu foloseste procesorul; blocked: asteapta un eveniment din afara Thread-ului pentru a putra efectua operatii de intrare/iesire; ready: Thread-ul este gata sa treaca in starea de running imediat ce un procesor este disponibil; dead: executia metodei run() din Thread s-a terminat; monitor: poate bloca si debloca alte Thdread-uri. fiecare Thread are o prioritate de la 1 la 10 (implicit 5), cele prioritare sunt rulate inaintea celor mai putin prioritare; planificatorul de thread-uri decide care Thtead sa-l ruleze pe baza prioritatilor acestora (metoda setPriority() permite setarea prioritatii).

6 Aplicatia 1 /1 Urmeaza implementarea clasei Sever ce lucreaza cu o singura conexiune. import java.net.*; import java.io.*; import java.text.SimpleDateFormat; import java.util.Calendar; public class Server { public static String now(String dateFormat) { Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); return sdf.format(cal.getTime()); } public static void main(String[] args) throws IOException { ServerSocket serverSocket = null; //System.out.println("1"); try { serverSocket = new ServerSocket(4444); } catch (IOException e) { System.err.println("Nu se poate asculta portul: 4444."); System.exit(1); Socket clientSocket = null; //System.out.println("2"); clientSocket = serverSocket.accept(); System.err.println("Accept nereusit.");

7 Aplicatia 1 / 2 System.out.println("3");
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String inputLine, outputLine; InetAddress thisIp = InetAddress.getLocalHost(); System.out.println("Server-ul ruleaza."); while ((inputLine = in.readLine()) != null) { System.out.print("Comunic ... "); outputLine = inputLine + now(" yyyy-MM-dd HH:mm:ss ")+"IP:"+thisIp.getHostAddress(); out.println(outputLine); System.out.println(outputLine); if(inputLine.length()==0) break; } System.out.println("Server OPRIT!"); out.close(); in.close(); clientSocket.close(); serverSocket.close();

8 Aplicatia 1 / 3 Urmeaza implementarea clasei Client. import java.io.*;
import java.net.*; public class Client { public static void main(String[] args) throws IOException { Socket echoSocket = null; PrintWriter out = null; BufferedReader in = null; try { echoSocket = new Socket("localhost", 14444); out = new PrintWriter(echoSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream())); } catch (UnknownHostException e) { System.err.println("Nu stiu cine este host: localhost"); System.exit(1); } catch (IOException e) { System.err.println("Nu pot efecta operatii de I/E cu: localhost."); }

9 Aplicatia 1 / 4 BufferedReader stdIn = new BufferedReader( new InputStreamReader(System.in)); String userInput, serverInput; while ((userInput = stdIn.readLine()) != null) { out.println(userInput); serverInput=in.readLine(); System.out.println("ecou: " + serverInput); if(userInput.length()==0) break; } out.close(); in.close(); stdIn.close(); echoSocket.close();

10 Aplicatia 1 / 5 Urmeaza implementarea Server-ului ce lucreaza cu conexiuni multiple. Are doua clase ServerMClient (punctul de intrare) si ServerMThread (Thread-urile). import java.net.*; import java.io.*; public class ServerMClient { public static void main(String[] args) throws IOException { ServerSocket serverSocket = null; boolean listening = true; int i=0; try { serverSocket = new ServerSocket(14444); } catch (IOException e) { System.err.println("Server - Nu se poate asculta portul: "); System.exit(-1); } System.out.println("Serverul ruleaza si poate primi comenzi."); while (listening) { Runnable r=new ServerMThread(serverSocket.accept(),i); Thread t = new Thread(r); t.start(); ++i; System.out.println("Serverul este oprit."); serverSocket.close();

11 Aplicatia 1 / 6 import java.net.*; import java.io.*;
import java.text.SimpleDateFormat; import java.util.Calendar; public class ServerMThread extends Thread { private Socket clientSocket = null; int i; public ServerMThread(Socket socket, int contor) { super("ServerMThread"); i=contor; this.clientSocket = socket; } public static String now(String dateFormat) { Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); return sdf.format(cal.getTime()); public void run() { try { PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String inputLine, outputLine;

12 Aplicatia 1 / 7 InetAddress thisIp = InetAddress.getLocalHost();
System.out.println("Thread ruleaza (running)."); while ((inputLine = in.readLine()) != null) { System.out.print("Comunicare ... " + i+" -> "); outputLine = inputLine + now(" yyyy-MM-dd HH:mm:ss ")+" IP:"+thisIp.getHostAddress(); out.println(outputLine); System.out.println(outputLine); if(inputLine.length()==0) break; } out.close(); in.close(); clientSocket.close(); System.out.println("Thread-ul" +i+" este inchis (dead)."); } catch (IOException e) { e.printStackTrace();

13 Bibliografie > Java: course, IDE (JDeveloper), JDK and JRE, JDeveloper labs. > Getting Started With the JDeveloper IDE


Download ppt "Aplicatii client-server"

Similar presentations


Ads by Google