^ Linux - Friheden til at programmere i Java: Version 0.7.20040516 - 2020-12-31 ^|
| [[java:java-traade|forrige]] | Kapitel 17. Flertrådet programmering | [[java:java-traade-opgaver|næste]] |
----
==== 17.2. Ekstra eksempler ====
=== 17.2.1. En flertrådet webserver ===
Herunder har vi lavet en flertrådet webserver (sammenlign med webserveren i[[java:java-net|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("Svar");
ud.println("Svar
");
ud.println("Tænker over "+anmodning+"
");
for (int i=0; i<100; i++)
{
ud.print(".
");
ud.flush();
Thread.sleep(100);
}
ud.println("Nu har jeg tænkt færdig!");
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**
{linuxbog:java:Nordfalk1815465.png}
----
| [[java:java-traade|forrige]] | [[java:index|hjem]] | [[java:java-traade-opgaver|næste]] |
| Flertrådet programmering | [[java:java-traade|op]] | Opgaver |