Sunteți pe pagina 1din 10

Universitatea Tehnic

Facultatea Calculatoare, Informatic si Microelectronic


Catedra Automatic i Tehnologii Informaionale

Raport
Lucrare de laborator
la disciplina
Reele de Calculatoare

Tema: Socket-uri. Crearea aplicaiei client - server

Elaborat de:

Controlat de: Ciorb


Dumitru
Lector superior

Chiinu 2011
0
Scopul lucrrii:

Studierea socket-urilor, precum i de a realiza aplicaia client-server.

1. Introducere

Modelul standard pentru aplicatii in retea este client-server. Serverul este un proces care asteapta
ca clientii sa il contacteze. In principiu, modul de functionare pentru un astfel de sistem, este: procesul
server este pornit iar acesta intra intr-o stare de asteptare pana la conectarea unui posibil client.
Procesul client este pornit se va conecta la server si va face cereri pentru anumite servicii (servicii pe
care le ofera serverul). Clientul poate fi pornit pe acelasi sistem ca si serverul sau pe un altul. Urmeaza
o conversatie intre client si server care se termina in momentul in care clientul a obtinut rezultatul
dorit de la server. In acel moment serverul revine la starea de asteptare dupa potentiali clienti(Figura1).

Initial

Conexiunea este inchisa


Gata de lucru si
se asteapta noi
conexiuni

A sosit mesajul
de la un client

Mesaj preluat si Raspunsul transmis


prelucrat

Figura 1 Starile serverului

Serverul poate fi de doua tipuri:

1. iterativ acel server care poate servii clientii intr-un timp dat (de obicei foarte scurt), clientul
fiind servit chiar de procesul server.
2. concurent tipul pentru a procesa o cerere de la client este necunoscut, in consecinta, clientii
vor trebui sa fie serviti intr-o maniera concurenta. Aceasta inseamna ca respectivul process
server va clona un nou proces, identic cu procesul original. Noul proces va prelua respectivul
client, procesul server original revenind in starea de asteptare dupa alti clienti.

Principalele motive pentru folosirea att de larg a asa numite arhitecturi client-server:

- stocarea informaiei ntr-un singur loc, de unde poate fi redistribuit cu uurin ctre clieni;
- dedicarea resurselor de calcul (a serverelor) unor sarcini specifice cum ar fi spre exemplu pota
electronic unde este implicat mutarea informaiilor n siguran dintr-un punct n altul.

Ceea ce trebuie reinut n primul rnd n ceea ce privete marea majoritate a serviciilor de Internet
este c exist:

- un program (aplicaie software) client pe de o parte;


1
- un program server de cealalt parte;
- conexiuni ntre client i server;
- conexiuni ntre mai multe servere;
- conexiuni directe ntre clieni.

Procesul de transfer a fiierelor de pe server pe client poart numele de download, iar cel invers
este numit upload.

Componentele de baz ale une arhitecturi client-server sunt:

- o combinatie de front-end pe parte de client, care interactioneaza cu utilizatorul,


si un server in fundal care interactioneaza cu resursa partajata;
- sarcinile front-end si back-end au in general necesitati diferite pentru a calcula viteza
procesorului, memoria, viteza discului capacitatile acestuia, si dispozitivele de intrare/iesire;
- mediul este in general eterogen multivendor; platforma hardware si
sistemele de operare ale clientului serverului in general nu sun aceleasi; clientul si serverul
comunica printr-o interfata standard de comunicare (API) si apeluri de proceduri la distanta
(RPC).

Terminologie:

Client - un program care stabileste conexiuni cu scopul de a trimite cereri.

Agent-utilizator - clientul ce initiaza o cerere (navigator, editor, robot de traversare Web).

Server - o aplicatie care accepta conexiuni, raspunznd la anumite cereri transmise de clienti.
Un program poate juca rol att de server, ct si de client. Cele mai cunoscute servere
(Apache, Netscape Enterprise Server, Sun Web Server, Windows NT Web Server)

Proxy (intermediar) - un program intermediar care ruleaza ca server, ct si drept client pentru a
transmite cereri altor servere. Cererile trimise unui proxy pot fi rezolvate
intern sau transmise mai departe, catre alte servere (posibil translatate).

Poarta - un server care lucreaza ca intermediar pentru alte servere, n mod transparent,fiind si
un translator de protocoale.

Tunel - un program intermediar functionnd ca mijlocitor ntre doua conexiuni.

