Sunteți pe pagina 1din 11

5.

Programarea cu sockets n Java

5. Programarea cu sockets n Java

Elemente de baz: adrese Internet i URL-uri

Comunicarea orientat pe conexiune

Comunicarea fr conexiune

Comunicarea de grup

5.1. Elemente de baz: adrese Internet i URL-uri


(1)

Pachetul Java folosit: java.net

Pentru socketuri TCP sunt prevzute 2 clase


distincte: Socket i ServerSocket

Pentru comunicare multicast: MulticastSocket,


derivat din DatagramSocket
Pentru comunicarea propriu-zis se folosesc
operaraiile de introducere/extragere cu fluxuri din
Java
Pentru a permite lucrul att cu identificatori simbolici
ct i cu identificatori numerici pentru calculatoarele
din reea este definit clasa InetAddress, care nu
are constructori explicii i este prevzut cu
metodele:

- returneaz
numele calculatorului cruia i corespunde
obiectul InetAddress curent
public String getHostName()

- returneaz
adresa IP a obiectului InetAddress curent n
form binar primar
public byte[] getAddress ()

public String getHostAddress () returneaz adresa IP a obiectului InetAddress


curent n form de ir: %d.%d.%d.%d

Exemplu:

import java.net.*;
public class TestInetAddress {
public static void main(String[] args) {

public static InetAddress getByName (String


host) throws UnknownHostException

InetAddress [] adrese = new InetAddress[10];

determin adresa IP a unui calculator pentru


care se cunoate numele

try { adrese = InetAddress.getAllByName(args[0]);


int i = 0;

public static InetAddress getLocalHost()


throws UnknownHostException determin

while ((i<adrese.length)){

adresa IP a calculatorului local

System.out.println(adrese[i].getHostAddress());
i++;

public static InetAddress[]


getAllByName(String host) throws
UnknownHostException returneaz

ca tablou
toate adresele IP ale calculatorului parametru

}catch(Exception e) {System.out.println(Exceptie + e);}


}}

Clase, interfee i excepii n java.net


Object

Object
InetAddress
Throwable

URL

Socket

Exception

ServerSocket
MalformedURLException
DatagramPacket

DatagramSocket

URLConnection

ProtocolException

MulticastSocket

HttpURLConnection

UnknownHostException
UnknownServiceException
SocketException

SocketImpl

BindException
NoRouteToHostException
ConnectionException

5.1. Elemente de baz: adrese Internet i URL-uri


(2)

ClasaURLoferfacilitipentrucreareaimanipularea
locatoriloruniversalideresurse.Formacomplet
pentruunURL:

protocol://nume_calculator:port/nume_de_cale#ref

nmodnormalnume_de_calereprezintunnumede
ier,acruiinterpretareedependentdeprotocoli
decalculator.Poateialtcevadectier

public URLConnection openConnection() throws


IOExceptionreturneazunobiect

URLConnecKoncarereprezintoconexiunela
obiectulladistanreferitdeURLulcurent.

public final InputStream openStream() throws


IOExceptiondeschideoconexiunespreURLul

curentireturneazunuxdeintrarepentruaciK
dinaceastconexiune.Echivalentcu:

ClasaURLare4constructori:

public URL (String protocol, String host, int


port, String file) throws
MalformedURLException

openConnection().getInputStream()

public final Object getContent() throws


IOException returneazconinutulacestuiURL

ireprezintexprimareaprescurtata

public URL (String protocol, String host,


String file) throws MalformedURLException
public URL (URL context, String spec) throws
MalformedURLException creeazunURLprin

interpretareaspecncontextuldat

public URL(String spec)throws


MalformedURLException

ClasaURLreimplementeazmetodelehashCode,
equalsitoString

Principalelemetode:

openConnection().getContent()

ClasaURLConnectionimplicatnmetodele
prezentatemaisus,conineimetodele
getContent() igetInputStream(),
deniteasOel:

public Object getContent() throws IOException

returneazconinutulacesteiconexiuniURL

public InputStream getInputStream() throws


IOExceptionreturneazunuxdeintrarecare

citetedinaceastconexiune

5.2.Comunicareaorientatpeconexiune:clasele Socket i
ServerSocket

ClasaSocketconineconstructoriimetode
pentrusocketuriclient.Principaliiconstructori:

public Socket (String host, int port) throws


UnknownHostException, IOException

public ServerSocket(int port) throws IOException

creeazunsocketserverlaportulspecicat.Dac
sepune0laportsefoloseteoriceportdisponibil.
Sexeazimplicitcapacitateacoziideateptare
pentrucererila50.

creeazunsocketilconecteazlacalculatoruli
portulspecicate

public Socket (String host, int port,


InetAddress localAddr, int localPort)
throws IOExceptionspecicilegturalocal

public ServerSocket(int port, int backlog)


throws IOExceptionsespeciclungimeacozii

deateptare

asocketului

Principalelemetode:

public ServerSocket(int port, int backlog,


InetAddress bindAddr) throws IOException

speciciadresaInternetlocalprincarese
acceptcereri(daceste0seacceptprinoricare
dintreadreseleunuinodmulKhome

public InputStream getInputStream() throws


IOExceptionreturneazuxuldeintrareataat

socketului

public OutputStream getOutputStream() throws


IOExceptionreturneazuxuldeieireataat

socketului

public synchronized void close() throws


IOExceptionnchidesocketulcurent

PrinciKredinuxuldeintrare,respecKvscrieren
uxuldeieireserealizeazcomunicareprinsocket

ClasaServerSocketare3constructori:

Metodaspecic:

public Socket accept() throws IOException

ateaptocereredeconectareioaccept.
Metodaproduceblocareaprocesului(rului)
apelantpnlasosireauneicereri.Metoda
returneazunsocketclientprincaresedesfoar
comunicareacusolicitantuldeconectareacceptat

5.2.3. Un exemplu simplu cu server iterativ

Aplicaiaesteunservercuecou.Programulserverare
codul:

import java.net.*;

Colulsursalunuiclient:

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

import java.io.*;
public class EchoServer {

public class EchoClient {


public ststic void main(String [] args){

public static void main(String [] args){

String mesin=; String mesout=; int c;

String mes; boolean gata;


try { ServerSocket ss = new
ServerSocket(15812);

byte[] b = new byte[256]; boolean gata = false;


try{ Socket s = new Socket (args[0],15812);

while(true) {

DataInputStream intrare = new


DataInputStream ( s.getInputStream());

Socket client = ss.accept();

DataOutputStream iesire = new


DataOutputStream ( s.getOutputStream());

DataInputStream in = new
DataInputStream(client.getInputStream());

while (!gata) {System.in.read(b);


DataOutputStream out = new
DataOutputStream( client.getOutputStream())
;

for(c=0; c;b.Length; c++) mesout


+=(char)b[c];

while (!
(mes=in.readUTF()).startsWith(GATA))

iesire.writeUTF(mesout);
mesin = intrare.readUTF();

out.writeUTF(Am primit: + mes +


\n);

System.out.println(mesin);

client.close(); }

if(!(mesout.startsWith(GATA!))){

}catch (Exception e){} }}

//initializeaza b si mesout }....


}}

5.2.4.Exemplecuservereconcurente
Serescrieexemplulanterior,cugenerareaunuinou
rdeexecuiepentruecareconectare.

public void run(){


String mes=;boolean gata=false;

public class EchoServerConc{

String co=Integer.toString(contor);

public static void main(String[] args){

try{ DataInputStream in = new


DataInputStream(insock.getInputStream());

Socket client; int c=0;


try{ ServerSocket ss=new ServerSocket(15812);

DataOutputStream out = new


DataOutputStream(insock.getOutputStream());

while(true){
while(!gata){

client = ss.accept(); c++;

mes = in.readUTF();
new ThreadEcho(client, c).start();}

out.writeUTF(Am primit din firul +


co +mes + \n);

}catch (Exception e){}

if(mes.startsWith(GATA!)){

}}

Codulruluideexecuie:

out.writeUTF(GATA!!!);gata=true;}
}

public class ThreadEcho extends Thread {


private Socket

insock.close();

insock; private int contor;

}catch (Exception e){}

public ThreadEcho(Socket inp, int c){


insock = inp; contor = c;
}

}
}

5.3.Comunicareafrconexiune.Clasele
DatagramSocketiDatagramPacket

ClasaDatagramPacketreprezintunpachet
datagramiesteprevzutcu2constructorii
metodeaccesor.Constructoriisunt:

public DatagramPacket(byte ibuf[], int ilength)


construieteunpachetdatagrampentrua
recepionanibufpachetedelungimeilength
public DatagramPacket(byte ibuf[], int ilength,
InetAddress iaddr, int port) -

ClasaDatagramSocketesteprevzutcu
constructorii:

public DatagramSocket()throws IOException

creeazunsocketdatagramilleaglaoriceport
disponibilpecalculatorullocal

public DatagramSocket(int port) specicportul

local

construieteunpachetdatagrampentruatrimite
pachetelacalculatoruliportulspecicate

public DatagramSocket(int port, InetAddress


laddr)speciciadresaIPlocal

Dintremetodeleaccesorseremarc:

public synchronized byte[] getData() returneaz

parteadedatedindatagramacurent

public synchronized void setData(byte[] ibuf)

stabileteconinutulpriidedatedindatagram

public synchronized int getLength()returneaz

lungimeadatelordindatagramacurent

public synchronized void setLength(int ilength)

stabiletelungimeadatelordindatagramacurent

public synchronized InetAddress getAddress()

Metodeleprincipale:

public void send(DatagramPacket p) throws


IOExceptionemiteunpachetdatagramdelaac

estsocket.Pachetulconinedate,lungime,adresai
portuldedesKnaie

public synchronized void receive(DatagramPacket


p) throws IOExceptionrecepioneazun

pachetdatagram.Larevenirentamponsea
datele,dariadresaiportulemitorului.Se
executcublocare

public void close() nchidesochetulcurent

returneazadresaIPacalculatoruluilacarese
trimitesaudeundesaprimitdatagrama

public InetAddress getLocalAddres()returneaz

Suntmetodeasemntoareipentruparteadeport

public int getLocalPort() returneazportullocal

adresaIPlocallacareelegatsocketulcurent

5.3.3.Exempludeaplicaiefrconexiune

Seconsidertotaplicaiacumesajetrimisenecou.
ClientulconstruietemesajeciKndocteidinierul
standarddeintrare,letrimiteserveruluiprinsocket
datagramirecepioneazecouldelaserver

Codulserverului:

public class DGEchoServer {


public static void main(String[] args){
DatagramSocket ds; byte buf[] = new byte[256];

Interaciuneacuecareclientsedesfoarseparat
pentruecaredatagram.Codulclientului,
presupunndcecaremesajsecitetedinintrarea
standard:

public class DGEchoClient {


public static void main(String[] args){
int port;InetASddress address; DatagramSocket
socket = null; DtagramPacket packet;
byte[] sendBuf = new byte[256];

DatagramPacket dpr = new DatagramPacket(buf,


256), dps;

try{socket=new DatagramSocket();

InetAddress ia; int port;

}catch(IOException e){}

try{ds=new DatagramSocket
(Integer.parseInt(args[0]));

try{System.in.read(sendBuf);

while(true) {

}catch(IOException e){}
if(socket != null){

ds.receive(dpr);ia=dpr.getAddress();

try{port=Integer.parseInt(args[1]);

port=dpr.getPort();buf=dpr.getData();
dps=new DatagramPacket(buf, buf.length,
ia, port); ds.send(dps); }
}catch (IOException e){}

address=InetAddress.getByName(args[0]);
packet=new DatagramPacket(sendBuf, 256,
address, port); socket.send(packet);
//get and print response

}}

catch(IOException e){}

}}}

5.4.Comunicareadegrup(mulKcast).Clasa
MulticastSocket

ClasaMulticastSocketderivdin
DatagramSocketiarefacilitisuplimentare
pentruataarealagrupuridecomunicaii.
ClasaMulticastSocketaredoiconstructori:

public MulticastSocket() throws IOException

creeazunsocketmulKcastcareseleaglaorice
portdisponibil

public MulticastSocket(int port) throws


IOExceptioncreeazunsocketmulKcastil

leaglaportulspecicat

Metodeleclasei:

public void joinGroup(InetAddress mcastaddr)


throws IOExceptionsocketulcurentdevine

membrualgrupuluispecicat

public void leaveGroup(InetAddress


mcastaddr)throws IOExceptionsocketulse

retragedingrup

public synchronized void send(DatagramPacket p,


byte ttl) throws IOException trimiteun

pachetladesKnaie,cuunTTLdiferitdeal
socketului.DacnuenecesarTTLdiferitsepoate
folosimetodasend()aclasei
DatagramSocket

StructuradeprogramKpicpentrucomunicarea
mulKcast:

byte[] msg = ...;


InetAddress group =
InetAddress.getByName(228.5.6.7);
MulticastSocket socket = new
MulticastSocket(5678);
socket.joinGroup(group);
DatagramPacket dp = new DatagramPacket(msg,
msg.length, group, 5678);
socket.send(dp);
byte[] buf = new byte[1024];
DatagramPacket recv = new DatagramPacket(buf,
buf.length);
socket.receive(recv);
...
socket.leaveGroup(group);
...

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