Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




Programarea in retea – Socket-uri

Retele


Programarea in retea – Socket-uri

1. Scopul lucrarii

Scopul acestei lucrari este insusirea tehnicilor de programare in retea utilizand socket-uri.



2. Consideratii teoretice

Calculatoarele conectate in retea comunica intre ele utilizand protocoalele TCP (Transport Control Protocol) si UDP (User Datagram Protocol) conform diagramei:

Figura 1. Nivelele de omunicare in retea

Pentru realizarea unor programe care comunica in retea in java, se utilizeaza clasele din pachetul java.net . Acest pachet ofera clasele necesare pentru realizarea unor programe de retea independente de sistemul de operare.

In tabelul urmator sunt prezentate principalele clase care sunt utilizate pentru construirea unor programe 515f58f de retea.

Class

Scop

URL

Reprezinta un URL

URLConnection

Returneaza continutul adresat de obiectele URL

Socket

Creaza un socket TCP

ServerSocket

Creaza un socket server TCP

DatagramSocket

Creaza un socket UDP

DatagramPacket

Reprezinta o datagrama trimisa printr-un obiect DatagramSocket

InetAddress

Reprezinta numele unui pc din retea, respectiv IP-ul corespunzator

Java ofera doua abordari diferite pentru realizarea de programe de retea. Cele doua abordari sunt asociate cu clasele:

Socket, DatagramSocket si ServerSocket

URL, URLEncoder si URLConnection

Programarea prin socket-uri reprezinta o abordare de nivel jos, prin care, doua calculatoare pot fi conectate pentru a realiza schimb de date. Ca principiu de baza, programarea prin socketuri face posibila comunicarea in mod full-duplex intre client si server. Comunicarea se face prin fluxuri de octeti.

Pentru ca comunicarea sa se desfasoare corespunzator, programatorul va trebui sa implementeze un protocol de comunicatie (reguli de dialog), pe care clientul si serverul il vor urma.

Definitia socket-ului: Un socket reprezinta un punct de conexiune intro retea TCPIP. Cand doua programe aflate pe doua calculatoare in retea doresc sa comunice, fiecare dintre ele utilizeaza un socket. Unul dintre programe (serverul) va deschide un socket si va astepta conexiuni, iar celalalt program (clientul), se va conecta la server si astfel schimbul de informatii poate incepe. Pentru a stabili o conexiune, clientul va trebui sa cunoasca adresa destinatiei ( a pc-ului pe care este deschis socket-ul) si portul pe care socketul este deschis.

Principalele operatii care sunt facute de socket-uri sunt:

- conectare la un alt socket

- trimitere date

- receptionare date

- inchidere conexiune

- acceptare conexiuni

3. Desfasurarea lucrarii

3.1. Program client-server

Pentru realizarea unui program client-server se utilizeaza clasele ServerSocket si Socket.

Programul server va trebui sa deschida un port si sa astepte conexiuni. In acest scop este utilizata clasa ServerSocket. In momentul in care se creaza un obiect ServerSocket se specifica portul pe care se va initia asteptarea. Inceperea ascultarii portuli se face apeland metoda accept(). In momentul in care un client s-a conectat, metoda accept() va returna un obiect Socket.

La randul sau clientul pentru a se conecta la un server, va trebui sa creeze un obiect de tip Socket, care va primi ca parametri adresa serverului si portul pe care acesta asteapta conexiuni.

Atat la nivelul serverului cat si la nivelul clientului, odata create obiectele de tip Socket, se vor obtine fluxurile de citire si de scriere. In acest scop se utilizeaza metodele getInputStream() si getOuptuStream().

In listingul urmator este prezentat programul server.

import java.net.*;

import java.io.*;

public class ServerSimplu

}catch(Exception e)

finally

Programul client este prezentat in listingul urmator:

import java.net.*;

import java.io.*;

public class ClientSimplu

out.println('END'); //trimite mesaj care determina serverul sa inchida conexiunea

}

catch (Exception ex)

finally

Pentru verificare se va starta serverul, dupa care se va starta clientul.   

3.2 Server multifir

Analizand programul server prezentat in sectiunea anterioaram se observa ca acesta poate servi doar un singur client la un moment dat. Pentru ca serverul sa poata servi mai multi clienti simultan, se va utiliza programarea multifir.

Ideea de baza este simpla, si anume, serverul va astepta conexiuni prin apelarea metodei accept(). In momentul in care un client s-a conectat si metoda accept() a returnat un Socket, se va crea un fir de executie care va servi respectivul clientul, iar severul va reveni in asteptare.

In listingul urmator este prezentat un server multifir – capabil de a servi mai multi clienti simultan.

import java.io.*;
import java.net.*;

public class ServerMultifir


}catch(IOException ex)

finally
catch(IOException ex2)
}
}

public static void main(String args[])





class TratareClient extends Thread


public void run()
//.while
System.out.println('closing');
}
catch(IOException e)
finally catch(IOException e)
}
}//.run


3.3. Server HTTP

In aceasta sectiune este creat un server HTTP care poate raspunde la cereri GET. Functia main() din cadrul clasei HttpServer startaeaza un fir de executie. In cadrul acestui fir se instantiaza un obiect ServerSocket si se incepe ascultarea portului 80, care este portul standard pentru protocolul HTTP.