Cache - un depozit local de memorare a mesajelor (datelor) de raspuns si un subsistem de


control al acestuia. Memoria cache reduce timpul de raspuns si congestia retelei.
Orice client si server poate include un cache.

2. Socket-uri

Cele mai folosite metode de comunicare client-server, din punct de vedere al programatorilor
(API Aplication Program Interface) sunt: socket-uri Berkeley si TLI (System V Transport Layer
Protocol). In continuare se va discuta exclusiv despre socket-uri.
Socket-urile au aparut pentru prima data in jurua anului 1982. Socket-urile sunt create explicit,
utilizate si puse in functiune de catre aplicatii.
2
Exista doua tipuri de servicii de transport pentru socket:
1. legaturi orientate pe conexiune

Se mai numesc si sigure, in cazul lor se garanteaza livrarea datelor. In Figura 2 este prezentata
schema logica a unei astfel de conexiuni. Clientul trebuie sa se conecteze in mod explicit la server
nainte de a transmite sau primi date. Clientul nu va accepta connect() pana cind serverul nu
accepta clientul. Serverul trebuie sa astepte in mod explicit clientul inainte de a trimite/primii date.
Serverul va astepta cu accept() pana la connect() din partea clientului.

Figura 2 - Apelurile sistem pentru legaturi orientate pe conexiune

2. legaturi fara conexiune (nesigure) nu se garanteaza livrarea

Se mai numesc si nesigure, in cazul lor nu se garanteaza livrarea datelor. In Figura 3 este prezentata
schema logica a unei astfel de conexiuni. Nu exista o identificare explicita a serverului sau a clientului.
Daca se initializeaza contactul cu cealalta parte trebuie cunoscute adresa de IP si numarul portului sau
procesul care asteapta sa fie contactat. Se lucreaza cu datagrame.

Figura 3 - Apelurile sistem pentru legaturi fara conexiune


3
Principalele apeluri sunt:
- socket creeaz un nou descriptor de socket. Argumentele din apel specific familia de
protocoale folosite de aplicaie i tipul serviciului (stream sau datagrama).
- bind leag o adresa IP locala i portul protocolului la socket. Argumentele specific
descriptorul de socket i adresa punctului de comunicaie. Procesele server folosesc bind pentru
a informa procesele client asupra portului unde se accept conexiuni.
- listen anun disponibilitatea serverului de a accepta conectri. Ea fixeaz dimensiunea cozii de
ateptare, necesar n cazul n care mai muli clieni doresc s acceseze serverul n acelai timp.
- connect ncearc s stabileasc o conexiune a clientului la un server. Ea blocheaz procesul
client pn cnd conexiunea este stabilit.
- accept pentru server creeaz un nou socket pentru noua cerere de conectare. Noul socket este
folosit numai pentru noua conexiune, cel original servind n continuarea pentru acceptarea unor
viitoare cereri de conectare. Dup ce datele au fost transferate folosind noul socket acesta este
nchis.
- write transmite date prin conexiunea realizat. Datele sunt, de regul, copiate n buffer-ele din
nucleul SO, aplicaia i continu execuia n timp ce datele sunt transportate prin reea. Apelul
este folosit de server pentru a transmite rspunsuri, iar de clieni pentru a transmite cereri.
- read citete datele ajunse la socket i le depune ntr-un tampon utilizator. Dac nu sunt
disponibile date apelul se blocheaz.
- close elibereaz un socket. Daca mai multe procese partajeaz un socket la fiecare close se
decrementeaz un contor, iar cnd acesta ajunge la zero socket-ul este eliberat.

3. Dezvolatrea aplicatiei client - server

Elaborarea aplicaiei client server este realizat n mediul Visual Studio. Pentru realizarea
comunicaiilor au fost necesare clasele Socket, IPAddress i IPEndPoint, care se afl n spaiile de
nume System.Net i System.Net.Sockets. Programul de test const din dou programe de tip C# ->
Console Application .

Client
Instaniem un obiect de tip IPEndPoint, care ne va identifica serviciul oferit de aplicaia server. La
crearea obiectului este utilizat adresa IP a computerului la care este executat serverul i portul
ascultat de acesta, prestabilit de protocol:

IPEndPoint remoteService = new IPEndPoint (IPAddress.Parse(127.0.0.1),1100);

Metoda static IPAddress.Parse ne permite s crem automat un obiect IPAddress avnd ca


