Documente Academic
Documente Profesional
Documente Cultură
LUCRAREA NR. 8
PROGRAMARE N REEA FOLOSIND SOCKETURI JAVA
1. Scopul lucrrii
Lucrarea i propune studiul comunicaiei de tip client-server bazat pe mecanismele de tip socket,
folosind facilitile oferite de limbajul Java. Acest limbaj a fost ales datorit faptului c este un
limbaj obiectual i ofer mecanisme evaluate de comunicaie n reea, suport robust pentru
concuren i pentru tratarea erorilor. Se dorete familiarizarea cu mecanismele specifice i clasele
(constructorii i metodele acestora) utilizate
pentru comunicarea n reea existente n limbajul Java (diverse categorii de socketuri, URL-uri) i
proiectarea unor aplicaii simple client server.
2. Consideraii teoretice
2.1 Introducere
Conceptele teoretice necesare programrii n reea folosind socketurile Unix se regsesc i n cazul
programrii n reea folosind limbajul Java. Pentru proiectarea aplicaiilor de reea se folosete
pachetul Java.net, care ofer suport independent de sistem pentru implementarea modelului de
comunicaie tip client - server. Acest pachet conine clase, interfee i excepii ce implementeaz n
form obiectual conceptele uzuale de comunicare.
Astfel, un client Java, pentru a obine un anumit serviciu de la un server remote, folosete adresa
serverului pentru a solicita conexiunea, iar serverul ascult reeaua i ateapt cereri din partea
clienilor. Deoarece un calculator posed o singur conexiune fizic la reea, conexiune utilizat de
toate aplicaiile ce solicit lucrul n reea, pentru identificarea aplicaiei creia i este destinat un
pachet sunt folosite porturile. Stabilirea conexiunii presupune utilizarea ca i identificatori de
hosturi comunicante a adresei IP i a adresei portului.
Pachetele Java.net i Java.io conin clasele i metodele necesare programrii n reea. Clasele i
metodele lor, necesare implementrii programrii cu socketuri n Java vor fi descrise n cele ce
urmeaz. O list deloc exhaustiv a acestora conine urmtoarele clase: DatagramPacket,
DatagramSocket, MulticastSocket, InetAddress, ServerSocket, Socket, URL, URLConnection,
URLEncoder, etc.
Instrumentele mediului Java utilizate n programarea i depanarea programelor sunt:
java - interpretorul Java;
javac - compilatorul Java;
appletviewer - vizualizorul de appleturi Java;
101
102
cu procedurile
static void printLocalAddress () {
try {
InetAddress myself = InetAddress.getLocalHost();
System.out.println(nume:+ myself.getHostName());
System.out.println (IP:+ myself.getHostAddress ());
System.out.println(clasa:+ipClass(myself.getAddress());
}
catch (UnknownHostException ex)
{
System.out.println (nu ma gasesc);
ex.printStackTrace();
}}
//static char ipClass (byte [] ip){
int highByte=0xff&ip{0};
return int highByte<128)?A:(highByte<192)?B:
(highbyte<224)?C:((highbyte <240)?D:E;
}
static void printRemote Address (String name) {
try {
System.out.println (cauta+name+);
InetAddress machine = InetAddress.getByName (name);
System.out.println (nume:+ machine.HostName());
System.out.println(IP:+machine.getHostAddress());
System.out.println(clasa:+ipClassmachine.getAddress());
}
catch(UnknownHostException ex {
system.out.println {nu gaseste hostul + name);
}
Clasa URL ofer faciliti necesare manipulrii locatorilor universali de resurse URL. Forma
complet a unui asemenea locator este:
Protocol://nume_calculator:port/nume_cale#ref
103
conecteaz la hostul remote. Acesta este constructorul care permite alegerea manual
a interfeei care va fi conectat.
104
Excepiile sunt cele cauzate de imposibilitatea legrii la hostul local sau remote, refuzarea unei
conexiuni datorit inexistenei serverului care s asculte pe un anumit port sau imposibilitatea
atingerii hostului remote.
Exemplul 2
Descrcarea paginilor web folosind socketuri
Programul conine o bucl de ateptare a unui URL pentru care se creeaz un obiect care ateapt
conectarea la serverul web pentru a descrca i afia pagina cerut. Trebuie remarcat faptul c
acelai rezultat se obine utiliznd o implementare folosind clasa URL.
import java.net. * ;
import java.io. * ;
public class GrabPage {
//public Grabpage (String textURL)throws IOException..
//public void grab () throws IOException
//public static void main (String[] args ) throws IOException
public GrabPage (String textURL) throws IOException {
dissect (textURL);
}
//protected void dissect (String textURL) throws MalformedURLException..
.
protected String host, file ;
protected int port ;
protected void dissect (String textURL)throws MalformedURLException {
URL url = new URL (textURL) ;
host = url.getHost () ;
port = url.getPort () ;
if (port == -1)
port = 80;
file = url.getFile() ;
}
public void grab () throw IOException {
connect () ;
try {
fetch ();
105
si deasemenea clientul care asteapta preluarea unui URL, la EOF se va iesi din bucla folosind break.
public static void main(String{}args throws IOException{
Reader kbd = new FileReader (FileDescriptor.in);
BufferedReader bufferedKbd = new BufferedReader (kbd) ;
while true( {
String textURL ;
System.out.print (introdu URL: );
System.out.flush () ;
if textURL = bufferedKbd.readline ()) == null)
Break ;
try {
GrabPage grabPage = new GrabPage (textURL);
GrabPage.grab ();
}catch {IOException ex) {
ex.printStackTrace () ;
continue;
}
System.out.println ( OK);
106
nchiderea conexiunii.
Dup nchiderea unui socket, numrul de port i adresa local sunt nc accesibile folosind metodele
GetInetAddress(), getLocalPort(), getPort().
108
System.out.println (asteapta);
Socket client = server.accept();
System.out.println (acceptata de la +client.getInetAddress());
server.close();
return client;
109
110
}
static int readNB (InputStream in) throws IOException{
if (in.available()>0)
return in.read();
else
return 2;
}
Secvena urmtoare reprezint utilizarea datagramelor Java pentru a recepiona un pachet de date.
Se creeaz un socket de tip datagram DatagramSocket, la un port specificat.
Exemplul 5
Socket = new DatagramSocket (.);
socket.receive(packet);
..
socket.close()
.
InetAddress address = packet.getAddress();
Int fromPort = packet.getPort() ;
Int legth = packet.getLength() ;
112
La construirea unui pachet datagram trebuie s se specifice adresa IP i portul destinaie pentru ca
acesta s poat fi transmis. Exemplul urmtor ilustreaz acest aspect astfel:
DatagramSocket packet = new DatagramSocket ();
DatagramPacket packet = newDatagramPacket
(data,data.length,InetAddress.getbyName (www.utcluj.ro,1728) ;
Socket.send(packet) ;
Socket.close();
(data,
data.length,
3. Desfurarea lucrrii
3.1. Proiectai o aplicaie Java care s implementeze comanda finger. Clientul se conectez la server
la portul 79 i transmite o linie cu o interogare terminat cu perechea CR_LF la care serverul
rspunde.
3.2. Proiecai o aplicaie care s implementeze comunicaia ntre un client i un server respectnd
specificaiile: programul server ascult reeaua i ateapt s primeasc o cerere de la un client.
Dac cererea este recepionat fr conflicte, serverul proceseaz cererea i nchide conexiunea.
Clientul folosete o adres pentru a solicita o conexiune unui calculator n reea (n mod uzual
solicit un serviciu unui server), apoi se deconecteaz din reea.
114
115