In momentul in care apare o cerere (un client se conecteaza pe portul 80) metoda accept() va returna un obiect Socket. In continuare se creaza un obiect PrecesRequest (care este de tip fir de excutie), care va primi ca parametru, obiectul Socket returnat de metoda accept(). Dupa crearea obiectului ProcesRequest, serverul revine in asteptare si va putea servi alti clienti.

Clasa ProcesRequest implementeaza o versiune simplificata a protocolului HTTP. In cadrul constructorului clasei ProcesRequest se creaza fluxurile de intrare iesire, dupa care este startat firul de executie. In cadrul firului de executie este analizata cererea primita de la client , si in cazul in care aceasta este o cerere valida de tip GET, atunci se va transmite catre client resursa solicitata.

import java.io.*;

import java.net.*;

class HttpServer extends Thread

public void run()catch(IOException e)

//..reia bucla de asteptare dupa ce am creat un fir pentru client

}

System.out.println('STOP SERVER');

}

public static void main(String[] args)throws Exception

catch(Exception e)

}

import java.net.*;

import java.io.*;

import java.util.*;

class ProcesRequest extends Thread

catch(IOException e)

}

public void run()

catch(IOException e)

catch(Exception e2)

finallycatch(Exception e)

}

}

private String interpretGET(String rqst) throws Exception

fileN = fileN+ tmp;

System.err.println('CERERE:'+fileN);

return fileN;

}

private byte[] readFile(String fileN) throws Exception

Pentru verificarea programului anterior se va modifica variabila iniContextm din cadrul clasei HTTPServer, astfel incat aceasta sa indice calea corecta catre contextul initial (directorul unde se afla toate resursele pe care clientul le poate accesa).

3.5 Trimiterea obiectelor prin socket-uri

Mecanismul de serializare pune la dispozitia programatorului o metoda prin care un obiect poate fi salvat pe disc si restaurat atunci cand este nevoie. Tot prin acelasi mecanism un obiect poate fi transmis la distanta catre o alta masina utilizand socketurile.

Pentru a putea serializa un obiect acesta va trebui sa implementeze interfata Serializable.

Pentru scrierea si citirea obiectelor serializate se utilizeaza fluxurile de intrare / iesire : ObjectInputStream si ObjectOutputStream.

Listingul urmator prezinta modul in care se poate serializa / deserializa un obiect.

import java.io.*;

import java.net.*;

public class SerialTest extends Threadcatch(Exception e)

}

public static void main(String[] args) throws Exception

class Pers implements Serializable

public String toString()

Exista situatii in care in momentul in care se selveaza starea unui obiect prin serializare, nu se doreste salvare tuturor starilor obiectului, respectiv nu se doreste salvarea sau transmiterea anumitor parametri ai obiectului. Pentru a bloca serializarea unui atribut al unui obiect serializabil se utilizeaza cuvantul cheie transient.

a. Plecand de la listingul anterior relizati un program client si un program server care transmit intre ele obiecte de tip Pers.

b. Adaugati in cadrul clasei Pers in fata liniei „ String nume;    cuvantul cheie transient si observati efectul acestei modificari.

3.6. Server de timp (UDP)

In cadrul acestei sectiuni este construit un server de timp care va trimite la cerere data curenta catre clientii care solicita acest lucru. De asemenea este construit si clientul care acceseaza serviciile serverului de timp.

La nivelul serverului se creeaza un obiect DatagramSocket, care va primi ca parametru portul pe care serverul va incepe ascultarea.

DatagramSocket socket = new DatagramSocket(1977);

In continuare se construieste un obiect DatagramPacket, care va fi utilizat de catre server pentru a receptiona cererea de la client. O data construit obiectul DatagramPacket, serverul va incepe ascultarea portului 1977, prin invocarea metodei receive().

byte[] buf = new byte[256];

DatagramPacket packet = new DatagramPacket(buf,buf.length);

socket.receive(packet);

In momentul in care un client doreste sa apeleze la serviciile serverului, acesta va trimite un pachet catre server. Serverul citeste din cadrul pachetului portul si adresa clientului, si ii va trimite acestuia un pachet ce contine data curenta.

InetAddress address = packet.getAddress();

int port = packet.getPort();

buf = ((new Date()).toString()).getBytes();

packet = new DatagramPacket(buf,buf.length,address,port);

socket.send(packet);

Un client, pentru a se conecta la server, trebuie sa creeze un obiect DatagramSocket, si sa trimita un pachet catre server. Spre deosebire de server, clientul nu este obligat sa specifice nici un port in momentul creierii obiectului DatagramSocket, intrucat se atribuie automat un port liber respectivului obiect.

import java.io.*;

import java.net.*;

import java.util.*;

public class TimeServer extends Thread

public void run()

}catch(Exception ex)

public static void main(String[] args)

import java.io.*;

import java.net.*;

import java.util.*;

public class Client catch(Exception ex)

4. Intrebari si probleme

a. In ce scop sunt utilizate clasele ServerSocket si Socket?

b. Ce clasa este utilizata in java pentru a identifica un calculator din retea ?

c. Utilizand programarea prin socketuri construiti un program simplu de tip chat.




Document Info


Accesari: 2436
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )