Sunteți pe pagina 1din 9

Universitatea Tehnică a Moldovei

Facultatea Calculatoare Informatică și Microelectronică

Departamentul ISA

Lucrare de laborator NR. 2

Programare In Retea

Tema: Study OSI model, HTTP and implement a client app which can do multiple HTTP requests
concurrently.

Elaborat de : studenta gr. TI-152

Verificat de : lector universitar

Chişinău 2018
Conditions:

The legacy system isn't documented properly (all you know about it - URL and that it must
return CSV), so you need to read about HTTP and discover what additional info you may
need to supply to get a response with requested data.

The application must offer next functionality:

 retrieve the list of orders (since it's a legacy system, it exports data in CSV format :( )
within a date interval
 retrieve the list of available categories (also CSV :( )
 parse and validate received data
 aggregate data
 display results to the user
 cache received data locally

There are some requirements, though:

 The application should have a friendly UI


 When the application is opened, it must load cached data if it's available
 All I/O operations mustn't block UI
 Requests must be performed concurrently whenever it's possible
 Aggregation of the data must performed concurrently
 Application must display results and cache them concurrently

Prerechizite

OSI Model and it’s basics:

OSI este un acronim pentru interconectarea sistemelor deschise, engleză Open Systems
Interconnection), pe scurt: OSI, este o stiva de protocoale de comunicație ierarhic foarte des
folosit pentru a realiza o rețea de calculatoare. OSI este un standard al Organizației
internaționale de standardizare, emis în 1984.
Modelul de Referință OSI oferă metode generale pentru realizarea comunicației, sistemelor
de calcul pentru ca acestea să poată schimba informații, indiferent de particularitățile
constructive ale sistemelor (fabricant, sistem de operare, țară, etc). Modelul de Referință are
aplicații în toate domeniile comunicațiilor de date, nu doar în cazul rețelelor de calculatoare.
Modelul OSI divizează problema complexă a comunicării între două sau mai multe sisteme în
7 straturi numite și niveluri (layers) distincte, într-o arhitectură ierarhică. Fiecare strat (nivel)
are funcții bine determinate și comunică doar cu straturile adiacente. Cele 7 niveluri ale
Modelului de Referință se numesc: Aplicație (nivelul 7, superior) , Prezentare, Sesiune,
Transport, Rețea, Legătură de date, Fizic (nivelul 1, inferior). Termenii corespunzători din
engleză sunt Application, Presentation, Session, Transport, Network, Data link, Physical.
Câteva din avantajele folosirii OSI:
1. Descompune fenomenul de comunicare în rețea în părți mai mici și implicit mai
simple.
2. Standardizează componentele unei rețele permițînd dezvoltarea independentă de un
anumit producător.
3. Permite comunicarea între diferite tipuri de hardware și software.
4. Permite o înțelegere mai ușoară a fenomenelor de comunicație.

Fig1.-Comunicarea idealizata a doi utilizatori

Serialization and deserialization:

Serializarea este un proces prin care un obiect este transformat intr-un stream in asa fel incat
acest starea sa poata fi reconvertit inapoi intr-un obiect. Java asigura stocarea obiectelor in
fisiere pe hard disckul calculatorului, dar si metode de a obtine din aceste fisiere datele
inapoi in programe. Deserializarea fiind implicit transformarea streamului de date intr-un
obiect.

Concurrenta si Paralelizm:

În știința calculatoarelor, concurrency se referă la capacitatea diferitelor părți sau unități ale
unui program, algoritm sau problemă de a fi executate în afara ordinii sau în ordine parțială,
fără a afecta rezultatul final. Acest lucru permite executarea paralelă a unităților concurente,
care pot îmbunătăți semnificativ viteza generală a execuției în sistemele multi-procesor și
multi-core. În termeni mai tehnici, concurrency se referă la proprietatea de descompunere a
unui program, algoritm sau problemă în componente sau unități comandate independent sau
comandate parțial.
Concurrency este atunci când două sarcini pot începe, rula și termina în perioade de timp care
se suprapun. Paralelismul este atunci când sarcinile sunt executate în mod literal în același
timp, de exemplu. pe un procesor multi-core.

Concurrency este compoziția proceselor care execută independent, în timp ce paralelismul


este executarea simultană a unor calcule (eventual corelate).

Concurrency este de a face cu o mulțime de lucruri deodată. Paralelismul este de a face multe
lucruri deodată.

O aplicație poate fi simultană - dar nu paralelă, ceea ce înseamnă că procesează mai mult de o
sarcină în același timp, dar nu se execută simultan două sarcini.

O aplicație poate fi paralelă - dar nu simultană, ceea ce înseamnă că procesează mai multe
sub-sarcini ale unei sarcini în CPU multi-core în același timp.

O aplicație nu poate fi nici paralelă, nici concurentă, ceea ce înseamnă că procesează toate
sarcinile una câte una, succesiv.

O aplicație poate fi paralelă și simultană, ceea ce înseamnă că procesează mai multe sarcini
simultan în procesorul multi-core în același timp.

Concurenta

Concurrency este, în esență, aplicabil atunci când vorbim despre minim două sarcini sau mai
mult. Atunci când o aplicație este capabilă să execute două activități în același timp, numim
aplicație concurentă. Chiar dacă sarcinile pe care le desfășoară aici arata simultan, dar în
esență nu pot. Ei profită de funcția de procesare a timpului de procesare a sistemului de
operare, în care fiecare sarcină conduce o parte din sarcina sa și apoi trece în starea de
așteptare. Când prima sarcină este în stare de așteptare, CPU-ul este alocat a doua sarcină
pentru a finaliza o parte din sarcină.

Sistemul de operare bazat pe prioritatea sarcinilor, astfel, atribuie CPU și alte resurse de
calcul, de ex. memorie; rândul său, la toate sarcinile și să le dați șansa să le finalizați. Pentru
utilizatorul final, se pare că toate sarcinile rulează în paralel. Aceasta se numește
concurrency.

Paralelism

Paralelismul nu necesită existența a două sarcini. Efectuează literalmente părți fizice ale
sarcinilor SAU mai multe sarcini, folosind în același timp infrastructura multi-core a
procesorului, atribuind un nucleu fiecărei sarcini sau sub-sarcini.

Paralelismul necesită hardware cu mai multe unități de procesare, în esență. În procesorul cu


un singur nucleu, puteți obține concurență, dar NU paralelism.

Metode asincrone

Acest lucru nu este legat de Concurrency și paralelism, asincronia este folosită pentru a
prezenta impresia de concurrent sau paralel de tasking, dar în mod eficient un apel de metodă
asincronă este folosit în mod normal pentru un proces care trebuie să facă munca departe de
aplicația curentă și nu vrem să așteptați și blocați aplicația în așteptarea răspunsului.

Informatie complementara:
There are 4 parts in a URL:
1. Protocol: The application-level protocol used by the client and server, e.g., HTTP,
FTP, and telnet.
2. Hostname: The DNS domain name (e.g., www.nowhere123.com) or IP address (e.g.,
192.128.1.2) of the server.
3. Port: The TCP port number that the server is listening for incoming requests from the
clients.
4. Path-and-file-name: The name and location of the requested resource, under the server
document base directory.
For example, in the URL http://www.nowhere123.com/docs/index.html, the communication
protocol is HTTP; the hostname is www.nowhere123.com. The port number was not
specified in the URL, and takes on the default number, which is TCP port 80 for HTTP. The
path and file name for the resource to be located is "/docs/index.html".
Other examples of URL are:
ftp://www.ftp.org/docs/test.txt
mailto:user@test101.com
news:soc.culture.Singapore
telnet://www.nowhere123.com/

HTTP Protocol
As mentioned, whenever you enter a URL in the address box of the browser, the browser
translates the URL into a request message according to the specified protocol; and sends the
request message to the server.
For example, the browser translated the
URL http://www.nowhere123.com/doc/index.html into the following request message:
GET /docs/index.html HTTP/1.1
Host: www.nowhere123.com
Accept: image/gif, image/jpeg, */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
(blank line)

When this request message reaches the server, the server can take either one of these actions:
1. The server interprets the request received, maps the request into a file under the server's
document directory, and returns the file requested to the client.
2. The server interprets the request received, maps the request into a program kept in the
server, executes the program, and returns the output of the program to the client.
3. The request cannot be satisfied, the server returns an error message.
An example of the HTTP response message is as shown:
HTTP/1.1 200 OK
Date: Sun, 18 Oct 2009 08:56:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Sat, 20 Nov 2004 07:16:26 GMT
ETag: "10000000565a5-2c-3e94b66c2e680"
Accept-Ranges: bytes
Content-Length: 44
Connection: close
Content-Type: text/html
X-Pad: avoid browser bug

<html><body><h1>It works!</h1></body></html>
The browser receives the response message, interprets the message and displays the contents
of the message on the browser's window according to the media type of the response (as in
the Content-Type response header). Common media type include "text/plain", "text/html",
"image/gif", "image/jpeg", "audio/mpeg", "video/mpeg", "application/msword", and
"application/pdf".
In its idling state, an HTTP server does nothing but listening to the IP address(es) and port(s)
specified in the configuration for incoming request. When a request arrives, the server
analyzes the message header, applies rules specified in the configuration, and takes the
appropriate action. The webmaster's main control over the action of web server is via the
configuration, which will be dealt with in greater details in the later sections.

