Ανάπτυξη εφαρμογών Internet
Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr
Η δομή του Internet
Εφαρμογή
Το επίπεδο εφαρμογής στο Internet καλύπτει τα επίπεδα
εφαρμογής και παρουσίασης του OSI.
Τα πιο συχνά πρωτόκολλα που χρησιμοποιούνται από τους
χρήστες είναι:
-   HTTP/HTML   
- πρόσβαση στο Web
-   FTP    
- μεταφορά αρχείων
-   SMTP   
- μεταφορά email
-   POP/IMAP   
- ανάγνωση email
-   Telnet 
- χρήση από απόσταση
Μια σειρά από πρωτόκολλα στο επίπεδο αυτό υποστηρίζουν τη λειτουργία και
τη διαχείριση του δικτύου:
-  DNS 
-  Κατανεμημένος κατάλογος ονομάτων
-  SNMP 
-  Διαχείριση από απόσταση
-  BOOTP 
-  Αρχικό φόρτωμα κώδικα
-  RARP 
-  Αντίστροφη μετατροπή διευθύνσεων
Μεταφορά
Στο επίπεδο της μεταφοράς χρησιμοποιούνται δύο πρωτόκολλα:
-  TCP 
-  Transmission Control Protocol
-  UDP 
-  User Datagram Protoco
Δίκτυο
Στο επίπεδο του δικτύου το Internet Protocol (IP) μαζί με το  
Internet Control Message Protocol εξασφαλίζουν τη μεταφορά δεδομένων
από τον αποστολέα στον παραλήπτη.
Το παρακάτω σχήμα παριστάνει τη σχέση ανάμεσα στα διάφορα πρωτόκολλα
του internet:
 
Αρχιτεκτονική του παγκόσμιου ιστού
-  Ο παγκόσμιος ιστός (world wide web)
είναι υλοποιημένες σύμφωνα με το μοντέλο
πελάτη-υπηρέτη (client-server).
-  Υπηρέτες ακούν για εντολές του πρωτοκόλλου HTTP
στη θύρα TCP 80 και απαντούν ανάλογα με το περιεχόμενο της εντολής.
-  Οι απαντήσεις είναι συνήθως υπερκείμενο (hypertext)
δομημένο σύμφωνα με το πρότυπο HTML.
-  Παραπομπές σε άλλες σελίδες ή περιεχόμενο γίνονται με την
τυποποιημένη χρήση των Uniform Resource Locators (URL).
-  Τόσο ο πελάτης, όσο και ο υπηρέτης μπορούν να προσαρμόσουν
δυναμικά το περιεχόμενο μιας σελίδας.
Προσδιορισμός στοιχείων με URI
Ο προσδιορισμός στοιχείων στο πρωτόκολλο HTTP
γίνεται με τη χρήση των Uniform Resource Identifiers.
Η χρήση τους επιτρέπει τον προσδιορισμό άλλων σελίδων τοπικά, σε άλλα
μηχανήματα, καθώς και ερωτήσεων:
    http://www.spinellis.gr
