Innehåll. Socketar. Klient och serverprogrammering: Socketar Föreläsning 9. Klienter och servrar (som sagts tidigare ) Varför socketar

Relevanta dokument
Innehåll Appletar i Java

Internetprogrammering En kort Introduktion

Björn Eiderbäck Kort om grundläggande nätverkskoncept Internet Socketar

Hämta data mha URLer Föreläsning 2b. Innehåll Klassen URL

Tung bakgrundsaktivitet t.ex. Aktiva objekt t.ex. Animering, simulering. DD2385 Programutvecklingsteknik Några bilder till föreläsning 9 6/5 2013

Javas Exceptions. DD2385 Programutvecklingsteknik Fler bilder till föreläsning 7 23/ Kort om Javas Exceptions Trådar i Java

Surfning. Webbklienter och webbservrar. Specialskrivna webbservrar. Kommunikation med sockets

Tentamen Nätverksprogrammering Lösningsförslag

10 Kommunikation i Java

Språkkonventioner och redigering av tal.

Att skriva till och läsa från terminalfönstret

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Fakulteten för ekonomi, kommunikation och IT. Corba. Datum: Mathias Andersson

Objektorienterad Programkonstruktion. Föreläsning 11 6 dec 2016

Tentamen Nätverksprogrammering Lösningsförslag

Översikt. Skriva och läsa data. Kontrollflöde. Två sorters loopar. For-loop. For-loop

Tentamensskrivning Nätverksprogrammering (EDA095 - FED) , kl 8-13

F5 Meddelandesändning med TCP

Föreläsning 5 Meddelandesändning med TCP

Föreläsnings 9 - Exceptions, I/O

Objektorienterad Programkonstruktion. Föreläsning 10 7 dec 2015

Undantagshantering. Fördjupad Java. Fel. Undantag. Fånga Undantag. Grupper av Undantag

Undantagshantering. Fördjupad Java. Undantag. Fel. Grupper av Undantag. Fånga Undantag

Lösningar för tenta 2 DAT043,

Fördjupad Java. Undantagshantering. Fel

Parsing med Recursive Descent, Avbildningsklasser. Syntaxdiagram. Syntaxdiagram och kodning expression. Betrakta följande uttryck

JAVAUTVECKLING LEKTION 7

Datakommunikation och Internet

Föreläsning 14. Filhantering

Tentamen Nätverksprogrammering Lösningsförslag

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Föreläsning 5 Meddelandesändning med TCP

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Tentamen Nätverksprogrammering Lösningsförslag

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Undantag. Engelska: exceptions. Skansholm: exceptionella händelser

F2 Java I/O - strömmar Meddelandesändning med TCP

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Tentamen Nätverksprogrammering Lösningsförslag

Föreläsning 11 Aktiva objekt och trådar, strömmar, kommunikation DAT043,

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

2I1073 Lektion 2. Lektion 2a. Lektion 2a. Servlets, säkerhet, och filhantering. import java.io.*; import javax.servlet.*; import javax.servlet.http.

Input. Programmering. Andra källor

Objektorienterad programmering i Java

Tentamen Nätverksprogrammering Lösningsförslag

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

Tentamen Nätverksprogrammering Lösningsförslag

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Föreläsning 3. Stack

DI-institutionen Sid 1 av 5 Hans-Edy Mårtensson Sten Sundin Micael Karlsson

Objektorienterad Programmering (TDDC77)

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

//Använd main som ett "handtag" för att hålla ihop programmet. //Själva programmet finns i övriga klasser.

F2 Java I/O - strömmar Meddelandesändning med TCP EDA095 Nätverksprogrammering

Tentamen ITK:P2. Inga hjälpmedel tillåtna förutom penna och papper. Skriv tydligt och texta gärna. 14 st frågor, 70 poäng.

Recitation 4. 2-D arrays. Exceptions

Nätverk grunder Föreläsning 1: 1: Introduktion till Internet

Java och nätverk Läsanvisningar Skansholm (med Swing) kapitel 18 Budd kapitel 22

F4. programmeringsteknik och Matlab

Examination i. PROGRAMMERINGSTEKNIK F1/TM1 TIN212 (Dugga) Dag: Onsdag Datum: Tid: (OBS 3 tim) Rum: V

Tentamen. Lösningsförslag

Obligatorisk uppgift: Numerisk kalkylator

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Obligatorisk uppgift: Numerisk kalkylator

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 5

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

Tentamen Programmeringsteknik II för STS Skrivtid: Inga hjälpmedel.

Tentamen Nätverksprogrammering Lösningsförslag

