17.2. Ekstra eksempler

17.2.1. En flertrådet webserver

Herunder har vi lavet en flertrådet webserver (sammenlign med webserveren i Kapitel 16). For at gøre det nemmere at se, hvad der foregår, lader vi hver anmodning vente i 10 sekunder, før den afslutter.

import java.io.*;
import java.net.*;
import java.util.*;

public class Anmodning implements Runnable
{
  private Socket forbindelse;

  Anmodning(Socket forbindelse)
  {
    this.forbindelse = forbindelse;
  }

  public void run()
  {
    try {
      PrintWriter ud = new PrintWriter(forbindelse.getOutputStream());
      BufferedReader ind = new BufferedReader(
        new InputStreamReader(forbindelse.getInputStream()));

      String anmodning = ind.readLine();
      System.out.println("start "+new Date()+" "+anmodning);

      ud.println("HTTP/0.9 200 OK");
      ud.println();
      ud.println("<html><head><title>Svar</title></head>");
      ud.println("<body><h1>Svar</h1>");
      ud.println("Tænker over "+anmodning+"<br>");
      for (int i=0; i<100; i++) 
      {
        ud.print(".<br>");
        ud.flush();
        Thread.sleep(100);
      }
      ud.println("Nu har jeg tænkt færdig!</body></html>");
      ud.flush();
      forbindelse.close();
      System.out.println("slut  "+new Date()+" "+anmodning);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

Når der kommer en anmodning, oprettes et Anmodning-objekt, der snakker med klienten og behandler forespørgslen, og en ny tråd knyttes til anmodningen.

import java.io.*;
import java.net.*;
public class FlertraadetHjemmesidevaert
{
  public static void main(String arg[])
  {
    try {
      ServerSocket værtssokkel = new ServerSocket(8001);

      while (true)
      {
        Socket forbindelse = værtssokkel.accept();
        Anmodning a = new Anmodning(forbindelse);
        new Thread(a).start();
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

Resultatet bliver

start Tue Nov 28 15:37:31 GMT+01:00 2000 GET /xxx.html HTTP/1.0
start Tue Nov 28 15:37:38 GMT+01:00 2000 GET /yyy.html HTTP/1.0
start Tue Nov 28 15:37:42 GMT+01:00 2000 GET /zzz.html HTTP/1.0
slut  Tue Nov 28 15:37:42 GMT+01:00 2000 GET /xxx.html HTTP/1.0
slut  Tue Nov 28 15:37:49 GMT+01:00 2000 GET /yyy.html HTTP/1.0
start Tue Nov 28 15:37:50 GMT+01:00 2000 GET /qqq.html HTTP/1.0
slut  Tue Nov 28 15:37:53 GMT+01:00 2000 GET /zzz.html HTTP/1.0
slut  Tue Nov 28 15:38:01 GMT+01:00 2000 GET /qqq.html HTTP/1.0

Programmet er afprøvet ved i Netscape at åbne adressen http://localhost:8001/xxx.html hhv. yyy zzz og qqq.html. Man ser, at anmodningerne xxx, yyy og zzz bliver behandlet samtidigt.

17.2.2. En flertrådet applet med bolde

Lad os lave en applet med nogle bolde, der hopper rundt. Hver bold kører i sin egen tråd. Når en bold oprettes, får den i konstruktøren overført start-koordinater og et Graphics-objekt, som den husker. Den opretter og starter en tråd, som kører boldens run()-metode.

import java.awt.*;

public class Bold implements Runnable
{
  double x, y, fartx, farty;
  Graphics g;

  public Bold(Graphics g1, int x1, int y1)
  {
    g = g1;
    x = x1;
    y = y1;
    fartx = Math.random();
    farty = Math.random();
    Thread t = new Thread(this);
    t.start();
  }

  public void run()
  {
    for (int tid=0; tid<5000; tid++)
    {
      // Tegn bolden over med hvid på den gamle position
      g.setColor(Color.white);
      g.drawOval((int) x, (int) y, 50, 50);

      // Opdater positionen med farten
      x = x + fartx;
      y = y + farty;

      // Tegn bolden med sort på den nye position
      g.setColor(Color.black);
      g.drawOval((int) x, (int) y, 50, 50);

      // ændr boldens fart lidt nedad
      farty = farty + 0.1;

      // Hvis bolden er uden for det tilladte område skal den
      // rettes hen mod området
      if (x < 0) fartx = Math.abs(fartx);
      if (x > 400) fartx = -Math.abs(fartx);
      if (y < 0) farty = Math.abs(farty);
      if (y > 100) farty = -Math.abs(farty);

      // Vent lidt
      try { Thread.sleep(10); } catch (Exception e) {};
    }
  }
}

Lad os nu lave en applet med nogle bolde:

import java.applet.*;
import java.awt.*;

public class FlertraadetApplet extends Applet
{
  public void init()
  {
    setBackground(Color.white);
    Graphics g = getGraphics();
    new Bold(g,  0, 0);
    new Bold(g, 50,10);
    new Bold(g,100,50);
    new Bold(g,150,90);
  }
}

Figur 17-2. Java