http://www.altavista.com/cgi-bin/query?pg=q&text=yes&q=link%3akerkis%2emath%2eaegean%2egr%2f%7edspin+%2dhost%3akerkis%2emath%2eaegean%2egr&stq=10&c9k
Το πρωτόκολλο HTTP
Το πρωτόκολλο HTTP υποστηρίζει τις παρακάτω μεθόδους επικοινωνίας:
-  GET
-  HEAD
-  POST
-  PUT
-  DELETE
-  TRACE
Παράδειγμα:
GET /pub/WWW/TheProject.html HTTP/1.1
Host: www.w3.org
Περιγραφή σελίδων με HTML
H HTML είναι μια εφαρμογή της SGML για την περιγραφή σελίδων στο Web.
Περιοχές του κειμένου σημειώνονται με ετικέτες (tags).
Κάθε ετικέτα περιλαμβάνει το όνομά της και παραμέτρους.
Οι ετικέτες γράφονται ως εξής:
<όνομα ετικέτας παράμετροι>
Μια περιοχή του κειμένου μπορεί να σημειωθεί ως εξής:
<ετικέτα>
περιοχή που σημειώνεται
</ετικέτα>
Βασικές  ετικέτες που υποστηρίζει η HTML είναι οι παρακάτω:
-  HTML 
-  περιγραφή ολόκληρης σελίδας
-  HEAD 
-  επικεφαλίδα της σελίδας
-  BODY 
-  κείμενο της σελίδας
-  H1-H6 
-  επικεφαλίδες του κειμένου
-  P 
-  αλλαγή παραγράφου
-  UL 
-  λίστα με τελείες
-  OL 
-  αριθμημένη λίστας
-  LI 
-  στοιχείο λίστας
-  BR 
-  αλλαγή γραμμής
-  HR 
-  οριζόντια γραμμή
-  IMG 
-  εικόνα
-  A 
-  (anchor) σημείο πρόσβασης από ή σε υπερκείμενο
-  PRE 
-  προστοιχειοθετημένο κείμενο
-  DL, DT, DD 
-  λίστα περιγραφών, περιγραφές
-  I 
-  πλάγιοι χαρακτήρες
-  B 
-  έντονοι χαρακτήρες
Παράδειγμα σελίδας:
<!doctype html public "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<TITLE>Τίτλος της σελίδας</title>
<META NAME="GENERATOR" CONTENT="thread.pl">
<META NAME="AUTHOR" CONTENT="Diomidis Spinellis">
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=ISO-8859-7">
<LINK REV="made" HREF="mailto:dds@aueb.gr"> 
<LINK REL="ToC" HREF=".././web/index.htm">
<LINK REV="Subdocument" HREF=".././web/index.htm">
<LINK REL="previous" HREF=".././web/http.htm">
<LINK REL="next" HREF=".././web/cgi.htm">
</HEAD>
<BODY>
<H1>Επικεφαλίδα πρώτου επιπέδου</H1><HR>
Κείμενο που περιέχει ένα σημείο κατάληξης υπερκειμένου
<a name="G42"> (<em>με έντονο κείμενο</em>)</a> 
και μια λίστα:
<ul>
<li> στοιχείο 1
<li> στοιχείο 2
</ul>
<p>
Νέα παράγραφος με ένωση υπερκειμένου στο
<A HREF="http://www.aueb.gr">Οικονομικό Πανεπιστήμιο</A>
<HR>
</BODY>
</HTML>
Αυτή θα εμφανιστεί ως εξής:
Επικεφαλίδα πρώτου επιπέδου
Κείμενο που περιέχει ένα σημείο κατάληξης υπερκειμένου
 (με έντονο κείμενο) 
