Post on 03-Mar-2020
TPI 17.02.2010 21:52 1
Tehnologii de Programare in Internet(TPI / RST)
Titulari curs: Mihnea Magheti, Eduard-Cristian PopoviciSuport curs: http://discipline.elcom.pub.ro/tpi/ Moodle: http://electronica07.curs.ncit.pub.ro/course/category.php?id=3
UPB – Facultatea ETTI – Curs TPI – an III – RST
2009 - 2010
TPI 17.02.2010 21:52 2
Structura cursului
1. Introducere in tehnologiile Internet
2. Introducere in tehnologiile desktop (SE) Java2.1. Elemente de baza. Tipuri de date referinta. Clase de biblioteca2.2. Clase pentru fluxuri de intrare-iesire (IO)
3. Programarea la nivel socket in Java3.1. Introducere in Protocolul Internet (IP) si stiva de protocoale IP3.2. Socketuri flux (TCP) Java si programe multifilare (threads)3.3. Socketuri datagrama (UDP) Java
4. Tehnologii Java de programare a aplicatiilor Web (EE) Java4.1. Tehnologii client. Miniaplicatii Java (applet-uri)4.2. Clase pentru interfete grafice cu utilizatorul (AWT, Swing)4.3. Platforma Java EE. Arhitectura si tehnologiile implicate4.4. Tehnologii server. Tehnologia Java Servlet4.5. Tehnologia Java ServerPages (JSP)4.6. Accesul la baze de date prin tehnologii Java (JDBC, Hibernate) 4.7. Tehnologii avansate (frameworks, componente EJB, Servicii Web)
Continut curs TPI
TPI 17.02.2010 21:52 3
Structura cursului
3. Programarea la nivel socket in Java3.3. Socketuri datagrama (UDP) Java
TPI 17.02.2010 21:52 4
3.3. Socketuri datagrama (UDP) JavaCrearea si utilizarea socket-urilor UDPClasa DatagramPacket reprezinta
- un pachet UDP (o datagrama)
- utilizat pentru livrare fara conexiune (include in mod normal informatii privind adresele IP si porturile sursa si destinatie)
Clasa DatagramSocket reprezinta
- un socket UDP
- prin care se trimit sau se primesc pachete datagrama peste retele IP
- prin intermediul protocolului UDP
Clasa MulticastSocket (subclasa a DatagramSocket care adauga functionalitatilegate de multicast) poate fi utilizata pentru
- trimiterea si receptia unui pachet datagrama catre, respectiv dinspre, un grup multicast
TPI 17.02.2010 21:52 5
Aplicatia
instanta DatagramSocket
instanta DatagramPacket
new
new
send(packet)
packet
3.3. Socketuri datagrama (UDP) JavaCrearea si utilizarea socket-urilor UDPUn DatagramPacket este trimis printr-un DatagramSocket
- apeland la metoda send() a clasei DatagramSocket
- careia i se paseaza ca parametru respectivul DatagramPacket
TPI 17.02.2010 21:52 6
3.3. Socketuri datagrama (UDP) JavaCrearea si utilizarea socket-urilor UDPUn DatagramPacket este primit printr-un DatagramSocket
- apeland la metoda receive() a clasei DatagramSocket
- careia i se paseaza ca parametru un DatagramPacket pregatit pentrureceptie
Aplicatia
instanta DatagramSocket
instanta DatagramPacket
new
new
receive(packet)
packet
TPI 17.02.2010 21:52 7
3.3. Socketuri datagrama (UDP) JavaCrearea si utilizarea socket-urilor UDPPrincipalii constructori ai clasei DatagramPacket
DatagramPacket(byte[] buf, int length, InetAddress address, int port)Construieste un obiect DatagramPacket pregatindu-l pentru trimiterea unui pachet de lungime length catre numarul de port UDP specificat (port) al gazdei cu adresa specificata (address), furnizandu-i tabloul de octeti buf din care sa fie preluate datele pachetului (length trebuie sa fie mai mic sau egal cu buf.length).
DatagramPacket(byte[] buf, int length)Construieste un obiect DatagramPacket pregatindu-l pentru receptia unui pachet de lungime length, furnizandu-i tabloul de octeti buf in care sa fie plasate datele pachetului (length trebuie sa fie mai mic sau egal cu buf.length).
Principalii constructori ai clasei DatagramSocket
DatagramSocket(int port, InetAddress laddr)Construieste un socket datagrame legat pe local la portul UDP si adresa IP specificate
DatagramSocket(int port)Construieste un socket datagrame si il leaga la portul UDP specificat pe masina locala.
DatagramSocket()Construieste un socket datagrame si il leaga la un port UDP disponibil pe masina locala.
TPI 17.02.2010 21:52 8
3.3. Socketuri datagrama (UDP) JavaCrearea si utilizarea socket-urilor UDPDeclaratiile si descrierea catorva metode ale clasei DatagramPacket
getPort()Returneaza numarul de port UDP al masinii catre care pachetul
curent va fi trimis sau de la care pachetul curent va fi receptionat.
int
getOffset()Returneaza indexul (offsetul) la care sunt plasate datele de trimis
sau de receptionat in tabloul de octeti.
int
getLength()Returneaza numarul de octeti (lungimea bufferului) de date de
trimis sau de receptionat.
int
getData()Returneaza tabloul de octeti (bufferul) care contine datele
pachetului
byte[]
getAddress()Returneaza adresa IP sub forma de obiect InetAddress a masinii
catre care pachetul curent va fi trimis sau de la care va fi receptionat.
InetAddress
TPI 17.02.2010 21:52 9
3.3. Socketuri datagrama (UDP) JavaCrearea si utilizarea socket-urilor UDPDeclaratiile si descrierea catorva metode ale clasei DatagramPacket
setPort(int iport)Stabileste numarul de port UDP al masinii catre care pachetul va fi trimis.
void
setLength(int length)Stabileste numarul de octeti (lungimea bufferului) de date de trimis sau de
receptionat.
void
setData(byte[] buf, int offset, int length)Stabileste tabloul de octeti (bufferul) care contine datele pachetului curent
specificandu-i indexul offset de la care sa inceapa plasarea datelor pachetului in tablou.
void
setData(byte[] buf)Stabileste tabloul de octeti (bufferul) care contine datele pachetului curent
(implicit indexul offset=0).
void
setAddress(InetAddress iaddr)Stabileste adresa IP sub forma de obiect InetAddress a masinii catre care
pachetul curent va fi trimis.
void
TPI 17.02.2010 21:52 10
3.3. Socketuri datagrama (UDP) JavaCrearea si utilizarea socket-urilor UDPDeclaratiile si descrierea catorva metode ale clasei DatagramSocket
connect (InetAddress address, int port)”Conecteaza” socketul curent la adresa IP si numarul de port
specificate (acestea actioneaza ca un filtru, prin socketul conectatputand fi trimise sau primite pachete doar catre respectiv de la adresaIP si numarul de port specificate). Implicit socketul e neconectat.
void
close()Inchide socketul datagrama curent.
void
send (DatagramPacket p)Trimite un pachet datagrama prin socketul curent.
void
receive (DatagramPacket p)Receptioneaza un pachet datagrama prin socketul curent.
void
getLocalPort()Returneaza numarul de port local la care este legat socketul curent.
int
getLocalAddress()Obtine adresa IP locala la care este legat socketul curent.
InetAddress
TPI 17.02.2010 21:52 11
3.3. Socketuri datagrama (UDP) JavaCrearea si utilizarea socket-urilor UDPDeclaratiile si descrierea catorva metode ale clasei DatagramSocket
setSoTimeout(int timeout)Stabileste valoarea optiunii SO_TIMEOUT la un timeout specificat, in
millisecunde.
void
getSoTimeout()Obtine valoarea optiunii SO_TIMEOUT.
int
isConnected()Returneaza o valoare logica indicand daca socketul curent e conectat
boolean
disconnect()Deconecteaza socketul curent.
void
getPort()Returneaza numarul de port UDP la care socketul curent este
conectat (-1 daca nu este conectat).
int
getInetAddress()Returneaza adresa IP la care socketul curent e conectat (null daca
nu e).
InetAddress
TPI 17.02.2010 21:52 12
3.3. Socketuri datagrama (UDP) JavaCrearea si utilizarea socket-urilor UDPDeclaratiile si descrierea catorva metode ale clasei DatagramSocket
setTrafficClass(int tc)Stabileste valoarea octetului clasa de trafic (QoS) sau tip serviciu (ToS) in
antetul datagramei IP care incapsuleaza datagramele UDP trimise prin socket
void
getTrafficClass()Obtine valoarea octetului clasa de trafic (QoS) sau tip de serviciu (ToS) in
antetul datagramei IP care incapsuleaza datagramele UDP trimise prin socket
int
setSendBufferSize(int size)Stabileste optiunea SO_SNDBUF pentru socket la valoarea specificata.
void
getSendBufferSize()Returneaza valoarea optiunii SO_ SNDBUF pentru socketul curent, adica
dimensiunea bufferului utilizat de platforma pentru pachetele trimise de socket
int
setReceiveBufferSize(int size)Stabileste optiunea SO_RCVBUF pentru socket la valoarea specificata.
void
getReceiveBufferSize()Returneaza valoarea optiunii SO_RCVBUF pentru socketul curent, adica
dimensiunea bufferului utilizat de platforma pentru pachetele primite de socket
int
TPI 17.02.2010 21:52 13
3.3. Socketuri datagrama (UDP) JavaCrearea si utilizarea socket-urilor UDP
Secventa tipica pentru crearea unui pachet datagrama (UDP) pentru timitere
// Stabilirea adresei serveruluiString adresaIP = "localhost";
// Stabilirea portului serveruluiint portUDP = 2000;
// Crearea tabloului de octeti (bufferului) de date String mesaj = "mesaj de trimis";byte[] bufferDate = mesaj.getBytes();
// Crearea pachetului de trimistry {
DatagramPacket pachetUDP = new DatagramPacket(bufferDate, bufferDate.length, InetAddress.getByName(adresaIP), portUDP);
}catch (UnknownHostException ex) {
System.err.println(ex);}
123456789101112131415161718
TPI 17.02.2010 21:52 14
3.3. Socketuri datagrama (UDP) JavaCrearea si utilizarea socket-urilor UDP
Secventa tipica pentru crearea unui pachet datagrama (UDP) pentru receptie// Crearea tabloului de octeti (bufferului) de date byte[] bufferDate = new byte[4096];
// Crearea pachetului de primittry {
DatagramPacket pachetUDP = new DatagramPacket(bufferDate, bufferDate.length);
}catch (UnknownHostException ex) {
System.err.println(ex);}
1234567891011
Secventa tipica pentru citirea din pachetul UDP a datelor primite// Obtinerea datelor pachetului ca tablou de octetibufferDate = pachetUDP.getData();
// Reconstructia mesajului textString mesajPrimit =
new String(bufferDate, 0, pachetUDP.getLength());
123456
TPI 17.02.2010 21:52 15
3.3. Socketuri datagrama (UDP) JavaCrearea si utilizarea socket-urilor UDP
Secventa tipica pentru crearea socket-ului unei aplicatii client// Crearea socketuluiDatagramSocket socketUDP = new DatagramSocket();
Secventa tipica pentru crearea socket-ului unei aplicatii server// Stabilirea portului serveruluiint portServer = 2000;// Crearea socketuluiDatagramSocket socketUDP = new DatagramSocket(portServer);
Trimiterea de date prin socket// Trimiterea pachetului UDPsocketUDP.send(pachetDeTrimis);
// Receptia unui pachet UDP - blocare in asteptaresocketUDP.receive(pachetPrimit);
Primirea de date prin socket
TPI 17.02.2010 21:52 16
3.3. Socketuri datagrama (UDP) JavaCrearea si utilizarea socket-urilor UDP
Identificarea porturilor UDP locale pe care sunt conexiuni prin incercarea de a crea pe ele socket-uri UDPimport java.net.*;
public class ScannerPorturiUDPLocale {public static void main (String args[]) {
DatagramSocket serverUDP;for (int portUDP=1; portUDP < 65536; portUDP++) {
try {// Urmatoarele linii genereaza exceptie prinsa de blocul catch// in cazul in care e deja un server pe portul portUDPserverUDP = new DatagramSocket(portUDP);serverUDP.close();
}catch (SocketException ex) { System.err.println("Exista server UDP pe portul " + portUDP);
}}
}}
123456789101112131415161718
TPI 17.02.2010 21:52 17
3.3. Socketuri datagrama (UDP) JavaCrearea si utilizarea socket-urilor UDP
Program server ecou cu pierderi (10% din pachetele primite) import java.net.*;import java.io.*;
/*** Server ecou care pierde in mod aleator 10% din pachete*/public class ServerEcouCuPierderiDatagrame {
public static void main(String args[]) throws IOException {
BufferedReader inConsola = new BufferedReader(newInputStreamReader(System.in));
System.out.print("Introduceti numarul de port al serverului: "); int portUDP = Integer.parseInt(inConsola.readLine());
// Crearea socket-uluiDatagramSocket socketUDP = new DatagramSocket(portUDP);
123456789101112131415161718
TPI 17.02.2010 21:52 18
3.3. Socketuri datagrama (UDP) JavaCrearea si utilizarea socket-urilor UDP
Program server ecou cu pierderi (10% din pachetele primite)
// Tratarea clientuluiwhile (true) {
// Primirea pachetuluibyte bufferDate[] = new byte[65535];
DatagramPacket pachetUDP = new DatagramPacket(bufferDate, bufferDate.length);
socketUDP.receive(pachetUDP);
System.out.println("S-au primit " + pachetUDP.getLength() +" octeti, <<" + pachetUDP.getData() + ">>");
// Decizia asupra modului de tratare a pachetului// Trimiterea pachetului
19202122232425262728293031323334
TPI 17.02.2010 21:52 19
3.3. Socketuri datagrama (UDP) JavaCrearea si utilizarea socket-urilor UDP
Program server ecou cu pierderi (10% din pachetele primite)
if (Math.random() < .9) {System.out.println("Pachetul va fi trimis in ecou.");
DatagramPacket pachetUDPEcou = new DatagramPacket(pachetUDP.getData(), pachetUDP.getLength(), pachetUDP.getAddress(), pachetUDP.getPort());
socketUDP.send(pachetUDPEcou);System.out.println("Raspuns trimis.");
}
// Aruncarea pachetuluielse {System.out.println("Pachetul a fost aruncat.");
}}
} }
353637383940414243444546474849505152
TPI 17.02.2010 21:52 20
3.3. Socketuri datagrama (UDP) JavaCrearea si utilizarea socket-urilor UDP
Client pentru server de ecou cu pierderi (retransmite la intarzieri >10 secundeale pachetelor ecou de la server)
import java.net.*;import java.io.*;
public class ClientRetransmisie {protected DatagramSocket socketUDP;protected DatagramPacket pachetUDP;protected Asteptare timer;
protected void trimitePachet() throws IOException {
socketUDP.send(pachetUDP);System.out.println("Pachet trimis.");
// Crearea firului timer Asteptaretimer = new Asteptare(10, this);
// Pornirea firului timer Asteptaretimer.start();
}
12345678910111213141516171819
TPI 17.02.2010 21:52 21
3.3. Socketuri datagrama (UDP) JavaCrearea si utilizarea socket-urilor UDP
Client pentru server de ecou cu pierderiprotected void primestePachet() throws IOException {
byte bufferDate[] = new byte[65535];
DatagramPacket pachetUDP = new DatagramPacket(bufferDate, bufferDate.length);
socketUDP.receive(pachetUDP);
ByteArrayInputStream inTablou = new ByteArrayInputStream(pachetUDP.getData(), 0, pachetUDP.getLength());
DataInputStream inDateFormatate = new DataInputStream(inTablou);
String textPrimit = inDateFormatate.readUTF();System.out.println("S-a primit " + textPrimit);
// Oprirea firului timer timer.stop();
}
20212223242526272829303132333435363738
TPI 17.02.2010 21:52 22
3.3. Socketuri datagrama (UDP) JavaCrearea si utilizarea socket-urilor UDP
Client pentru server de ecou cu pierderipublic static void main(String args[]) throws IOException {
String adresaServer = JOptionPane.showInputDialog("Introduceti adresa IP a serverului: ");
int portServer = Integer.parseInt(JOptionPane.showInputDialog("Introduceti numarul de port al serverului: "));
String textDeTrimis = JOptionPane.showInputDialog(ClientRetransmisie client = new ClientRetransmisie();
// Creare socketclient.socketUDP = new DatagramSocket();
// Constructie pachetByteArrayOutputStream outTablou = new ByteArrayOutputStream();DataOutputStream outDateFormatate = new DataOutputStream(outTablou);outDateFormatate.writeUTF(textDeTrimis);
byte[] bufferDate = outTablou.toByteArray();client.pachetUDP = new DatagramPacket(bufferDate, bufferDate.length,
InetAddress.getByName(adresaServer), portServer);
39404142434445464748495051525354555657
TPI 17.02.2010 21:52 23
3.3. Socketuri datagrama (UDP) JavaCrearea si utilizarea socket-urilor UDP
Client pentru server de ecou cu pierderiwhile (true) {
// Trimitere pachetclient.trimitePachet();
// Primire pachetclient.primestePachet();
System.out.println("Pauza 2 secunde...");try {Thread.sleep(2000);
} catch (InterruptedException ex) {ex.printStackTrace();
}}
} }
585960616263646566676869707172737475
TPI 17.02.2010 21:52 24
3.3. Socketuri datagrama (UDP) JavaCrearea si utilizarea socket-urilor UDP
Clientul utilizeaza urmatoarea clasa care lucreaza cu fire de executieimport java.net.*;import java.io.*;
class Asteptare extends Thread {private ClientRetransmisie client;private int durata;
public Asteptare (int durata, ClientRetransmisie client) {this.client = client;this.durata = durata;
}public void run() {try {Thread.sleep (durata*1000);System.out.println("Retransmisie...");try {// Retransmisie pachetclient.trimitePachet();
} catch (IOException ex) { ex.printStackTrace(); }} catch (InterruptedException ex) { ex.printStackTrace (); }
}}
12345678910111213141516171819202122