| Linux - Friheden til at programmere i Java: Version 0.7.20040516 - 2020-12-31 | ||
|---|---|---|
| forrige | Kapitel 16. Netværkskommunikation | næste |
For at lave et program, der fungerer som vært (dvs. som andre maskiner/programmer kan forbinde sig til), opretter man et ServerSocket-objekt, der accepterer anmodninger på en bestemt port:
ServerSocket værtssokkel = new ServerSocket(8001);
Nu lytter vi på port 8001. Så er det bare at vente på, at der kommer en anmodning:
Socket forbindelse = værtssokkel.accept();
Kaldet af accept() venter på, at en klient forbinder sig, og når det sker, returnerer kaldet med en forbindelse til klienten i et Socket-objekt.
Nu kan vi arbejde med forbindelsen ligesom før. Ligesom når to mennesker snakker sammen, har det ikke den store betydning, hvem der startede samtalen, når den først er kommet i gang.
I tilfældet med HTTP-protokollen er det defineret, at klienten skal først skal spørge og værten derefter svare, så vi læser først en anmodning
String anmodning = ind.readLine();
System.out.println("Anmodning: "+anmodning);
... og sender derefter et svar, tømmer databufferen og lukker forbindelsen (afslutter samtalen):
ud.println("HTTP/0.9 200 OK");
ud.println();
ud.println("<html><head><title>Svar</title></head>");
ud.println("<body><h1>Kære bruger</h1>");
ud.println("Du har spurgt om "+anmodning+", men der er intet her.");
ud.println("</body></html>");
ud.flush();
forbindelse.close();
Bemærk, at ud.flush() skal ske, før vi lukker soklen, ellers går svaret helt eller delvist tabt; forbindelse-objektet ved ikke, at ud-objektet har nogle data liggende, der ikke er blevet sendt endnu.
Herunder ses det fulde program:
import java.io.*;
import java.net.*;
public class Hjemmesidevaert
{
public static void main(String arg[])
{
try {
ServerSocket værtssokkel = new ServerSocket(8001);
while (true)
{
Socket forb = værtssokkel.accept();
PrintWriter ud = new PrintWriter(forb.getOutputStream());
BufferedReader ind =
new BufferedReader(new InputStreamReader(forb.getInputStream()));
String anmodning = ind.readLine();
System.out.println("Anmodning: "+anmodning);
ud.println("HTTP/0.9 200 OK");
ud.println();
ud.println("<html><head><title>Svar</title></head>");
ud.println("<body><h1>Kære bruger</h1>");
ud.println("Du har spurgt om "+anmodning+", men der er intet her.");
ud.println("</body></html>");
ud.flush();
forb.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Resultatet bliver:
Anmodning: GET / HTTP/0.9 Anmodning: GET / HTTP/1.1 Anmodning: GET /xxx.html HTTP/1.1
Du kan afprøve programmet ved at ændre på HentHjemmeside.java til at spørge 'localhost' på port 8001 eller ved i Netscape at åbne adressen http://localhost:8001/xxx.html