και μια λίστα:
Νέα παράγραφος με ένωση υπερκειμένου στο
Οικονομικό Πανεπιστήμιο (http://www.aueb.gr)
Χαρακτηριστικά της Java
 
Κατηγορίες ενεργού περιεχομένου
-  Ενεργό περιεχόμενο στον πελάτη
-  Ενεργό περιεχόμενο στον εξυπηρετητή
-  Υβριδικό μοντέλο
Ενεργό περιεχόμενο στον πελάτη
-  Animated GIF files, sound files, movies, ALT tags
-  Javascript και DOM
-  Macromedia Flash
-  Java applets
-  Active-X
Επικοινωνία πελάτη εξυπηρετητή
-  Εφαρμογές που ακολουθούν το μοντέλο του Web
-  Εφαρμογές που χρησιμοποιούν πρωτόκολλο HTTP
-  Εφαρμογές που χρησιμοποιούν το πρωτόκολλο TCP/IP
Τρόποι υλοποίησης ενεργού περιεχομένου στον εξυπηρετητή
-  Εκτέλεση ανά αίτηση
-  Δεξαμενή με διεργασίες ή νήματα
-  Χρήση προτύπων σελίδων
-  Επεκτάσεις του Web Server
Τεχνολογίες υλοποίησης ενεργού περιεχομένου στον εξυπηρετητή
-  Εκτέλεση ανά αίτηση: CGI
-  Δεξαμενή με διεργασίες ή νήματα: 
	
-  Χρήση προτύπων σελίδων: 
	
	-  Microsoft Active Server Pages (ASP), 
	
-  Sun Java Server Pages (JSP)
	
-  Hypertext Pre-Processor (PHP)
	
 
-  Επεκτάσεις του Web Server
	
	-  NSAPI (Netscape FastTrack)
	
-  ISAPI (Microsoft IIS)
	
-  Apache extension API (mod_*)
	
 
Η τεχνολογία CGI
Υλοποίηση
Προβλήματα
-  Απόδοση
-  Ανίχνευση συνεδρίας
-  Στενή σύνδεση της επεξεργασίας με την εμφάνιση
Η τεχνολογία Fast CGI
Υλοποίηση στον εξυπηρετητή
-  Μοναδική εκκίνηση
-  Mini application server
-  FIFO queue
Προβλήματα
-  Εργαλεία ανάπτυξης
-  Ειδικές βιβλιοθήκες για ανίχνευση συνεδρίας (session afinity)
Παράδειγμα
#!/usr/bin/perl
#load the necessary modules
use Pg;
use CGI qw/:standard/;
use CGI::Fast;
#connect to the database
$conn = Pg::connectdb("dbname=comments host=193.250.160.3\
                             user=george password=george");
die $conn->errorMessage unless PGRES_CONNECTION_OK eq $conn->status;
#Create a new FastCGI object
#This is the main program loop
while(new CGI::Fast){
   $name=param("name");
   $email=param("email");
   $comments=param("comments");
   #insert the record to the database
   $query="insert into comments values('".$name."','".$email.\
                                                "','".$comments."')";
   $result=$conn->exec($query);
   die $conn->errorMessage unless PGRES_COMMAND_OK eq $result->resultStatus;
   print "All done OK";
}
#close the connection
$conn->requestCancel; 
Η τεχνολογία Servlets
Υλοποίηση
-  Java
-  Ένα νήμα ανά αίτηση
-  Servlet container (JVM + κλάσεις υποστήριξης)
Πλεονεκτήματα
-  Κάλυψη συνεδρίας μέσω καθολικών αντικειμένων
-  Πρόσβαση σε όλες τις βιβλιοθήκες της Java (JDBC, XML, XSLT, cookies)
-  Java Server Pages - Jasper JSP pre-compiler
-  Μεταφερσιμότητα
Υποστήριξη
-  Tomcat (apache)
-  iPlanet
-  WebSphere
Παράδειγμα
import java.io.*;
import java.lang.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
 
 
public class comments extends HttpServlet {
 
    Connection con=null;
    //This is executed only once during servlet loading
    public void init(ServletConfig config) throws ServletException{
        super.init(config);
        try {
            Class.forName("org.postgresql.Driver");
            con=DriverManager.getConnection("jdbc:postgresql:comments",
                                                    "george","george");
        }
        catch (ClassNotFoundException e) {
            System.out.println("No such class:"+e.getMessage());
        }
        catch (SQLException s) {
            System.out.println("Connection error"+s.getMessage());
        }
    }
    //The function that handles POST requests
    public void doPost (HttpServletRequest req, HttpServletResponse res)
    throws ServletException,IOException{
        //Get input parameters
        String name=req.getParameter("name");
        String email=req.getParameter("email");
        String comments=req.getParameter("comments");
        PrintWriter out=res.getWriter();
        res.setContentType("text/html");
        //Insert the record into the database
        try {
            Statement stmt=con.createStatement();
            stmt.execute("INSERT INTO comments values('"+name+"','"+email+
                                                    "','"+comments+"')");
            out.println("All done ok");
        }
        catch (SQLException s) {
            out.println("Connection error"+s.getMessage());
        }
 
        finally {
            out.println("</BODY></HTML>");
        }
 
    }
    //GET and POST requests are handled in the same way
    public void doGet (HttpServletRequest req, HttpServletResponse res)
    throws ServletException,IOException{
        doPost (req,res);
    }
    //Only called when the servlet is unloaded
    public void destroy() {
        try {
            con.close();
        }
        catch (SQLException s) {
            System.out.println("Connection error"+s.getMessage());
        }
 
    }
Η τεχνολογία PHP
Παρόμοια αυστήματα
Χαρακτηριστικά PHP
-  Σελίδες που περιέχουν HTML και κώδικα PHP
-  Η γλώσσα περιέχει στοιχεία από την Perl και τη C
-  Πλούσιες βιβλιοθήκες
	
	-  Πρόσβαση σε ΒΔ
	
-  Γραφικά
	
-  Ανίχνευση συνεδρίας
	
-  Μεταφορά αρχείων
	
-  Δημιουργία PDF
	
-  Email
	
 
-  Εκτέλεση ώς Apache extension (mod_php) ή CGI
Παράδειγμα (PHP 4)
<?php
$db = pg_pconnect ("host=localhost dbname=comments user=george password=george");
$update="insert into comments(name,email,comment) values ('$name','$email','$comments')";
echo $name,$email,$comments;
pg_exec ($db,$update);
?>
Παράδειγμα (PHP 5)
<?php
        if(isset($HTTP_POST_VARS['name']) $name=$HTTP_POST_VARS['name'];
        if(isset($HTTP_POST_VARS['email']) $name=$HTTP_POST_VARS['email'];
        if(isset($HTTP_POST_VARS['comments']) $name=$HTTP_POST_VARS['comments'];
        $db = pg_pconnect ("host=localhost dbname=comments user=george password=george")
                or die("Couldn't Connect to the database") ;
        $update = "insert into comments(name,email,comment) values ('$name','$email','$comments')";
        echo $name,$email,$comments;
        if (!pg_exec($db,$update))
                echo "There was a problem with the sql statement" ;
        else
                echo "SQL Excecuted Successfully" ;
?>
API εξυπηρετητή
Υλοποιήσεις
-  NSAPI (Netscape)
-  ISAPI (Microsoft)
-  Apache API (apache)
Μεταφορά δεδομένων
Μεταφορά δεδομένων από τον πελάτη στον εξυπηρετητή μέσω HTTP μπορεί να γίνει με
τους παρακάτω τρόπους:
-  URL 
http://www.amazon.com/exec/obidos/shopping-basket/ref=top_nav_sb_gateway/103-2141875-9969416)
 
-  POST
POST http://www.amazon.com/exec/obidos/search-handle-form/103-2141875-9969416 HTTP/1.0
...
url=index%3Daps&field-keywords=java+enterprise&explorer-type=gift&Go.x=10&Go.y=10
 
-  Cookie
GET http://www.amazon.com
...
Cookie: ubid-main=430-7602259-8325423; x-main=hQFiIxHUFj8mCscT@Yb5Z7xsVsOFQjBf;session-id=103-2141875-9969416; session-id-time=1038902400; obidos_path_continue-shopping=continue-shopping-url=/subst/home/home.html/103-2141875-9969416&continue-shopping-post-data=&continue-shopping-description=generic.gateway.default
 
Υλοποίηση συνεδρίας
-  Αποθήκευση όλων των πληροφοριών στο URL
-  Αποθήκευση κωδικού συνεδρίας στο URL
-  Αποθήκευση όλων των πληροφοριών σε cookie
-  Αποθήκευση κωδικού συνεδρίας σε cookie
Παραδείγματα URL:
http://www.driveme.gr/Athens/AthensMap.ASP?wcu=$cmd=2$id=4_2000_11_09_08_00_20_296
http://www.perseus.tufts.edu/cgi-bin/perscoll?collection=Perseus:collection:Greco-Roman
http://terraserver.microsoft.com/GetPageByXY.asp?XId=9782&YId=12293&SrcId=2&ImgDate=05/17/1992&ImgSize=2&DSize=0
Παραδείγματα cookies:
bbs.cordis.lu	FALSE	/	FALSE	2137621534	CFID	47215
bbs.cordis.lu	FALSE	/	FALSE	2137621534	CFTOKEN	18919068
.harvard.edu	TRUE	/	FALSE	2051222305	SITESERVER	ID=7f29e95efe695b0ab41c161acdfb0163
search.support.microsoft.com	FALSE	/	FALSE	1019403742	AnswerWiz	1=serial+mouse+detection&Count=1
search.support.microsoft.com	FALSE	/	FALSE	1019403742	Params	S=F&VR=http%3A%2F%2Fsupport%2Emicrosoft%2Ecom%2Fsupport%3Bhttp%3A%2F%2Fsupport%2Emicrosoft%2Ecom%2Fservicedesks%2Fwebcasts%3Bhttp%3A%2F%2Fsupport%2Emicrosoft%2Ecom%2Fhighlights&KT=ALL&FR=0&HSL=0&LN=EN%2DUS&FSL=0&TSL=0&A=T&SD=GN&SPR=W95&PSL=0&LQ=serial+mouse+detection&T=B&T1=7d&DU=C
search.support.microsoft.com	FALSE	/	FALSE	1019403742	Global	LN=EN%2DUS
Απλοί κανόνες
-  Κράτα τα συχνά χρησιμοποιούμενα δεδομένα σε μέσα γρήγορης πρόσβασης
-  Κράτα τα δεδομένα κοντά στον τόπο χρήσης τους
-  Κράτα τοπικά αντίγραφα των δεδομένων όπου είναι δυνατό
-  Μην αφήνεις να δημιουργούνται σημεία συνωστισμού
-  Ελαχιστοποίησε την ανάγκη για καθολική γνώση της κατάστασης του συστήματος
-  Κράτα συγγενή δεδομένα στον ίδιο τόπο
-  Εξέτασε τη δυνατότητα χρήσης εξειδικευμένων εξυπηρετητών
-  Χρησιμοποίησε στην κατάλληλη για τις ανάγκες τεχνολογία
-  Χρησιμοποίησε παράλληλες τεχνικές επεξεργασίας
-  Εκμεταλλεύσου τεχνικές συμπίεσης
-  Σχεδίασε το σύστημα με την αποτυχία στο νου
-  Ελαχιστοποίησε το χρόνο απόκρισης
-  Σχεδίασε από την αρχή την ασφάλεια του συστήματος
Βιβλιογραφία
- The
  perl-apache intergration project.
Available online http://perl.apache.org.
- Bouchaib Bahli and
  Dany Di Tullio.
Web
  engineering: An assessment of empirical research.
Communications of AIS, 12(14), 2003.
- T. Berners-Lee and D. Connolly.
RFC 1866: Hypertext Markup
  Language — 2.0, November 1995.
- T. Berners-Lee,
  L. Masinter, and M. McCahill.
RFC 1738: Uniform Resource
  Locators (URL), December 1994.
- S.B. Subrhamanya B.M. Subraya.
Object driven performance testing of web applications.
In First Asia-Pacific conference on Quality Software. IEEE,
  2000.
- R. Braden.
RFC 1122: Requirements for
  Internet hosts — communication layers, October 1989.
See also STD3 [STD0003].
- R. Braden.
RFC 1123: Requirements for
  Internet hosts — application and support, October 1989.
See also STD3 [STD0003].
- Microsoft Corporation.
The component object model specification.
Technical report, Microsoft Corporation, Redmond, WA, USA, October 1995.
- R. Fielding,
  J. Gettys, J. Mogul, H. Frystyk, T. Berners-Lee, et al.
RFC 2068: Hypertext transfer
  protocol — HTTP/1.1, January 1997.
- Piero Fraternali.
Tools and approaches for developing data-intensive web applications: A survey.
ACM Computing Surveys, 31(9):227–263, September 1999.
- Giorgos Gousios
  and Diomidis Spinellis.
A comparison of portable dynamic web content technologies for the apache
  web server.
In Proceedings of the 3rd International System Administration and
  Networking Conference SANE 2002, pages 103–119, Maastricht, The
  Netherlands, May 2002.
Best refereed paper award.
- Stefanos
  Gritzalis and Diomidis Spinellis.
Addressing threats and security issues in World Wide Web
  technology.
In Proceedings CMS '97 3rd IFIP TC6/TC11 International joint working
  Conference on Communications and Multimedia Security, pages 33–46,
  Athens, Greece, September 1997. IFIP, Chapman & Hall.
- Elisabeth
  Hendrickson and Martin Fowler.
The software engineering of internet software.
IEEE Software, 19(2):23–24, March/April 2002.
- Arun Ivengar, Jim
  Challerger, and Paul Dantzing.
High-performance web design techniques.
IEEE Internet Computing, March-April 2000.
- The
  jakarta project.
Available online http://jakarta.apache.org.
- K. N. King.
Java
  Programming: from the Beginning, pages 1–38.
W. W. Norton & Company, New York, NY, USA, 2000.
- Evangelia Kopanaki,
  Vangelis Karkaletsis, Constantine D. Spyropoulos, Nikos Avradinis, Nikos
  Fakotakis, Theodore Kalamboukis, Basilis Kladis, Yannis Lazarou, Themis
  Panayiotopoulos, and Diomidis Spinellis.
MITOS: An integrated web-based system for information management (    http://www.spinellis.gr/pubs/conf/2001-EPY-Mitos/html/mitos.html).
In 8th Panhellenic Informatics Conference, Nicosia, Cyprus,
  November 2001. Greek Computer Society.
- E. Krol.
RFC 1118: Hitchhikers guide to
  the Internet, September 1989.
- Mike Morrison, Joline
  Morrison, and Anthony Keyes.
Integrating web sites and databases.
Communications of the ACM, 45(9):81–86, September 2002.
- Object
  Management Group, Inc.
The common object request broker: Architecture and specification, July 1996.
Revision 2.0 (Updated).
- J. Postel.
RFC 768: User Datagram
  Protocol, August 1980.
See also STD6 [STD0006].
- J. Postel.
RFC 774: Internet protocol
  handbook: Table of contents, October 1980.
Obsoletes RFC0766 [RFC0766].
- J. Postel.
RFC 791: Internet
  protocol, September 1981.
Obsoletes RFC0760 [RFC0760].
- J. Postel.
RFC 792: Internet control
  message protocol, September 1981.
Obsoletes RFC0777 [RFC0777]. See also STD5 [STD0005].
- J. Postel.
RFC 793: Transmission Control
  Protocol, September 1981.
See also STD7 [STD0007]. Updates RFC0761 [RFC0761].
- Konstantinos Raptis,
  Diomidis Spinellis, and Sokratis Katsikas.
Multi-technology distributed objects and their integration (    http://www.spinellis.gr/pubs/jrnl/2001-CSI-Components/html/imtd.html).
Computer Standards & Interfaces, 23:157–168, July 2001.
- Jesse Reisman.
Web site design: Less
  is more.
IT Professional, 1(5):63–64, September/October 1999.
- J. Siegel.
A preview of CORBA 3.
Computer, 32(5):114–116, May 1999.
- Shikharesh Majumdar
  Sucheta Nandipalli.
Techniques for achieving high performance web servers.
In International Conference for Parallel Processing. IEEE, 2000.
- Sun
  Microsystems Inc.
Java remote
  method invocation specification.
Available online http://java.sun.com/docs/guide/rmi/spec/rmiTOC.html/ (February
  2002), December 1999.
Revision 1.7, Java 2 SDK, Standard Edition, v1.3.0.
- Jason Hunter with
  William Crawford.
Java Servlet Programming.
O' Reilly, 2001.