Nada

Föreläsning 4: Nätprogrammering

Internet

När ett program som kör på en dator via Internet skickar ett meddelande till ett annat program på en annan dator är det mycket som händer på vägen med meddelandet. Det ska kodas, krypteras, delas upp i numrerade TCP-paket, packas in i IP-paket, göras om till bitföljder, skickas iväg som ljuspulser i en optisk fiber och sedan packas upp och skalas av skikt för skikt när det når mottagardatorn. Man brukar kalla detta standardiserade förfarande i sju nivåer för protokollstacken.

Datorerna på Internet har adresser av typen 130.237.222.163 där 130 står fö Sverige, 237 för KTH, 222 för Nada och 163 för Henriks dator. Oftare skrivs adressen nada10.nada.kth.se, med namn i stället för nummer. Det är ganska dumt att ordningsföljden då är omvänd! Namnen efter datornamnet kallas domäner och toppdomänen är antingen ett tvåbokstavsland som .se eller en trebokstavskategori som .com.

Serverprogram

En server är ett program som alltid körs och ligger och väntar på att bli kontaktat från något annat program, klienten. För varje domän finns det minst en namnserver (eller domännamnsserver, DNS) som kan översätta namnadresser till numeriska internetadresser. När filtransportprogrammet FTP ska ta kontakt med en annan internetdator anropar den först namnserverns resolver som antingen redan vet IP-adressen eller frågar en annan namnserver.

En server behöver inte ha med internet att göra. Fönsterhanterare är serverprogram som nyttoprogrammen är klienter till. Filservrar lagrar användarens filer på centrala skivminnen osv. Server kallas också en dator som bara kör serverprogram.

Det vanligaste arbetssättet för en server är att den lyssnar på ett visst portnummer. En port är då inte ett fysiskt kontaktdon utan bara ett logiskt nummer för en internetanslutning. Det finns portnummer från 0 upp till 65535 men upp till 1024 är dom reserverade för systemprogram. Här är några exempel.

 Port      Serverprogram
   7           echo 
  13           daytime
  21           ftp
  23           telnet
  25           smtp (e-post)
  53           dns 
  79           finger
  80           http (webben)
4711           psykiatern  (labb 5)
4712           stensaxpåse (labb 3)
Anslutning till en port kallas socket och ett serverprogram tillverkar först en ServerSocket på önskat portnummer. Serversocketobjektets accept-metod ligger och väntar på att en ny klient ska ansluta sej till porten med ett socketobjekt. Då skapar servern ett eget socketobjekt som i fortsättningen sköter kontakten med klientsocketen, allt medan serversocketobjektet ligger och väntar på nya klienter.

Stensaxpåseservern

Den här servern går på datorn shell.e.kth.se för att serva klientprogrammet i labb 3.
import java.net.*                                         ;
import java.io.*                                          ;
import java.util.*                                        ;
public class StenSaxPåseServer                            { 
    public static void main(String[] args)                {
        try                                               {
            ServerSocket sock = new ServerSocket(4712)    ;
            while (true) new Tråd(sock.accept()).start()  ;}
        catch(IOException e) {System.err.println(e);}     ;}} 

class Tråd extends Thread                                 {
    static int antaltrådar=0                              ; 
    BufferedReader in                                     ;
    PrintWriter ut                                        ;
    public Tråd(Socket socket)                            {
        try                                               { 
            in = new BufferedReader( 
            new InputStreamReader(socket.getInputStream()));
            ut= new PrintWriter(socket.getOutputStream()) ;}
        catch(IOException e) {System.err.println(e);}     }
    
    public void run()                                     {
        Random random=new Random()                        ;
        String[] hand={"STEN","SAX","PÅSE"}               ;
        try                                               {
            String namn=in.readLine()                     ;
            System.out.println((++antaltrådar)+": "+namn) ;
            ut.println("Hej, "+namn)                      ;
            ut.flush()                                    ;
            while(true)                                   {
                if(in.readLine()==null) break             ;
                ut.println(hand[random.nextInt(3)])       ;
                ut.flush()                                ;}
            System.out.println("Nu slutade "+namn)        ;
            antaltrådar--                                 ;}
        catch(Exception e) {System.err.println(e);}       ;}}

Många trådar

För att servern ska kunna kommunicera med många klienter samtidigt måste den skapa en självständig tråd för varje ansluten klient. Mer om trådar kommer i nästa föreläsning.
Sidansvarig: <henrik@nada.kth.se>
Senast ändrad 27 februari 2003
Tekniskt stöd: <webmaster@nada.kth.se>