Εργαστήριο Java Lab11 Αντικείµενο: Δίκτυα Πακέτο java.net H Java παρέχει ένα σύνολο από ενσωµατωµένες δυνατότητες για δηµιουργία εφαρµογών στο Internet ή σε τοπικά δίκτυα. H Java παρέχει τα stream sockets και τα datagram sockets ως τρόπο για την επικοινωνία δυο εφαρµογών. Στην 1 η περίπτωση εγκαθιδρύεται µια σύνδεση ανάµεσα σε 2 διεργασίες που τρέχουν σε διαφορετικά σηµεία στο δίκτυο. Η ροή δεδοµένων µεταξύ των διεργασιών είναι συνεχής. Το πρωτόκολλο που χρησιµοποιείται είναι το TCP (Transmission Control Protocol). Στην 2 η περίπτωση ξεχωριστά πακέτα πληροφοριών µεταδίδονται χωρίς να υπάρχει εγγύηση ότι τα πακέτα θα φτάσουν στην σωστή σειρά. Το πρωτόκολλο που χρησιµοποιείται είναι το UDP (User Datagram Protocol). Χειρισµός URLs Χρησιµοποιώντας το πρωτόκολλο HTTP διευθύνσεις που περιγράφονται από ένα URL είναι δυνατόν να εντοπιστούν στο Internet. Αυτό γίνεται χρησιµοποιώντας το URL ως παράµετρο στην µέθοδο showdocument του interface AppletContext οπότε και εµφανίζει το URL στον browser που στον οποίο βρίσκεται το αντίστοιχο Applet. Τα applets επιτρέπεται να διαβάζουν αρχεία µόνο από τον server από τον οποίο το applet έχει κατέβει. Ο περιορισµός αυτός δεν ισχύει για τα applications. Άσκηση 1 Να κατασκευάσετε applet στο οποίο ο χρήστης να εισάγει ένα URL σε ένα πεδίο κειµένου και πατώντας ένα πλήκτρο να εµφανίζει τα περιεχόµενα του URL στον browser. import java.awt.event.*; import java.applet.*; public class Lab11_1a extends JApplet JButton b1; JTextField t1; //υποθέτουµε ότι υπάρχει web server στην διέυθυνση 192.168.0.119 που //περιέχει τις παραπάνω σελίδες. public void init() Container c=getcontentpane(); c.setlayout(new BorderLayout()); b1 =new JButton("Μετάβαση στην διεύθυνση"); t1 =new JTextField("http://www.sun.com"); c.add(b1,borderlayout.center); c.add(t1,borderlayout.north); b1.addactionlistener(new ActionListener() public void actionperformed(actionevent e) URL awebpage= new URL("http://www.sun.com"); AppletContext browser =getappletcontext(); browser.showdocument(awebpage); catch(malformedurlexception ex)
JOptionPane.showMessageDialog(null, "Λάθος διεύθυνση "); ); //τέλος κλάσης Lab11_1a Άσκηση 2 Να κατασκευάσετε application που να εµφανίζει σε ένα JEditorPane σελίδες web οι οποίες θα εναλλάσσονται καθώς ο χρήστης θα πατάει ένα πλήκτρο. import java.awt.event.*; import javax.swing.event.*; public class Lab11_1b extends JFrame JButton b1; JEditorPane ep1; //το ep1 είναι αντικείµενο που επιτρέπει την εµφάνιση στον χώρο του //ιστοσελίδων και αρχείων κειµένου από ένα web server. String []sites="http://192.168.0.119/index.htm", "http://192.168.0.119/photo.htm", "http://192.168.0.119/interest.htm"; //υποθέτουµε ότι υπάρχει web server στην διέυθυνση 192.168.0.119 που //περιέχει τις παραπάνω σελίδες. int sn=0; public Lab11_1b() Container c=getcontentpane(); c.setlayout(new BorderLayout()); b1 =new JButton("Επόµενη διεύθυνση"); c.add(b1,borderlayout.north); b1.addactionlistener(new ActionListener() public void actionperformed(actionevent e) getthepage(sites[sn]); sn++; sn= sn % sites.length; ); ep1=new JEditorPane(); ep1.seteditable(false); ep1.addhyperlinklistener(new HyperlinkListener() public void hyperlinkupdate(hyperlinkevent e) if (e.geteventtype()==hyperlinkevent.eventtype.activated) getthepage(e.geturl().tostring()); ); c.add(new JScrollPane(ep1), BorderLayout.CENTER); setsize(300,400); setvisible(true); private void getthepage(string location)
ep1.setpage(location); JOptionPane.showMessageDialog(null, "Λάθος διεύθυνση για εµφάνιση στο JEditorPane"); Lab11_1b a=new Lab11_1b(); a.setdefaultcloseoperation(jframe.exit_on_close); //τέλος κλάσης Lab11_1b Άσκηση 3 Να κατασκευάσετε console application που να εµφανίζει το domain name και την TCP/IP διεύθυνση του υπολογιστή στον οποίο λειτουργεί. public class Lab11_2 InetAddress x; x=inetaddress.getlocalhost(); System.out.println("domain name: " +x.gethostname()+ " TCP/IP address: " + x.gethostaddress()); catch (UnknownHostException ex) System.err.println("The computer does not have a tcp/ip address"); Stream Sockets Πρόκειται για το ένα άκρο από µια σύνδεση 2 κατευθύνσεων µεταξύ 2 προγραµµάτων που εκτελούνται στο δίκτυο. Η κλάση Socket υλοποιεί την client πλευρά και η κλάση ServerSocket υλοποιεί την server πλευρά της σύνδεσης Η Java παρέχει την δυνατότητα για Sockets Based Communication γεγονός που επιτρέπει στις εφαρµογές να αντιµετωπίζουν την δικτύωση ως streams από δεδοµένα. Η Java παρέχει stream sockets και datagram sockets. Με τα stream sockets µια διεργασία εγκαθιδρύει µια σύνδεση µε µια άλλη διεργασία. Όσο η σύνδεση εξακολουθεί να υπάρχει τα δεδοµένα ανταλλάσσονται µεταξύ των διεργασιών µε συνεχόµενα streams (connection oriented protocol). Το πρωτόκολλο που χρησιµοποιείται για την µετάδοση είναι το TCP (Transmission Control Protocol). Άσκηση 4 (connection oriented streams based transmission) Να κατασκευάσετε 2 εφαρµογές. Μια client εφαρµογή που θα στέλνει ακεραίους σε µια server εφαρµογή η οποία θα τους επεξεργάζεται και θα επιστρέφει µια πραγµατική τιµή στην client εφαρµογή. Όταν το άθροισµα των τιµών που έχει επιστρέψει ο server γίνει µεγαλύτερο από 1000 η επικοινωνία µεταξύ των 2
εφαρµογών να διακόπτεται. Για το παράδειγµα η επεξεργασία που θα γίνεται από τον server θα είναι ο υπολογισµός του αθροίσµατος x+x/2+x/3+ +x/1000 όπου x θα είναι η τιµή που θα στέλνει ο client στον server. Server εφαρµογή public class Lab11_3server ServerSocket server; Socket connection; DataInputStream dis; DataOutputStream dos; public void startserver() // ηµιουργία ενός ServerSocket στην θύρα 2000 για το πολύ 10 //συνδέσεις σε αναµονή. server=new ServerSocket(2000,10); while (true) //επιτρέπει στον server να δεχθεί συνδέσεις connection=server.accept(); System.out.println("connected to TCP/IP address: " + connection.getinetaddress().gethostaddress()); dis=new DataInputStream(connection.getInputStream()); dos=new DataOutputStream(connection.getOutputStream()); boolean f=true; while (f) int x=dis.readint(); System.out.println("Data received from client "+ x); dos.writedouble(processdata(x)); catch (EOFException ex) f=false; dis.close(); dos.close(); connection.close(); catch (SocketException ex) private double processdata(int x) double sum=0.0; for (int i=1;i<=100;i++) sum+=(double)x/i;
return sum; Lab11_3server serv= new Lab11_3server(); serv.startserver(); Client εφαρµογή import java.awt.event.*; public class Lab11_3client extends JFrame Socket connection; DataInputStream dis; DataOutputStream dos; JTextField t1; JButton b1; JLabel l1; double s=0; public Lab11_3client() super("οθόνη πελάτη "); Container c=getcontentpane(); c.setlayout(new FlowLayout()); t1=new JTextField(20); l1=new JLabel(" 0.0"); b1=new JButton("Αποστολή δεδοµένων από τον client"); b1.addactionlistener(new ActionListener() public void actionperformed(actionevent e) int x= Integer.parseInt(t1.getText()); dos.writeint(x); double v= dis.readdouble(); s+=v; System.out.println("Data received from server" + v); l1.settext(string.valueof(s)); if (s>1000) closeconnection(); catch (EOFException ex) System.out.println("End of Data");
); c.add(t1); c.add(b1); c.add(l1); setsize(300,300); setvisible(true); startclient(); public void startclient() //client=new Socket(InetAddress.getLocalHost(),2000); connection=new Socket(InetAddress.getByName("192.168.0.119"),2000); dis=new DataInputStream(client.getInputStream()); dos=new DataOutputStream(client.getOutputStream()); public void closeconnection() dis.close(); dos.close(); connection.close(); Lab11_3client cl= new Lab11_3client(); cl.setdefaultcloseoperation(jframe.exit_on_close); Datagram Sockets Με τα datagram sockets ξεχωριστά πακέτα από πληροφορίες µεταδίδονται. Το πρωτόκολλο που χρησιµοποιείται είναι το UDP (User Datagram Protocol) που είναι connectionless πρωτόκολλο που δεν εγγυάται ότι τα πακέτα φτάνουν µε την σωστή σειρά. Το UDP είναι κατάλληλο για περιπτώσεις που δεν απαιτούν την αξιοπιστία µεταφοράς του TCP. Ένα socket δηµιουργείται µε socket=new DatagramSocket(<αριθµός θύρας>); για τον server και me socket=new DatagramSocket(); για τον client Ένα DatagramPacket για αποστολή δεδοµένων δηµιουργείται ως εξής: sp=new DatagramPacket(<δυαδικά δεδοµένα>, <µήκος δυαδικών δεδοµένων>, <διεύθυνση παραλήπτη>, <θύρα παραλήπτη>); Το DatagramPacket αποστέλλεται socket.send(sp);
Ένα DatagramPacket για λήψη δεδοµένων δηµιουργείται ως εξής: byte data[]=new byte[100]; rp=new DatagramPacket(data,data.length); Το DatagramPacket λαµβάνεται socket.receive(rp); Άσκηση 5 (connectionless transmission with datagrams) Να κατασκευάσετε 2 εφαρµογές µε την µια στον ρόλο του πελάτη που στέλνει δεδοµένα (λεκτικά) στην άλλη που θα είναι στον ρόλο του εξυπηρετητή και θα επιστρέφει στον πελάτη το λεκτικό ανεστραµµένο. Εφαρµογή Εξυπηρετητή public class Lab11_4server extends JFrame private JTextArea ta1; private DatagramPacket sp, rp; private DatagramSocket socket; public Lab11_4server() super("εξυπηρέτης"); Container c=getcontentpane(); ta1=new JTextArea(); c.add(new JScrollPane(ta1), BorderLayout.CENTER); setsize(400,400); setvisible(true); //δηµιουργία του socket µε το οποίο θα στέλνονται και θα λαµβάνονται πακέτα socket=new DatagramSocket(5000); catch (SocketException ex) System.exit(1); //constructor public void waitforpackets() while (true)
byte data[]=new byte[100]; rp=new DatagramPacket(data,data.length); socket.receive(rp); String s=new String(rp.getData(),0,rp.getLength()); ta1.append("\nαπό τον υπολογιστή: " + rp.getaddress()+ "\n εδοµένα: " + s); //αντιστροφή λεκτικού και µετατροπή σε byte array data=new StringBuffer(s).reverse().toString().getBytes(); sp=new DatagramPacket(data, data.length, rp.getaddress(),rp.getport()); socket.send(sp); ta1.setcaretposition(ta1.gettext().length()); // catch(ioexception ex) //while //waitforpackets Lab11_4server a=new Lab11_4server(); a.setdefaultcloseoperation(jframe.exit_on_close); a.waitforpackets(); //main //Lab11_4server Εφαρµογή Πελάτη import java.awt.event.*; public class Lab11_4client extends JFrame private JTextField t1; private JTextArea ta1; private DatagramPacket sp, rp; private DatagramSocket socket; public Lab11_4client() super( "Πελάτης" ); Container container = getcontentpane(); t1 = new JTextField(20); t1.addactionlistener(new ActionListener() public void actionperformed( ActionEvent event )
ta1.append("\nαποστολή πακέτου που περιέχει: " + event.getactioncommand() + "\n" ); String message = event.getactioncommand(); //µετατροπή του µηνύµατος σε πίνακα bytes (data) byte data[] = message.getbytes(); //δηµιουργία του πακέτου προς αποστολή περιέχει πληροφορίες για //τα δεδοµένα, το µήκος τους, τον παραλήπτη και την θύρα sp = new DatagramPacket(data, data.length, InetAddress.getLocalHost(), 5000 ); //αποστολή πακέτου socket.send(sp); ta1.append("το πακέτο στάλθηκε\n" ); ta1.setcaretposition(ta1.gettext().length() ); // actionperformed ); container.add( t1, BorderLayout.NORTH ); ta1 = new JTextArea(); container.add(new JScrollPane(ta1),BorderLayout.CENTER ); setsize(400, 300); setvisible(true); socket = new DatagramSocket(); catch( SocketException ex ) System.exit(1); //constructor public void waitforpackets() while (true) byte data[] = new byte[100]; rp = new DatagramPacket(data, data.length); socket.receive(rp); String s=new String(rp.getData(),0,rp.getLength()); ta1.append("\nαπό τον υπολογιστή: " + rp.getaddress()+ "\n εδοµένα: " + s); ta1.setcaretposition(ta1.gettext().length()); catch( IOException ex) //while // waitforpackets Lab11_4client a = new Lab11_4client(); a.setdefaultcloseoperation(jframe.exit_on_close ); a.waitforpackets(); //main // Lab11_4client