parametru un ir, ce trebuie s conin o notaie human friendly de adres IP. Socketul va fi creat
indicndu-i familia de protocoale utilizat, tipul comunicaiei (n cazul nostru avem una orientat pe
conexiune, Stream) i protocolul ce va asigura aceasta din urm (utilizm TCP din cadrul familiei
interNetwork):

Socket s = new Socket (remoteService.AddressFamily,SocketType.Stream, ProtocolType.Tcp);

Este recomandabil includerea instruciunilor de stabilire a conexiunilor i transmitere/primire a


datelor ntr-un bloc try-catch. Metodele sincrone Send i Receive ne asigur transmiterea i primirea
4
datelor n octei, de aceea i avem necesitatea n byte[] Encoding.ASCII.GetBytes(string s) i string
Encoding.ASCII.GetString(bytes[], index, count) care ne ofer posibilitatea de a realiza conversiile
necesare. Receive returneaz numrul de octei citii din socket, iar acest numr poate fi utilizat de
ciclul do while.

Listingul programului:

using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;

namespace Grigori // Client


{
class Program
{
static void Main(string[] args)
{

IPEndPoint remoteService = new


IPEndPoint(IPAddress.Parse("127.0.0.1"), 1100);
Socket s = new Socket(remoteService.AddressFamily, SocketType.Stream,
ProtocolType.Tcp);
try
{
s.Connect(remoteService);
String mts;
string n;
int number;
Console.WriteLine("Dati numarul de elemente = ");
n = Console.ReadLine();

Byte []buffer = Encoding.ASCII.GetBytes(n);


s.Send(buffer);
Int32.TryParse(n, out number);
int c = 0;
for (int i = 0; i < number; i++)
{
c = i + 1;
Console.WriteLine("Dati numarul " + c + )
mts = Console.ReadLine();
buffer = Encoding.ASCII.GetBytes(mts);
s.Send(buffer);
}

Byte[] rbuffer = new byte[256]; string rm ;


s.Receive(rbuffer);
mts = Encoding.ASCII.GetString(rbuffer);
rm = "Nr minim este :";
Console.WriteLine(rm);
Console.WriteLine(mts);

s.Receive(rbuffer);
mts = Encoding.ASCII.GetString(rbuffer);
rm = "Nr maxim este :";
Console.WriteLine(rm);
Console.WriteLine(mts);

s.Receive(rbuffer);
mts = Encoding.ASCII.GetString(rbuffer);
rm = "Suma este :";
5
Console.WriteLine(rm);
Console.WriteLine(mts);

s.Receive(rbuffer);
mts = Encoding.ASCII.GetString(rbuffer);
rm = "Scaderea este :";
Console.WriteLine(rm);
Console.WriteLine(mts);

s.Receive(rbuffer);
mts = Encoding.ASCII.GetString(rbuffer);
rm = "Produsul este :";
Console.WriteLine(rm);
Console.WriteLine(mts);

s.Receive(rbuffer);
mts = Encoding.ASCII.GetString(rbuffer);
rm = "Media aritmetica este :";
Console.WriteLine(rm);
Console.WriteLine(mts);

s.Shutdown(SocketShutdown.Both);
s.Close();
}

catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}

Server
Pentru server este necesar de stabilit un punct terminal de conexiune, dar care va indica spre orice
adres, iar portul obligator trebuie s fie ca i cel specificat la client:

IPEndPoint ipe = new IPEndPoint(IPAddress.Any, 1100);

Aplicaia server spre deosebire de client pe lng faptul c trebuie s transmit/primeasc date, mai
este responsabil de acceptarea i gestiunea conexiunilor clienilor. Aceasta este realizat cu ajutorul
unui socket de tip server (numit i Listener).
Pentru a specifica c orice adres este eligibil, socketul iniial se asociaz cu punctul terminal
nedefinit de conexiune: server.Bind(ipe);
apoi se lanseaz cu parametrul ce va indica numrul de conexiuni ce pot fi n coada de ateptare (n caz
dac parvin simultan mai multe cereri de conexiuni):
server.Listen(15);
Acest listene socket acceptnd conexiunea va permite transmiterea/primirea datelor, dar de
acum prin alt socket primit de la metoda Accept: Socket clientSocket = server.Accept();
Pentru fiecare client serverul va crea un socket aparte.

6
Listingul programului:

using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;

namespace ConsoleApplication1
{
class Program // Server
{
static void Main(string[] args)
{
bool flag = true;

IPEndPoint ipe = new IPEndPoint(IPAddress.Any, 1100);


Socket server = new Socket(ipe.AddressFamily, SocketType.Stream,
ProtocolType.Tcp);
server.Bind(ipe);
server.Listen(15);
byte[] buffer = new byte[1024];
int[] a = new int[100];

while (flag)
{
Socket clientSocket = server.Accept();
int number, n, s = 0, pr = 1, sc = 0;
float med = 1;
string value;
clientSocket.Receive(buffer);
string nn = Encoding.ASCII.GetString(buffer);
Int32.TryParse(nn, out n);

for (int i = 0; i < n; i++)


{
buffer = new byte[20];
clientSocket.Receive(buffer);
Console.WriteLine(Encoding.ASCII.GetString(buffer));
value = Encoding.ASCII.GetString(buffer);
Int32.TryParse(value, out number);
a[i] = number;
} int min = 0, loc_min = 0, max = 0, loc_max = 0;
for (int i = 0; i < n; i++) { if (a[i] < min) { min = a[i]; loc_min = i; } }
for (int i = 0; i < n; i++) { if (a[i] > max) { max = a[i]; loc_max = i; } }
s = a[loc_min] + a[loc_max];
sc = a[loc_min] - a[loc_max];
pr = a[loc_min] * a[loc_max];
med = (a[loc_min] + a[loc_max])/2;

byte[] buffer1 = new byte[Encoding.ASCII.GetByteCount(a[loc_min].ToString())];


buffer1 = Encoding.ASCII.GetBytes(a[loc_min].ToString());
string mts = "Nr minim este: ";
Console.WriteLine(mts);
Console.WriteLine(a[loc_min].ToString());
clientSocket.Send(buffer1);

buffer1 = new byte[Encoding.ASCII.GetByteCount(a[loc_max].ToString())];


buffer1 = Encoding.ASCII.GetBytes(a[loc_max].ToString());
mts = "Nr maxim este: ";
Console.WriteLine(mts);
Console.WriteLine(a[loc_max].ToString());
clientSocket.Send(buffer1);
7
buffer1 = new byte[Encoding.ASCII.GetByteCount(s.ToString())];
buffer1 = Encoding.ASCII.GetBytes(s.ToString());
mts = "Suma este: ";
Console.WriteLine(mts);
Console.WriteLine(s.ToString());
clientSocket.Send(buffer1);

buffer1 = new byte[Encoding.ASCII.GetByteCount(sc.ToString())];


buffer1 = Encoding.ASCII.GetBytes(sc.ToString());
mts = "Scaderea este: ";
Console.WriteLine(mts);
Console.WriteLine(sc.ToString());
clientSocket.Send(buffer1);

buffer1 = new byte[Encoding.ASCII.GetByteCount(pr.ToString())];


buffer1 = Encoding.ASCII.GetBytes(pr.ToString());
mts = "Produsul este: ";
Console.WriteLine(mts);
Console.WriteLine(pr.ToString());
clientSocket.Send(buffer1);

buffer1 = new byte[Encoding.ASCII.GetByteCount(med.ToString())];


buffer1 = Encoding.ASCII.GetBytes(med.ToString());
mts = "Media aritmetica este: ";
Console.WriteLine(mts);
Console.WriteLine(med.ToString());
clientSocket.Send(buffer1);

clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
}
}
}
}

Figura 4 Fereastra Client

8
Figura 5 Fereastra Server

Concluzie
Datorit acestei lucrri de laborator am nteles modalitatea comunicrii clientului cu serverul. Am
mai studiat i implimentat socket-urile, ce s-au dovedit a fi nite metode foarte eficiente de comunicare
ntre client i server, care sunt create, utilizate i puse n funciune de ctre aplicaii. La capitolul
experimental am realizat o aplicaie client-server care gasete dintr-un ir de cifre(tabel
unidimensional) valoarea minima i maxima, i executa operatiile aritmetice de baza intre ele(adunare,
scadere, inmultire, media aritmetica). Serverul recepioneaz datele, le analizeaz conform
algoritmului, i executa afiarea.

Referinte bibliografice

1. A client-server architecture for providing client-specific, interactive network services on


the application layer, Roland Haratsch, Technical University of Munich, 2002
2. Client/Server Architectures for Business Information Systems, Klaus Renzel, Wolfgang Keller,
1997
3. Client-Server Architecture, Lawrence Chung, Computer Science Program, The University of
Texas, Dallas, 2004

S-ar putea să vă placă și