Sunteți pe pagina 1din 9

Ministerul Educației al Republicii Moldova

Universitatea Tehnică a Moldovei


Catedra Automatică și Tehnologii Informaționale

RAPORT

Lucrare de laborator Nr.3


la disciplina Programarea în Rețea
Tema: Protocolul HTTP. Proiectare și programarea aplicației client.

A efectuat: st.grupei SI-131, Gheorghisenco L.

A verificat: Antohi Ionel

Chișinău 2016
Scopul lucrării
Dobândirea abilităților de utilizare și creare a aplicațiilor client pentru servere HTTP.
Obiectiv
Să se construiască o aplicație, un WebCrawler, care va căuta cuvântul introdus, pentru
adâncimea și numărul firelor stabilite.
Generalizare
Dacă se va efectua o analiză a structurii și nivelelor întregului Web, atunci se poate spune cu
siguranță că protocolul HTTP stă la baza sistemului gigantic. Un protocol de comunicație și metoda
cea mai des utilizată, destinată accesării informației în Internet, resursele căruia sunt păstrate pe
serverele WWW (World Wide Web) . Anume acest tool presupune că pe calculatorul destinației
rulează un program care înțelege în totalmente structura dată.
Fișierul trimis ar putea fi un document HTML, fișier grafic, de sunt, animație sau video. La fel
un program executabil pe server-ul respectiv sau un editor de text. Conform clasificării după modelul
de referință OSI, acest protocol e de nivel aplicație.
Deseori, utilizatorul dorește să transmită sau să preia anumite informații către un anumit
website. Atunci, HTTP pune la dispoziție mai multe metode speciale.
Pentru a fi înțelege mai bine această simbioză dintre Server și Client, diagrama ce urmează
descrie modalitatea prin care browser-ul transmite un mesaj de cerere, iar server-ul ne returnează un
anumit răspuns, desigur aceste evenimente au loc prin intermediul aceluiași protocol HTTP. (fig.1)

Fig.1 – Interacțiunea și expedierea mesajelor între Client și Server.[ CITATION


Che16 \l 1033 ]
În acest context, se poate accentua faptul că, orice poate fi identificat prin URL se va numi
resursă. Anume Uniform Resource Locator în mod unic găsește diferite date și informații în întregul
web.
Structura lui constituie 4 părți esențiale:
1. Protocolul. Un application-level instrument utilizat de client și server (ex. HTTP,FTP sau telnet);
2. Hostname. Un nume DNS (ex. www.laborator3.com) atribuit unei adrese IP (ex. 192.168.1.2);
3. Portul. Un număr atribuit TCP (Transmission Control Protocol), care este citit de server la
apariția unui anumit request;
4. Path-and-file-name. Un nume și locație a resursei cererii, aflată în documentul serverului a
directoriului de bază.
Cum s-a menționat anterior, anume următoarele metode ne permit întreaga interacțiune.
Astfel,
pentru a citi o pagină web va fi realizată următoarea cerere, care poartă numele GET, ce va
transforma URL-ul în următorul mesaj. (fig.2)

Fig.2 – Câmpurile metodei GET.[ CITATION Edw16 \l 1033 ]


Mai jos este prezentat un exemplu de HTTP response message, atunci când browser-ul va
primi acest mesaj, îl va interpreta și va afișa în concordanță cu tipul media stocat în Content-Type
header. (fig.3)
Fig.3 – Structura mesajului HTTP response.
Acesta poate include “text/plain”, “text/html”, “image/gif ”, “image/jpeg”,
“audio/video/mpeg”, “application/msword” sau “application/pdf”.

Analiză
Pentru a înțelege mai bine interacțiunea dintre metodele GET și POST, se lansează un simplu
server pe Node.js, cu ajutorul comenzii npm start. După care, se vizitează link-ul
http://localhost:3000
și se întreprind careva acțiuni, spre exemplu înregistrare, logare, dezautentificare. (fig.4)

Fig.4 – Vizualizarea interacțiunii metodelor HTTP.[ CITATION Sta \l 1033 ]


La fel putem observa timpul de execuție în ms pentru fiecare metodă în parte, cât și codurile
care fac parte din HTTP.
În cazul dat, codul 200 ne informează că această cerere a avut loc cu succes. Iar răspunsul
304, care nu conține un message-body, ne dă de știre că are loc un GET condițional, iar accesul este
permis.
Anume aceste coduri ne permit să analizăm parcursul fiecărui eveniment, astfel avem putem
avea:
- 1xx Informație – serverul acceptă cererea clientului;
- 2xx Succes – cererea are loc cu succes;
- 3xx Redirecționare – saltul paginii;
- 4xx Eroare client – pagina nu a fost găsite sau nu are acces;
- 5xx Eroare server – eroare de server, încercați mai târziu.

Un mesaj cerere de tip HTTP conține: corpul acestuia, un câmp special, unul vid și un header,
construcția arată în felul următor. (Vezi fig.5)