Realizarea Lucrarii:
HTTP request

 URL obj = new URL(url);


HttpURLConnection con = (HttpURLConnection) obj.openConnection();
//trying to use executor service to run it on multiple threads

// optional default is GET


con.setRequestMethod("GET");
//add request headers
con.setRequestProperty("Accept","text/csv");
con.setRequestProperty("x-api-key","55193451-1409-4729-9cd4-
7c65d63b8e76");

int responseCode = con.getResponseCode();


System.out.println("\nSending 'GET' request to URL : " + url);
System.out.println("Response Code : " + responseCode);

BufferedReader in = new BufferedReader(


new InputStreamReader(con.getInputStream()));

Prelucrarea formatului csv

 String response = connect.sendGet(url);


List<String> items = Arrays.asList(response.toString().split(","));
Inscrierea datelor utilizind Colectii

4. for (int i = 3; i < items.size() - 1; i++) {


List<String> orderElements = new ArrayList<>();
orderElements.add(items.get(i));
i++;
orderElements.add(items.get(i));
i++;
if (orders.keySet().contains(items.get(i))) {
String newKey = items.get(i) + "duplicate" + i;
orders.put(newKey, orderElements);
} else {
orders.put(items.get(i), orderElements);
}
}

Agregarea si Inscrierea intrun Concurrent Hash Map

for (String keyCateg: category.keySet()) {


Thread th=new Thread(new Runnable() {
@Override
public void run() {
List<List<String>> totalOrder= new ArrayList<>();
for (String key: orders.keySet()) {

if(key.equalsIgnoreCase(keyCateg)||key.contains(keyCateg+"duplicate")){
totalOrder.add(orders.get(key));
}
}
result.putIfAbsent(category.get(keyCateg),totalOrder);
}
});
th.start();
th.join();

}
ScreenShots

Fig2-Http request on postman

Fig.3 – Primirea raspunsului

Concluzie:
Utilizarea mai multor fire de executie concurrent ne permite sa folosim optimal timpul de executie,
task-ul este executat in dependent de complexitatea acestuia si preponderent in acelasi timp de
executie. In aceasta lucrare am observant atunci cind efectuam un request la o adresa si pornim intii
Thread1.start() dupa care Thread2.start() nu obtinem rezultatele threadului 1 intii, acestea se executa
practic in acelasi timp insa threadul 2 estepreponderent mai rapid avind un raspuns cu mult mai scurt.
Insasi in ceea ce priveste timpul de executie prelucrarea unor colectii pe mai multe fire de executie
minimizeaza timpul de executie, prin utilizarea mult mai eficienta a resurselor.