Kapitel 6. Hakparenteser fšr att ange index MŒnga všrden av samma typ

Socket-programmering. Programmering för distribution. Klient/server ansatsen. Klient/server ansatsen TCP/IP protokollgrafen Java-programering

Felhantering. Andra brott mot språkets regler. Man kan också i programmet bryta mot ett antal olika regler som gäller. Exempelvis:

DAT043 Objektorienterad Programmering

l uppgiftsformulering l algoritmkonstruktion l verifikation l kodning l testning och avlusning l validering l dokumentering l underhœll Kapitel 2

Kort repetition. Programmeringsteknik för Bio1 och I1. Vad ska vi lära oss idag? Ett exempel

Lösningsförslag till tentamen

OOP Objekt-orienterad programmering

Objektorienterad programutveckling, fk

Concurrency Saker händer samtidigt. Process En instans av ett program

Mer källkod. Styrstrukturer Val Slingor Operatorer Källkodsexempel med minne. Erik Forslin. Rum 1445, plan 4 på Nada

2203$( Föreläsning ii - Mer om Java bla this och konstruktorer. Exempel: lampa

Reguljära uttryck. Reguljära uttryck. Nu kommer en siffra78 och en till SIFFRA(78) men utan 7kstuga SIFFRA(89)

Laborationer, moment 4 5

DEL 2 - Praktiska programmeringsuppgifter

Lösningsförslag till tentamen FYTA11 Javaprogrammering

Föreläsning 3. Stack

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

List.java. List.java. Printed by Tom Smedsaas

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Laborationer, moment 4 5

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Föreläsning 7. DD2390 Internetprogrammering 6 hp

Föreläsning 1 Nätverk och strömmar

F1 Nätverk och strömmar

Datakommunika,on på Internet

Transkript:

previous Klient och serverprogrammering: Föreläsning 9 Innehåll Fördjupning se tex Harold, Hall Inledning och/eller Tut Några enkla exempel Pekare till och kort beskrivning av större exempel Speciella referenser Harold, dvs boken Java Network Programming Hall, "CORE Web Programming Budd, Understanding Object-Oriented Programming with Java, 2ed år 2000 Tut, dvs tutorial (~kurs) som finns hos SUN på nätet http://www.javasoft.com/docs/books/tutorial/networking/index.html Fler (och större) exempel i katalogen http://www.nada.kth.se/kurser/kth/2d4334/00-01/contents/exempel.html next Definition: En socket är en ändpunkt för en tvåvägskommunikation mellan två program som körs i nätverket. En socket är bunden till ett portnummer så att underliggande lager kan identifiera vart data skall skickas. finns av två typer Serversocketar som väntar på att klienter skall ansluta sig Klientsocketar som ansluter till servrar I Java representeras dessa av klasserna ServerSocket och Socket previous next 3 Klienter och servrar (som sagts tidigare ) Dom flesta moderna nätverksprogram baseras på en klient-server-modell Varför socketar Ger oss möjlighet att på ett smidigt och uniformt sätt kommunicera mellan maskiner av olika typer En server är ett program som erbjuder tjänster En klient är ett program som frågar en server om tjänster Möjliggör programspråksoberoende kommunikation Enkelt att få program som är skrivna i olika programspråk att kommunicera En server väntar på att klienter skall ansluta En klient initierar en "konversation" previous next 2 previous next 4 Björn Eiderbäck 1999-2000 1 Björn Eiderbäck 1999-2000 2

typiskt klientprogram 1. Skapa en socket. 2. Öppna in- och utström mot socketen. 3. Läs från och skriv på socketen. 4. Stäng strömmarna. 5. Stäng socketen. typiskt serverprogram 1. Skapa en server-socket. 2. Lyssna efter anslutande klienter 3. Skapa socket mot varje anslutande klient 4. Öppna in- och utström mot klientsocketerna. 5. Läs från och skriv på klientsocketen. 6. Stäng strömmarna. 7. Stäng klientsocketerna. 8. Stäng serversocketen. previous next 5 previous next 7 1. Socket socket = new Socket(HOSTNAME, PORT). 2. out = new PrintWriter(socket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader( socket.getinputstream())); 3. while ((userinput = stdin.readline())!= null) {out.println(userinput); System.out.println("från servern:" + in.readline());. 4. in.close(); out.close();. 5. socket.close(). Exempel enkel server/klient app: servern /* Deklarera en serversocket: theserver (som lyssnar efter klienter), klientsocket: theconnection (som tar hand om ansluten klient), utdataström: p (för att skicka information till klienten) */ ServerSocket theserver; Socket theconnection; PrintWriter p; //Öppna serversocket på PORTNUMMER theserver = new ServerSocket(PORTNUMMER); while (VILLKOR) {//Så länge som VILLKOR är sant fortsätter vi theconnection = theserver.accept(); //Vänta till klient ansluter p = new PrintWriter(theConnection.getOutputStream()); p.println(information); //Skicka INFORMATION till klienten theconnection.close(); // avbryt förbindelsen med klienten theserver.close(); //Stäng serversocketen previous next 6 previous next 8 Björn Eiderbäck 1999-2000 3 Björn Eiderbäck 1999-2000 4

exempel kod (server) import java.util.date; public class daytimeserver { public final static int daytimeport = 4711; public static void main(string[] args) { ServerSocket theserver; Socket theconnection; PrintWriter p; theserver = new ServerSocket(daytimePort); //forts nästa sida Exempel enkel server/klient app: klienten /* Deklarera en socket: thesocket (som som ansluter till servern), namn på severn: hostname (dvs servermaskinens ip-adress), indataström: inputstream (för att ta emot information från servern) */ Socket thesocket; String hostname; DataInputStream inputstream; //Skapa socket thesocket = new Socket(hostname, 4711); //indataström som läser från socketen inputstream = new DataInputStream(theSocket.getInputStream()); // ta emot information från servern String thetime = inputstream.readline(); System.out.println("It is " + thetime + " at " + hostname); thesocket.close(); previous next 9 previous next 11 while (true) { theconnection = theserver.accept(); System.out.println("Connection: "+ theconnection); p = new PrintWriter( theconnection.getoutputstream()); p.println(new Date()); theconnection.close(); //end while catch (IOException e) { theserver.close(); catch (IOException e) { previous next 10 exempel kod (klient) public class daytimeclient { public static void main(string[] args) { Socket thesocket; String hostname; DataInputStream inputstream; if (args.length > 0) { hostname = args[0]; else { //om ingen ip-adress ges så använder vi lokala maskinens hostname = "localhost"; previous next 12 Björn Eiderbäck 1999-2000 5 Björn Eiderbäck 1999-2000 6

thesocket = new Socket(hostname, 4711); inputstream = new DataInputStream(theSocket.getInputStream()); String thetime = inputstream.readline(); System.out.println("It is " + thetime + " at " + hostname); // end try catch (UnknownHostException e) { finally {thesocket.close(); catch (IOException e) { previous next 13 Importera klasser för io och nät 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. public class EchoClient { public static void main(string[] args) throws IOException { Socket echosocket = null; PrintWriter out = null; BufferedReader in = null; Skapa klient kopplad mot en echosocket = new Socket( faun.nada.kth.se", 7); av NADAs datorer out = new PrintWriter(echoSocket.getOutputStream(), true); Samt in- och utström 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); previous next 15 Fasta portar Vi kan ansluta oss till fasta portar med på förhand given service på dom flesta datorer Tex 25 för mail 144 för news 23 för telnet En annan användbar port för att testa förbindelser eller egen klient är echo-porten nr: 7 Port 0-1023 reserverade för speciella typer av service tex port 80 är den normala WWW-porten Ström mot terminalen Så länge som användaren ger input skicka det hela till socketen, läs svaret samt eka det på terminalen BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); String userinput; while ((userinput = stdin.readline())!= null) { out.println(userinput); System.out.println("echo: " + in.readline()); out.close(); in.close(); stdin.close(); echosocket.close(); previous next 14 previous next 16 Björn Eiderbäck 1999-2000 7 Björn Eiderbäck 1999-2000 8

Första argumentet URL:en Andra argumentet eventuell fil dit utmatningen skall ske 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. public class HttpClient { public static void main(string[] args) { if ((args.length!= 1) && (args.length!= 2)) throw new IllegalArgumentException("Wrong number of arguments"); OutputStream to_file; if (args.length == 2) to_file = new FileOutputStream(args[1]); else to_file = System.out; Skapa buffert för att läsa det servern skickar Så länge som det finns något att läsa skriv det på fil (eller terminal) Stäng förbindelse byte[] buffer = new byte[4096]; int bytes_read; while((bytes_read = from_server.read(buffer))!= -1) to_file.write(buffer, 0, bytes_read); socket.close(); to_file.close(); catch (Exception e) { System.err.println("Usage: java HttpClient <URL> [<filename>]"); previous next 17 previous next 19 Dela upp URL:en på sina beståndsdelar Skapa socket mot angiven värd och port Skapa in- och utmatningsströmm ar mot servern 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); InputStream from_server = socket.getinputstream(); PrintWriter to_server = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); Skapa serversocket på angiven port 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. public class HttpMirror { public static void main(string args[]) { int port = Integer.parseInt(args[0]); ServerSocket ss = new ServerSocket(port); Argumentet anger den port som servern skall köra på 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! Vänta till klient ansluter for(;;) { Socket client = ss.accept(); Vi kör om och om igen ända tills servern termineras (med tex CTRL-C) previous next 18 previous next 20 Björn Eiderbäck 1999-2000 9 Björn Eiderbäck 1999-2000 10

Skapa in- och utmatningsströmm ar mot klienten Skicka över protokollinformation till klienten Läs från klienten och eka tillbaks det BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); PrintWriter out = new PrintWriter(new OutputStreamWriter(client.getOutputStream())); 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(); String line; while((line = in.readline())!= null) { if (line.length() == 0) break; out.println(line); Weizenbaums klassiska Eliza (serverdelen) public class Therapist { static public void main (String [ ] args) { Therapist world = new Therapist(); catch (IOException e) { System.out.println("Received an IO Exception" + e); static final public int portnumber = 5321; previous next 21 previous next 23 out.close(); in.close(); client.close(); catch (Exception e) { System.err.println("Usage: java HttpMirror <port>"); Kör genom att 1) starta programmet på den lokala datorn java HttpMirror 4444 (serverdelen) public Therapist () throws IOException { ServerSocket server = new ServerSocket(portNumber); while (true) { Socket sock = server.accept(); // start new thread to handle session Thread session = new TherapySession // Se nästa sida (sock.getinputstream(), sock.getoutputstream()); session.start(); 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 22 previous next 24 Björn Eiderbäck 1999-2000 11 Björn Eiderbäck 1999-2000 12

Terapisten med tråd som servar viss klient import java.util.vector; import java.util.stringtokenizer; public class TherapySession extends Thread { public TherapySession (InputStream ins, OutputStream outs) { Reader isread = new InputStreamReader(ins); in = new BufferedReader(isread); out = new OutputStreamWriter(outs); (terapisten) // look for relatives for (int i = 0; i < words.size(); i++) { String relative = (String) words.elementat(i); if (isrelative(relative)) return "Tell me more about your " + relative; // nothing else, generic response return "Tell me more"; private String name = ""; private BufferedReader in; private Writer out; private boolean isrelative (String name) { return name.equals("mother") name.equals("father") name.equals("brother") name.equals("sister") name.equals("uncle"); previous next 25 previous next 27 (terapisten) private String response (String text) { // answer a question with a question if (text.endswith("?")) return "Why do you want to know?"; // break up line Vector words = new Vector(); StringTokenizer breaker = new StringTokenizer(text.toLowerCase(), ".,?!"); while (breaker.hasmoreelements()) words.addelement(breaker.nextelement()); // look for \I feel" if ((words.size() > 1) && words.elementat(0).equals("i") && words.elementat(1).equals("feel")) return "Why do you feel that way?"; (terapisten) public void run () { boolean continuereading = true; // get name out.write("hello. Welcome to therapy. What is your name?\n"); out.flush(); name = in.readline(); out.write("well " + name + " what can we do for you today?\n"); out.flush(); // now read and respond while (continuereading) { String text = in.readline(); out.write(response(text) + "\n"); out.flush(); catch (IOException e) { continuereading = false; previous next 26 previous next 28 Björn Eiderbäck 1999-2000 13 Björn Eiderbäck 1999-2000 14

Eliza (klientdelen) (klienten) public class TherapyClient { public static void main (String [ ] args) { TherapyClient world = new TherapyClient(); catch (IOException e) { System.out.println("Received an IO exception " + e); static final public int portnumber = 5321; private BufferedReader input, term; private Writer output; // now read and print while (true) { // read and print something from therapist String line = input.readline(); System.out.println(line); // get our response line = term.readline(); if (line.equals("quit")) break; output.write(line + "\n"); output.flush(); previous next 29 previous next 31 (klienten) public TherapyClient () throws IOException { // open standard input as bufered reader term = new BufferedReader(new InputStreamReader(System.in)); // open socket as a reader and a writer Socket sock = new Socket(InetAddress.getLocalHost(), portnumber); Reader isread = new InputStreamReader(sock.getInputStream()); input = new BufferedReader(isread); output = new OutputStreamWriter(sock.getOutputStream()); 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/00-01/contents/exempel.html previous next 30 previous next 32 Björn Eiderbäck 1999-2000 15 Björn Eiderbäck 1999-2000 16