No Slide Title

Download Report

Transcript No Slide Title

Klient och serverprogrammering
Föreläsning 8
Innehåll
Se också Harold kapitel 7-9
samt Tut
• Inledning
• Några enkla exempel
• Pekare till och kort beskrivning
av större exempel
Speciella referenser (som används i marginalen)
• Harold, dvs kursboken ”Java Network Programming”
• Tut, dvs tutorial (~kurs) som finns hos SUN på nätet
http://www.javasoft.com/docs/books/tutorial/networking/index.html
previous
next
Socketar
Inledning
• Texten i boken [Harold] och den tutorial som finns
på Sun [Tut] är ganska vältäckande i sina
beskrivningar av socketer.
– Därför kommer detta dokument endast behandla och
beskriva ett par enkla exempel med socketar.
– Vidare kommer ett lite större exempel som påminner en
del om labbuppgiften att beskrivas
• Exemplet introduceras här men den fullständiga beskrivningen
ges i katalogen
http://www.nada.kth.se/kurser/kth/2D4334/98-99/contents/exempel.html
• Detta exempel kommer också att utföras i RMI och CORBA
previous
next
2
Socketar
Enkelt test
Ett exempel som ansluter sig till “standardservicen” echo (på port 7)
som helt enkelt bara skickar tillbaks den text man skickar till den.
Importera
klasser för io
och nät
import java.io.*;
import java.net.*;
public class EchoClient {
public static void main(String[] args) throws IOException {
Socket echoSocket = null;
PrintWriter out = null;
BufferedReader in = null;
try {
echoSocket = new Socket(”faun.nada.kth.se", 7);
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));}
catch (UnknownHostException e) {
System.err.println("Don't know about host: faun.");
System.exit(1);}
catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to: faun.");
System.exit(1);
}
Skapa klient
kopplad mot en
av NADAs datorer
Samt in- och utström
previous
next
3
Socketar
...
Ström mot
terminalen
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
String userInput;
Så länge som
användaren ger
input skicka
det hela till
socketen, läs
svaret samt eka
det på terminalen
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("echo: " + in.readLine());
}
out.close();
in.close();
stdIn.close();
echoSocket.close();
}
}
previous
next
4
Socketar
En klient som ansluter till en server och hämtar angiven URL
Ett exempel med ett klientprogram som ansluter till angiven URL
och hämtar innehållet i aktuell fil.
Utmatningen sker antingen till given fil eller till terminalen.
import java.io.*;
import java.net.*;
public class HttpClient {
public static void main(String[] args) {
try {
if ((args.length != 1) && (args.length != 2))
throw new IllegalArgumentException("Wrong number of arguments");
Första
argumentet
URL:en
Andra
argumentet
eventuell fil dit
utmatningen skall
ske
previous
OutputStream to_file;
if (args.length == 2) to_file = new FileOutputStream(args[1]);
else to_file = System.out;
next
5
Socketar
...
Dela upp
URL:en på sina
beståndsdelar
Skapa socket
mot angiven värd
och port
URL url = new URL(args[0]);
String protocol = url.getProtocol();
if (!protocol.equals("http"))
throw new IllegalArgumentException("URL must use 'http:' protocol");
String host = url.getHost();
int port = url.getPort();
if (port == -1) port = 80; // om ingen port given använd defaultporten
String filename = url.getFile();
Socket socket = new Socket(host, port);
Skapa in- och
utmatningsström
mar mot servern
InputStream from_server = socket.getInputStream();
PrintWriter to_server =
new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
Skicka förfrågan
till servern mha
GET
to_server.println("GET " + filename);
to_server.flush(); // Se till att det hela skickas på en gång!
previous
next
6
Socketar
...
Skapa buffert
för att läsa det
servern skickar
byte[] buffer = new byte[4096];
int bytes_read;
Så länge som
det finns något
att läsa skriv det
på fil (eller
terminal)
while((bytes_read = from_server.read(buffer)) != -1)
to_file.write(buffer, 0, bytes_read);
Stäng förbindelse
socket.close();
to_file.close();
}
catch (Exception e) {
System.err.println(e);
System.err.println("Usage: java HttpClient <URL> [<filename>]");
}
}
}
previous
next
7
Socketar
En enkel WEB-server som bara ekar frågor som ställs till den
En enkel server som bara ekar frågor som ställs till den.
Kan bla användas för att se hur en fråga från en WEB-läsare ser ut eller hur data
skall skickas tillbaks från en server.
import java.io.*;
import java.net.*;
public class HttpMirror {
public static void main(String args[]) {
try {
int port = Integer.parseInt(args[0]);
Skapa
serversocket på
angiven port
ServerSocket ss = new ServerSocket(port);
for(;;) {
Vänta till klient
ansluter
previous
Argumentet anger den
port som servern skall
köra på
Vi kör om och om igen ända tills servern
termineras (med tex CTRL-C)
Socket client = ss.accept();
next
8
Socketar
...
Skapa in- och
utmatningsström
mar mot klienten
BufferedReader in =
new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter out =
new PrintWriter(new OutputStreamWriter(client.getOutputStream()));
Skicka över
protokollinformation
till klienten
out.println("HTTP/1.0 200 ");
// Version & statuskod
out.println("Content-Type: text/plain"); // typen på data som vi skickar
out.println();
// Slut på huvudet
out.flush();
Läs från klienten
och eka tillbaks
det
String line;
while((line = in.readLine()) != null) {
if (line.length() == 0) break;
out.println(line);
}
}
previous
next
9
Socketar
...
out.close();
in.close();
client.close();
}
}
catch (Exception e) {
System.err.println(e);
System.err.println("Usage: java HttpMirror <port>");
}
}
Kör genom att
1) starta programmet på den lokala datorn
java HttpMirror 4444
2) Öppna klient mot “servern” från vanlig web-läsare
http://localhost:4444
Ge eventuellt argument och se hur detta ter sig
http://localhost:4444/test?arg1?arg2
previous
next
10
Socketar
Meddelande-server baserad på socketar
• Det sista exemplet är lite större och beskrivs på
separat WEB-sida
http://www.nada.kth.se/kurser/kth/2D4334/98-99/contents/exempel.html
• Detta exempel är en delmängd av det
meddelandesystem som skall implementeras i
laboration 6
• Exemplet kommer byggas ut och på efterhand
– Med olika varianter och tillägg
– I olika programspråk
previous
next
11