Java - Operatii de Intrare/iEsire (I/E)

Download Report

Transcript Java - Operatii de Intrare/iEsire (I/E)

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 Threaduri multiple ;
in ambele cazuri, terminarea unui Thdread se face prin
apasarea tastei <Enter>.
Clasele aplicatiei clientserver
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 neexecutabile.
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().
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 threaduri decide care Thtead sa-l ruleze pe baza prioritatilor acestora
(metoda setPriority() permite setarea prioritatii).
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");
try {
clientSocket = serverSocket.accept();
} catch (IOException e) {
System.err.println("Accept nereusit.");
System.exit(1);
}
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();
}
}
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.");
System.exit(1);
}
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();
}
}
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: 14444.");
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();
}
}
Aplicatia 1 / 6
import
import
import
import
java.net.*;
java.io.*;
java.text.SimpleDateFormat;
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;
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();
}
}
}
Bibliografie


http://www.east.utcluj.ro/mb/mep/antal/downloads.html > Java: course,
IDE (JDeveloper), JDK and JRE, JDeveloper labs.
http://docs.oracle.com/cd/E18941_01/tutorials/jdtut_11r2_50/jdtut_11r2
_50.html > Getting Started With the JDeveloper IDE