Ανάπτυξη εφαρμογών 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:

Αρχιτεκτονική του παγκόσμιου ιστού

Προσδιορισμός στοιχείων με 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 /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

Κατηγορίες ενεργού περιεχομένου

Ενεργό περιεχόμενο στον πελάτη

Επικοινωνία πελάτη εξυπηρετητή

Τρόποι υλοποίησης ενεργού περιεχομένου στον εξυπηρετητή

Τεχνολογίες υλοποίησης ενεργού περιεχομένου στον εξυπηρετητή

Η τεχνολογία CGI

Υλοποίηση

Προβλήματα

Η τεχνολογία Fast CGI

Υλοποίηση στον εξυπηρετητή

Προβλήματα

Παράδειγμα

#!/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

Υλοποίηση

Πλεονεκτήματα

Υποστήριξη

Παράδειγμα

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

Παράδειγμα (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 εξυπηρετητή

Υλοποιήσεις

Μεταφορά δεδομένων

Μεταφορά δεδομένων από τον πελάτη στον εξυπηρετητή μέσω HTTP μπορεί να γίνει με τους παρακάτω τρόπους:

Υλοποίηση συνεδρίας

Παραδείγματα 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

Απλοί κανόνες

Βιβλιογραφία