Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
1
Java: Socket API (Υποδοχές)
Όνομα φοιτητή: Ηλίας Χατζηκυριάκου Α.Μ: 144/06 Όνομα καθηγητή: Παναγιώτης Φουληράς
2
Τι είναι μια υποδοχή; Ένας διακομιστής (server) τρέχει σε ένα συγκεκριμένο υπολογιστή και έχει μια υποδοχή, η οποία είναι συνδεδεμένη με έναν συγκεκριμένο αριθμό θύρας(port number). Ο διακομιστής απλά περιμένει στην θύρα αυτή για κάποιον client μέχρι να γίνει κάποια αίτηση σύνδεσης. Από την πλευρά του server: Ο client γνωρίζει το hostname του μηχανήματος που τρέχει ο server και την θύρα που ακούει ο server. Για να γίνει μια αίτηση σύνδεσης, ο client στέλνει μια αίτηση σύνδεσης στο server στην συγκεκριμένη θύρα. Επίσης o client πρέπει να προσδιορίσει τον εαυτό του στον server έτσι ώστε να συνδεθεί σε μια τοπική θύρα, συνήθως προσδιορισμένη από το Λ.Σ.
3
Διαχωρισμός των υποδοχών
Tο πρώτο είδος υποδοχής ονομάζεται TCP ( Transmission Control Protocol ) socket και είναι μια υπηρεσία προσανατολισμένη στην σύνδεση ( connection-oriented service ). Μπορούμε να το θεωρήσουμε ανάλογο της τηλεφωνικής υπηρεσίας, στην οποία, μετά την εγκαθίδρυση μιας σύνδεσης μεταξύ δύο συνομιλητών, αυτή χρησιμοποιείται μέχρι το πέρας της συζητήσεως τους. Το άλλο είδος ονομάζεται UDP (Unreliable Datagram Protocol ) socket και είναι μια υπηρεσία χωρίς σύνδεση ( connectionless service ). To ανάλογο, σε αυτήν την περίπτωση, είναι το ταχυδρομείο : μπορούμε να στείλουμε πολλά πακέτα στον ίδιο παραλήπτη, αλλά δεν είναι σίγουρο ότι όλα θα ακολουθήσουν την ίδια διαδρομή ( … σύνδεση ) για να φτάσουν στον προορισμό τους.
4
Σημαντικές διαφορές TCP-UDP
1) Tα TCP sockets εξασφαλίζουν μια αξιόπιστη μεταφορά της πληροφορίας : ότι αποστέλλεται από το ένα άκρο είναι σίγουρο ότι θα φτάσει στο άλλο. Στο UDP socket όμως δεν συμβαίνει αυτό. Είναι στην ευθύνη του αποστολέα να ελέγξει ότι αυτό που έστειλε, το έλαβε τελικά ο παραλήπτης και δεν χάθηκε στον δρόμο. 2) Από την άλλη, η σύνδεση με TCP socket απαιτεί την ανταλλαγή τριών “πακέτων χειραψίας” ( handshake packets ) και είναι πιο χρονοβόρα στην αρχικοποίησή της από την αντίστοιχη με UDP datagrams. Οι προηγούμενες δύο διαφορές καθορίζουν τελικά και την χρήση των δύο αυτών ειδών.
5
Ονομασία των παραπάνω στην Java
Για την αποφυγή σύγχυσης, να σημειώσουμε ότι ειδικά στην Java, ο όρος Socket χρησιμοποιείται για τα TCP sockets, στην ονοματολογία των κλάσεων και των μεθόδων, ενώ για την δήλωση των UDP sockets, χρησιμοποιείται ο όρος Datagram. Μηχανισμός / Κλάση Περιγραφή Socket TCP άκρο - πελάτης ServerSocket ΤCP άκρο - εξυπηρετητής DatagramSocket UDP άκρο ( client & server ) DatagramPacket UDP πακέτο ΙnetAddress Διεύθυνση Internet Protocol ( IP ) URL Uniform Resource Locator URLConnection Σύνδεση με αντικείμενο του web.
6
Bιβλιοθήκη για Sockets
To πακέτο java.net περιέχει μια κλάση, την Socket, η οποία υλοποιεί μια πλευρά από την διμερής σύνδεση μεταξύ της Java εφαρμογής σας και ενός άλλου προγράμματος στο δίκτυο. Η κλάση Socket βρίσκεται στην κορυφή μιας ανεξαρτήτου πλατφόρμας εφαρμογής. Χρησιμοποιώντας την java.net.Socket κλάση μπορούμε να επικοινωνούμε μέσα σε ένα δίκτυο χωρίς να παίζει ρόλο η πλατφόρμα που έχουμε. ServerSocket: κλάση η οποία υλοποιεί το socket που χρησιμοποιούν οι servers για να δέχονται συνδέσεις από τους clients.
7
Ανάγνωση από και εγγραφή σε ένα socket
Yλοποίηση echο client Yλοποίηση echο server
8
Datagrams Σε αντίθεση, εφαρμογές που χρησιμοποιούν datagrams στέλνουν και παραλαμβάνουν εντελώς ανεξάρτητα πακέτα δεδομένων. Αυτοί οι clients και servers δεν έχουν και δεν χρειάζονται ένα σημείο προς σημείο κανάλι. Η αποστολή των datagrams στον προορισμό τους δεν είναι εγγυημένη. Ούτε η σειρά της άφιξης. Το datagram είναι ένα ανεξάρτητο, αυτόνομο μήνυμα που θα σταλεί σε ένα δίκτυο για το οποίο η άφιξη, ο χρόνος της άφιξης και το περιεχόμενο δεν είναι εγγυημένα. Το package java.net περιέχει 3 κλάσεις που μας βοηθάνε να γράψουμε Java εφαρμογές που χρησιμοποιούν datagrams για την αποστολή και την παραλαβή datagrams σε ένα δίκτυο: DatagramSocket, DatagramPacket, και MulticastSocket. Μια εφαρμογή μπορεί να στέλνει και να παραλαμβάνει DatagramPackets μέσα από ένα DatagramSocket. Επιπλέον, τα DatagramPackets μπορούν να κάνουν broadcast σε πολλαπλούς παραλήπτες, οι οποίοι όλοι ακούνε σε ένα MulticastSocket.
9
Εφαρμογές με Datagrams
Yλοποίηση echο client (UDP) Yλοποίηση echο server (UDP)
10
Broadcasting σε πολλαπλούς παραλήπτες
MulticastSocket: είδος υποδοχής που χρησιμοποιείται από την πλευρά του client και ακούει για πακέτα τα οποία ο server αποστέλλει (broadcast) σε πολλαπλούς clients.
11
Προγραμματιστική Πρόσβαση σε Δικτυακές παραμέτρους
Διάφορα συστήματα συχνά τρέχουν με πολλές δικτυακές συνδέσεις, όπως Ethernet, b/g (ασύρματο) και bluetooth. Κάποιες εφαρμογές μπορεί να θελήσουν να έχουν πρόσβαση σε τέτοιου είδους πληροφορία. Η java.net.NetworkInterface κλάση παρέχει πρόσβαση σε αυτή την πληροφορία. Χρήσιμη για συστήματα με πολλά hosts(2 ή περισσότερες κάρτες δικτύου NICs)
12
Παράδειγμα με 2 ΝΙC Aν για παράδειγμα έχουμε 1 μηχάνημα με 2 NICs και θέλουμε να στείλουμε δεδομένα στον server, δημιουργούμε ένα socket σαν αυτό: Socket soc = new java.net.Socket(); soc.connect(new InetSocketAddress(address, port)); Για να στείλουμε δεδομένα, το σύστημα καθορίζει ποια διασύνδεση(interface) θα χρησιμοποιηθεί. Εντούτοις αν έχουμε κάποια προτίμηση ή αλλιώς χρειάζεται να προσδιορίσουμε ποια NIC θα χρησιμοποιήσουμε, μπορούμε να βρούμε τις διευθύνσεις αυτών των interfaces που θέλουμε να χρησιμοποιήσουμε.
13
Συνέχεια παραδείγματος
Για παράδειγμα: NetworkInterface nif = NetworkInterface.getByName("bge0"); Enumeration nifAddresses = nif.getInetAddresses(); Socket soc = new java.net.Socket(); soc.bind(nifAddresses.nextElement()); soc.connect(new InetSocketAddress(address, port)); Μπορούμε ακόμα να χρησιμοποιήσουμε την NetworkInterface για τον προσδιορισμό του interface στο οποίο θα μπει το multicast group. Παράδειγμα: NetworkInterface nif = NetworkInterface.getByName("bge0"); MulticastSocket() ms = new MulticastSocket(); ms.joinGroup(new InetSocketAddress(hostname, port) , nif);
14
Ανάκτηση Διεπαφών(Network Interfaces)
Η κλάση NetworkInterface δεν έχει δημόσιο(public) κατασκευαστή. Οπόταν δεν μπορεί να δημιουργηθεί ένα νέο στιγμιότυπο με τον τελεστή new. Aντί αυτού, οι επόμενες στατικές μέθοδοι υπάρχουν έτσι ώστε να μπορούμε να πάρουμε πληροφορίες για το interface του συστήματος μας: getByInetAddress(), getByName() και getNetworkInterfaces() Οι πρώτοι 2 μέθοδοι χρησιμοποιούνται όταν ήδη ξέρουμε την ip διεύθυνση ή το όνομα του συγκεκριμένου interface. H 3η μέθοδος επιστρέφει μια λίστα με τα interface που υπάρχουν. Υπάρχει ιεραρχία! H getParent() επιστρέφει τον πατέρα του interface ή αν δεν υπάρχει τότε κενό και η getSubInterfaces(), επιστρέφει όλες τις υποδιεπαφές(subinterfaces) μιας δικτυακής διεπαφής
15
Παράδειγμα ανάκτησης Διεπαφών
import java.io.*; import java.net.*; import java.util.*; import static java.lang.System.out; public class ListNIFs { public static void main(String args[]) throws SocketException { Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces(); for (NetworkInterface netIf : Collections.list(nets)) { out.printf("Display name: %s\n", netIf.getDisplayName()); out.printf("Name: %s\n", netIf.getName()); displaySubInterfaces(netIf); out.printf("\n"); } static void displaySubInterfaces(NetworkInterface netIf) throws SocketException { Enumeration<NetworkInterface> subIfs = netIf.getSubInterfaces(); for (NetworkInterface subIf : Collections.list(subIfs)) { out.printf("\tSub Interface Display name: %s\n", subIf.getDisplayName()); out.printf("\tSub Interface Name: %s\n", subIf.getName());
16
Εμφάνιση Αποτελεσμάτων
Όπως παρακάτω: Display name: bge0 Name: bge0 Sub Interface Display name: bge0:3 Sub Interface Name: bge0:3 Sub Interface Display name: bge0:2 Sub Interface Name: bge0:2 Sub Interface Display name: bge0:1 Sub Interface Name: bge0:1 Display name: lo0 Name: lo0
17
Εμφάνιση Διευθύνσεων Δικτυακών Διεπαφών
Από τις πιο χρήσιμες πληροφορίες. Στιγμιότυπο κλάσης NetworkInterface: Μέθοδος getInetAddresses(), επιστρέφει την φυσική αλλά και την σχετική ip διεύθυνση(Enumeration of InetAddress) getInterfaceAddresses(), επιστρέφει μια λίστα από στιγμιότυπα της java.net.InterfaceAddress. Αυτή η μέθοδος μπορεί να μας δώσει πληροφορίες όπως το subnet mask, την broadcast διεύθυνση όταν η διεύθυνση είναι μια IPv4, και το μήκος προθέματος ενός δικτύου αν πρόκειται για IPv6 διεύθυνση.
18
Παράδειγμα Εμφάνισης Διευθύνσεων Δικτυακών Διεπαφών
import java.io.*; import java.net.*; import java.util.*; import static java.lang.System.out; public class ListNets{ public static void main(String args[]) throws SocketException { Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces(); for (NetworkInterface netint : Collections.list(nets)) displayInterfaceInformation(netint); } static void displayInterfaceInformation(NetworkInterface netint) throws SocketException { out.printf("Display name: %s\n", netint.getDisplayName()); out.printf("Name: %s\n", netint.getName()); Enumeration<InetAddress> inetAddresses = netint.getInetAddresses(); for (InetAddress inetAddress : Collections.list(inetAddresses)) { out.printf("InetAddress: %s\n", inetAddress); out.printf("\n");
19
Αποτέλεσμα Εμφάνισης Διευθύνσεων Δικτυακών Διεπαφών
Display name: bge0 Name: bge0 InetAddress: /fe80:0:0:0:203:baff:fef2:e99d%2 InetAddress: / Display name: lo0 Name: lo0 InetAddress: /0:0:0:0:0:0:0:1%1 InetAddress: /
20
Παράμετροι Δικτυακής Διεπαφής
Πρόσβαση στις δικτυακές παραμέτρους για μια διεπαφή εκτός από το όνομα και την IP διεύθυνση που της αντιστοιχεί Εξέταση αν το network interface λειτουργεί(“up”): isLoopback() προσδιορίζει αν το network interface είναι ένα loopback interface. isPointToPoint() προσδιορίζει αν το interface είναι έναpoint-to-point interface. isVirtual() προσδιορίζει αν το interface είναι ένα εικονικό(virtual) interface. supportsMulticast() προσδιορίζει αν το interface υποστηρίζει multicasting. getHardwareAddress() επιστρέφει την φυσική ή MAC διεύθυνση της κάρτας(hardware) getMTU() επιστρέφει το Μaximum Transmission Unit (MTU), το οποίο είναι το μέγιστο μέγεθος ενός πακέτου.
21
Παράδειγμα: Παράμετροι Δικτυακής Διεπαφής
import java.io.*; import java.net.*; import java.util.*; import static java.lang.System.out; public class ListNetsEx{ public static void main(String args[]) throws SocketException { Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces(); for (NetworkInterface netint : Collections.list(nets)) displayInterfaceInformation(netint); } static void displayInterfaceInformation(NetworkInterface netint) throws SocketException { out.printf("Display name: %s\n", netint.getDisplayName()); out.printf("Name: %s\n", netint.getName()); Enumeration<InetAddress> inetAddresses = netint.getInetAddresses(); for (InetAddress inetAddress : Collections.list(inetAddresses)) { out.printf("InetAddress: %s\n", inetAddress); out.printf("Up? %s\n", netint.isUp()); out.printf("Loopback? %s\n", netint.isLoopback()); out.printf("PointToPoint? %s\n", netint.isPointToPoint()); out.printf("Supports multicast? %s\n", netint.supportsMulticast()); out.printf("Virtual? %s\n", netint.isVirtual()); out.printf("Hardware address: %s\n“, Arrays.toString(netint.getHardwareAddress())); out.printf("MTU: %s\n", netint.getMTU()); out.printf("\n");
22
Αποτέλεσμα: Παράμετροι Δικτυακής Διεπαφής
Display name: bge0 Name: bge0 InetAddress: /fe80:0:0:0:203:baff:fef2:e99d%2 InetAddress: / Up? true Loopback? false PointToPoint? false Supports multicast? false Virtual? false Hardware address: [0, 3, 4, 5, 6, 7] MTU: 1500 Display name: lo0 Name: lo0 InetAddress: /0:0:0:0:0:0:0:1%1 InetAddress: / Loopback? true Hardware address: null MTU: 8232
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.