Fig.5 – Structura unui mesaj cerere.[ CITATION MSD \l 1033 ]


Astfel, header-ul va conține informații legate de dată și timp, tipul server-ului, lungimea
contentului, starea conexiunii, ultimele modificări etc. Dacă e să vorbim despre body, atunci acest
sector este opțional și în interiorul lui se conțin diferite date, de obicei un HTML content.
Soluții
Mai jos avem două metode, una pentru preluare a contentului dintr-un link găsit, iar alta
pentru rularea și procesarea cererilor. Vom implementa doar instrumentul GET:

public void Run(TextBox textBox)


{
var respons = WebHelper.GetWebContent(Constants.GoogleUrl + word);
var links = new HashSet<Match>();

foreach (var match in Regex.Matches(respons, Constants.UrlRegex,


RegexOptions.Singleline).Cast<Match>().Where(match => !match.Value.Contains(Constants.GoogleWord)))
{
links.Add(match);
}

foreach (var newNodeInfo in links.Select(match => new NodeInfo


{
ParentGuid = Guid.NewGuid().ToString(),
Url = match.Value,
Level = 1
}))
{
MainForm.MainTreeView.Nodes.Add(newNodeInfo.ParentGuid, newNodeInfo.Url);
ThreadPool.QueueUserWorkItem(Execute, newNodeInfo);
}
}

public static string GetWebContent(string url)


{
var output = @"None";

try
{
var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = Constants.MethodGet;

using (var response = (HttpWebResponse)request.GetResponse())


{
var dataStream = response.GetResponseStream();
if (dataStream == null) return output;
var reader = new StreamReader(dataStream, Encoding.UTF8);
output = reader.ReadToEnd();

reader.Close();
dataStream.Close();
}
}
catch (Exception exception)
{
return exception + "\r\n\r\n" + url;
}

return output;
}
class Constants
{
public static readonly string GoogleUrl = @"http://www.google.com/search?q=";
public static readonly string UrlRegex = @"(http|https):\/\/([\w\-_]+(?:(?:\.[\w\-_]+)+))
([\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?"; // utilizăm expresiile regulate
public static readonly string GoogleWord = @"google"; // cuvântul va fi căutat aici
public static readonly string MethodGet = @"GET"; // preluarea datelor
}

La execuție observăm posibilitatea de a introduce un cuvânt oarecare, alegerea adâncimii și


numărul de fire. După procesare putem selecta un link și vizualiza content-ul acestuia. (fig.6)

Fig.6 – Execuția programului, parcurgere în adâncime. Afișare sursă HTML.


Concluzie

Efectuând acest mic studiu, putem spune că anume protocolul HTTP a revoluționat întreaga
lume a rețelelor și conexiunilor globale. Structura acestuia e relativ simplă, dar genială anume prim
faptul că e stateless, tehnologia de transport poate fi diferită, însă va lucra la fel, deoarece nu există
reguli care se suprapun, la fel fiecare tranzacție poate fi executată aparte, neluându-se în considerație
cele anterioare. Nu e un standard și în afara limitelor tranzacției nu există stare. Clientul are
posibilitatea să închidă conexiunea curentă și a o porni din nou în cererea următoare, deoarece serverul
nu are ca scop să mențină starea actuală (până când aplicația nu-și adaugă starea în topul protocolului).
Un avantaj foarte mare luând în considerație balansarea de încărcare a serverelor, oferind o viteză atât
de performantă.
Bibliografie

1. Bindi, Chen. HTTP Basic. www.bindichen.co.uk. [Online] March 25, 2016.


https://www.ieft.org/rfc/rfc2616.txt.
2. Lee, Edward A. Coding Quotes. http://algorithm.com.au/. [Online] March Saturday, 2016.
http://algorithm.com.au/code/quotes/.
3. Inc, Stack Exange. When should you use multithreading. www.stackoverflow.com. [Online]
March 13, 2016. http://stackoverflow.com/questions/7419619/when-should-you-use-
multithreading-and-would-multi-threading-be-beneficial-if-t.
4. MSDN. Coordination Data Structures. www.blogs.msdn.com. [Online] March 12, 2016.
http://blogs.msdn.com/b/pfxteam/archive/2008/06/18/8620615.aspx.
5. Dumitru, Ciorbă. Note de laborator. Moodle. [Online] March 9, 2016.
http://moodle.ati.utm.md/mod/book/view.php?id=1855.
6. Albahari, Joseph. Threading in C#. wwww.albahari.com. [Online] March 11, 2016.
http://www.albahari.com/threading/.
7. Dumitru, Ciorbă. Bursting bubble-threading. www.ciorba.name. [Online] March 12, 2016.
http://ciorba.name/?p=1308.
8. Oracle. Essential Classes. www.docs.oracle.com. [Online] March 9, 2016.
http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html.
9. Foundation, .NET. Tidy.net Portable. www.nuget.org. [Online] March 21, 2016.
https://www.nuget.org/packages/TidyNetPortable.