2203$ ) UHOlVQLQJ Konstruktion av appletar, trådar, något om Internet och användning av socketar Innehåll, kort om: appletar trådar Internet socketar previous next Del 1 Appletar Innehåll Appletar i Java Referenser Harold, Java Network Programming, Elliotte Harold Hall, "CORE Web Programming Budd, Understanding Object-Oriented Programming with Java" previous next Björn Eiderbäck 1999 1
java.lang Applet java.awt java.applet Component Container Panel Applet Object Window Frame En applet är en sorts miniapplikation konstruerad för att exekveras i en Webbrowser eller appletviewer Det finns flera restriktioner på vad en applet tillåts göra Orsaken är att en applet skall kunna hämtas och exekveras på ett säkert sätt för klienten en applet kan tex inte accessa det lokala filsystemet En applet skrivs som subklass till klassen Applet den har ingen main()-metod klassen Applet med superklasser beskriver ett slags ramverk (framework) med både definitioner och processbeskrivning (baserat på bla template methods) valda metoder som init, paint och mousedown i den aktuella (egna) klassbeskrivningen omdefinieras därefter för att beskriva önskat beteende previous next 3 Exempel: Min första applet Javakod import java.applet.*; import java.awt.*; // Detta måste vara med! // och det här för grafiken! /** En applet som säger "Hallå OOMPA!" */ public class FirstApplet extends Applet { // Följande metod ritar appleten. // Klassen Graphics tar hand om utritning i Java. public void paint(graphics g) { g.drawstring("hallå OOMPA!", 25, 50); previous next 4 Björn Eiderbäck 1999 2
... min första applet Alltid med HTML-kod (för att binda appleten till Weben) <HTML> <HEAD> <TITLE> Min första applet </TITLE> </HEAD> <BODY> <APPLET CODE="FirstApplet.class" WIDTH=150 HEIGHT=50> </APPLET> </BODY> </HTML> previous next 5 En Applet kan testas med WWW browser som är "appletförberedd" tex Netscape, HotJava eller InternetExplorer En Appletviewer Skriv följande på terminalen (motsvarar >java KlassNamn) >appletviewer HTML-filen previous next 6 Björn Eiderbäck 1999 3
Vi gör om ett av Frame-exemplen från F14 till en applet import java.awt.*; import java.applet.applet; public class AppletHelloOne extends Applet { public void paint(graphics g) { int posy; posy = getbounds().height / 3; g.drawstring("man kan rita ut text", 20, posy); g.setcolor(color.blue); posy = posy + 30; g.drawstring("man kan ändra färgen (och rita figurer)", 20, posy); g.setcolor(color.red); g.drawline(10, 10, 100, posy); g.setcolor(new Color((float) 0.5, (float) 1.0, (float) 0.7)); g.fill3drect(posy, posy, posy + 50, posy + 70, true); previous next 7 och HTML-koden <HTML> <HEAD> <TITLE>Applet ett</title> </HEAD> <BODY> <H1>En applet</h1> <APPLET code="applethelloone.class width=400 height=400> </APPLET> </BODY> </HTML> previous next 8 Björn Eiderbäck 1999 4
Vi gör också bollexemplet till en applet import java.awt.*; import java.applet.applet; public class AppletWithBalls extends Applet { Ball [] thefigures = { new Ball(Color.red, new Point(70, 70), 50), new Ball(Color.blue, new Point(75, 170), 70) ; public void paint(graphics g) { for(int i = 0; i < thefigures.length; i++) { thefigures[i].paint(g); previous next 9 och HTML-koden <HTML> <HEAD> <TITLE>Applet med bollar</title> </HEAD> <BODY> <H1>En applet med två bollar</h1> <APPLET code="appletwithballs.class" width=400 height=400></applet> </BODY> </HTML> previous next 10 Björn Eiderbäck 1999 5
Skapa applet steg för steg Skapa en klass som subklass till Applet kompilera Skapa HTML-fil som har den aktulla appleten som inom märkorden APPLET och /APPLET där den aktuella appletens klass anges efter märkordet CODE Test appletviewer www-browser previous next 11 En applets liv En applet använder INTE static main-metoden Istället anropas följande metoder av systemet init() för initiering start() som anropas när appleten är nerladdad till den sida som skall visa den (eller då användaren bläddrar tillbaks till sidan) stop() anropas då användaren lämnar sidan med appleten, eller minimerar fönstret destroy() anropas då appleten termineras, då nätbläddraren avslutas eller användaren går till annan adress på internet previous next 12 Björn Eiderbäck 1999 6
Exempel: En applets liv import java.awt.*; import java.applet.*; public class TheLifeOfAnApplet extends Applet { // Anropas vid instansieringen public void init() { trace("init"); //Anropas då appleten är nerladdad public void start() { trace("start"); // Stoppa tillfälligt exekvering av applet public void stop() { trace("stop"); previous next 13... //Då browsern avslutas eller annan internetadress väljs public void destroy() { trace("destroy"); // Då appleten måste ritas om public void paint(graphics g){ // Här känner vi till Graphics så... trace(g, "paint"); previous next 14 Björn Eiderbäck 1999 7
... // och några metoder för trace-utskrifter private void trace(string s) { System.out.println(s); // getgraphics() konstruerar en grafisk kontext trace(getgraphics(), s); private void trace(graphics g, String s) { trace(g, s, 50, 20); private void trace(graphics g, String s, int x, int y) { g.drawstring("***", x, y); g.drawstring(s, x, y + 30); g.drawstring("***", x, y + 60); previous next 15 Exekvering av en applet Då vi exekverar en applet kan vi i HTML-dokumentet ange CODEBASE internetadress för appleten ALT text som skall visas om nätbläddraren inte klarar av Java-applets NAME ett namn på appleten så att flera appletar på samma sida kan kommunicera ALIGN, VSPACE, HSPACE placering och luft PARAM parametrar till appleten styrda från HTML-sidan previous next 16 Björn Eiderbäck 1999 8
... ARCHIVES refererar en s.k. JAR-fil med både appletkod och resurser OBJECT refererar en seriealiserad version, som kan spara inställningar mellan olika exekveringar previous next 17 Exempel: Parametrar HTMLfilen Javafilen... <APPLET code= SomeApplet.class" width=500 height=320> <PARAM NAME=CourseName VALUE= OOMPA99 > <PARAM NAME=CourseID VALUE= 2D1359&2D1360 > <PARAM NAME=LectureNumber VALUE=15></APPLET>...... String course = getparameter( CourseName ): if (course == null) course = A KTH course ; String lectno = getparameter( LectureNumber ); int no = Integer.parseInt(lectno);... previous next 18 Björn Eiderbäck 1999 9
... säkrare nerladdning Använd undantagshanterare try {x = getparameter(... ); catch (Exception e) {// gör något previous next 19 Del 2 Trådar Kort om trådar också kallade lättviktsprocesser Innehåll Kort om trådar i Java Referenser Harold, Java Network Programming, Elliotte Harold Hall, "CORE Web Programming Budd, Understanding Object-Oriented Programming with Java" previous next Björn Eiderbäck 1999 10
Trådar För att en dator skall kunna göra flera saker parallellt så behövs s.k. multitasking, tex skriva ut samtidigt som man editerar en text Trådar åstadkommer motsvarande för ett program Ett program kan exekvera flera saker parallellt Olika trådar befinner sig i samma exekveringsomgivning, delar minne och variabler osv En tråd kallas också lättviktsprocess previous next 21 Tråd genom subklassning I Java kan en tråd skapas genom att klassen Thread subklassas och metoden run() implementeras public class MyThread extends Thread { public void run() { /* Definiera vad tråden skall göra ofta en oändlig loop som gör viss sak om och om igen */ Tråden instansieras och startas med meddelandet start() MyThread mythread = new MyThread(); mythread.start(); previous next 22 Björn Eiderbäck 1999 11
Vi kan tex använda trådar för att göra animeringar Budds "gamla bollexempel" public class ThreadedBallWorld extends Frame { public static void main (String [ ] args) { ThreadedBallWorld world = new ThreadedBallWorld (Color.red); world.show ( ); private static final int FrameWidth = 600; private static final int FrameHeight = 400; private Ball aball; private int counter = 0; previous next 23... private ThreadedBallWorld (Color ballcolor) { // constructor for new ball world // resize our frame setsize (FrameWidth, FrameHeight); settitle ("Ball World"); addmouselistener (new BallListener( )); // initialize object data field aball = new Ball (10, 15, 5); aball.setcolor (ballcolor); aball.setmotion (3.0, 6.0); Thread ballthread = new BallThread( ); ballthread.start( ); previous next 24 Björn Eiderbäck 1999 12
... private class BallThread extends Thread { public void run ( ) { while (true) { aball.move( ); if ((aball.x( ) < 0) (aball.x( ) > FrameWidth)) aball.setmotion (-aball.xmotion( ), aball.ymotion( )); if ((aball.y( ) < 0) (aball.y( ) > FrameHeight)) aball.setmotion (aball.xmotion( ), -aball.ymotion( )); repaint( ); try { sleep(50); catch (InterruptedException e) { previous next 25... private class BallListener extends MouseAdapter { public void mousepressed (MouseEvent e) { aball.moveto(e.getx( ), e.gety( )); public void paint (Graphics g) { aball.paint (g); previous next 26 Björn Eiderbäck 1999 13
Runnable Istället för att subklassa kan vi implementera gränssnittet Runnable package java.lang; public interface Runnable { public abstract void run(); Dvs public class MyRunnable implements Runnable { public void run() { /* Definiera vad tråden skall göra */ Skapa och starta Thread mythread = new Thread (new MyRunnable()); mythread.start(); previous next 27 Bollar med Runnable public class ThreadedBallWorldB extends Frame { //... private class BallThread implements Runnable { public void run ( ) { while (true) { aball.move( ); if ((aball.x( ) < 0) (aball.x( ) > FrameWidth)) aball.setmotion (-aball.xmotion( ), aball.ymotion( )); if ((aball.y( ) < 0) (aball.y( ) > FrameHeight)) aball.setmotion (aball.xmotion( ), -aball.ymotion( )); repaint( ); try { Thread.sleep(50); catch (InterruptedException e) { //... previous next 28 Björn Eiderbäck 1999 14
... /* Starta med Thread ballthread = new Thread(new BallThread( )); ballthread.start( ); */ previous next 29 Synkronisering Ibland har vi behov av att en resurs endast utnyttjas av en "klient" i taget Detta gäller speciellt om vi använder flera olika trådar för att accessa en viss resurs, tex ett par som skriver och ett annat par som läser databas bankomat I Java kan markera sådana resurser med modifieraren synchronized, tex en metod public synchronized void increment() { Eller kodblock (som använder ett "låsobjekt" som argument) synchronized(mysyncobject) { previous next 30 Björn Eiderbäck 1999 15
Del 3 Nätverk grunder Kort introduktion till Internet Se också Intro en streamad videoinspelning som finns på nätet Innehåll Kort om grundläggande nätverkskoncept Internetadresser Referenser Harold, Java Network Programming, Elliotte Harold Hall, "CORE Web Programming" Intro, http://www-citu.nada.kth.se/streams/intprogrintro.ram previous next Programmering av nätverksapplikationer Varför nätverksapplikationer? Idag så ser vi ett allt större behov för applikationer som kan kommunicera mellan olika noder Ett exempel är WWW, email och news med mer asynkron kommunikation Andra exempel är distribuerade databaser, ljud, radio och video Vi har också behov av att bygga tillämpningar där vi mer direkt är medvetna om varandra delade anslagstavlor, whiteboards, delade ordbehandlare, styrssystem (robotar mm) och inte minst spel För att åstadkomma detta finns det stöd i dagens nätverk (tex i Internet som vi skall titta lite mer på) previous next 32 Björn Eiderbäck 1999 16
Nätverk Ett nätverk är en samling av datorer eller annan utrustning Termer nod en maskin i nätverket (dator, skrivare, brygga, läskautomat, ) värd (eng. host) noder som är fullt fungerande datorer kallas för värdar adress varje nod i nätverket har en unik adress i form av en serie av bytes paket moderna nätverk är paket-baserade, dvs informationen bryts ner till och skickas som paket. Paketen hanteras därefter separat protokoll en uppsättning regler som specificerar hur kommunikationen i nätverket skall gå till previous next 33 Internet Internet är det mest kända nätverket och idag det mest spridda Designat för att vara robust Första versionen konstruerat av ARPA en myndighet inom USAs försvar. Kallades då ARPANET som sedemera "växte" till Internet. (ARPANET) första versionen 1968. Då med ett fåtal anslutna datorer previous next 34 Björn Eiderbäck 1999 17
Lager (eng. layer) Ett nätverk har olika kommunikationslager Applikation (HTTP, FTP, Telnet, ) Transport (TCP, UDP, ) Nätverk (IP, ) Logisk förbindelse Fysiskt (Ethernet, FDDI, Local Talk, drivers, ) Applikation (HTTP, FTP, Telnet, ) Transport (TCP, UDP, ) Nätverk (IP, ) Som applikationsprogrammerare arbetar vi oftast i det övre lagret För speciella distribuerade tillämpningar arbetar vi också i Transportlagret Övriga lager behöver vi normalt inte bry oss om previous next 35 IP, TCP och UDP IP, Internet Protocol protokollet som används på nätverksnivå av Internet TCP, Transport Control Protocol ett anslutningsbaserat protokoll som erbjuder tillförlitligt datautbyte mellan två noder UDP, User Datagram Protocol ett protokoll som tillåter skickande av oberoende paket av data från en nod till en annan utan att varken garantera att paketen kommer fram eller ordningen mellan dem är samma vid mottagandet som vid utskickandet previous next 36 Björn Eiderbäck 1999 18
IP-adress och DNS Varje dator på Internet identifieras med ett fyra-bytes (dvs 32 bitars) tal Många datorer har fasta nummer andra tilldelas temporära vid anslutning (tex vid anslutning via modem hemifrån) 32 bitar räcker till 2 32 = 4294967296 adresser men det räcker ändå inte så det finns ett förslag, IPv6, med 128 bitars adresser, dvs 2 128 = 340282366920938463463374607431768211456 adresser (som ju bör räcka ett tag...fast inte riktigt till att adressera varje molekyl i universum...) DNS, Domain Name Server IP-adresser är svåra att komma ihåg för människor Därför konstruerades DNS som kan översätta mer lättihågkomna namn till IP-adresser Tex www.nada.kth.se blir 130.237.222.66 previous next 37 Portar Varje dator med en IP-adress har ett antal logiska portar för att kommunicera med sin omgivning en port är ett 16-bitars tal, dvs ett tal mellan 0 och 65535 Vissa portar är reserverade portnummer mellan 0 och 1023 reserverade för speciella ändamål exempelvis är följande portnummer reserverade för viss service port 7 för eko port 20-21 för ftp port 23 för telnet port 25 för smtp (dvs skicka e-post) port 80 för HTTP (dvs den port som normalt används av en WEB-server) port 110 för pop3 (dvs ett protokoll för att läsa e-post) Senare i kursen skall vi se hur vi själva kan skriva program som kommunicerar med både fördefinierade och via portar med andra nummer previous next 38 Björn Eiderbäck 1999 19
Internet och Intranet Internet är världens största IP-baserade nätverk Massor av olika typer av datorer från alla kontinenter är anslutna Varje dator har (eller får vid anslutning) en unik IP-adress med vilken den sedan identifieras Det finns också andra nätverk med ungefär samma uppbyggnad Man brukar tala om intranet för att benämna lokala nätverk inom en organisation previous next 39 Klient-server-modellen Idag är en klient-server- (ibland klient-betjänt på svenska) modellen den förhärskande vid konstruktion av distribuerade, samarbetande tillämpningar en klient ber en server om en viss tjänst tex om att få reda på vad klockan är eller att skicka över en viss fil eller websida en server utför tjänster åt klienter tex svarar på vad klockan är, skickar över en fil eller websida från sitt lokala filsystem Alla typer av applikationer passar dock inte in i klient-server-modellen utan båda ändarna är både servrar och klienter samtidigt. Man brukar då prata om kommunikation peer-to-peer exempel en delad riteditor spel eller (det klassiska exemplet) telefonförbindelse previous next 40 Björn Eiderbäck 1999 20
RFC (Request For Comments) Internetstandards har utvecklats på ett öppet sätt där förslag ofta presenteras öppet redan i prototypstadiet Protokollen finns att läsa på Internet Protokollen är indelade i olika nivåer obligatoriska, dvs sådana som måste implementeras av varje host, som IP rekommenderade som normalt bör implementeras, tex TCP, SMTP, UDP och Telnet) valfria, som MIME begränsade, som oftast inte behövs icke rekommenderade, dvs bör inte implementeras historiska, dvs utgångna informativa, tex sådana som är konstruerade utanför RFC men ändå väldigt användbara eller sådana som är nyttiga men inte erbjuder ett protokoll previous next 41 Del 4: Klient och serverprogrammering Socketar previous Innehåll Inledning 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/99-00/contents/exempel.html Fördjupning se tex Harold, Hall och/eller Tut next Björn Eiderbäck 1999 21
Klienter och servrar (som sagts tidigare ) Dom flesta moderna nätverksprogram baseras på en klient-server-modell En server är ett program som erbjuder tjänster En klient är ett program som frågar en server om tjänster En server väntar på att klienter skall ansluta En klient initierar en "konversation" previous next 43 Socketar 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. Socketar finns av två typer Serversocketar som väntar på att klienter skall ansluta sig Klientsocketar som ansluter till klienter I Java representeras dessa av klasserna ServerSocket och Socket previous next 44 Björn Eiderbäck 1999 22
Socketar 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. previous next 45... 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(). previous next 46 Björn Eiderbäck 1999 23
Socketar 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 klient-socketerna. 5. Läs från och skriv på klientsocketen. 6. Stäng strömmarna. 7. Stäng klient-socketerna. 8. Stäng server-socketen. previous next 47 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 48 Björn Eiderbäck 1999 24
... exempel kod (server) import java.net.*; import java.io.*; 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; try { theserver = new ServerSocket(daytimePort); //forts nästa sida previous next 49... try { 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(); System.err.println(e); catch (IOException e) {System.err.println(e); previous next 50 Björn Eiderbäck 1999 25
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 51... exempel kod (klient) import java.net.*; import java.io.*; 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 52 Björn Eiderbäck 1999 26
... try { 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) { System.err.println(e); finally {thesocket.close(); catch (IOException e) { System.err.println(e); previous next 53 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 previous next 54 Björn Eiderbäck 1999 27
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; Skapa klient try { 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 55... 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 56 Björn Eiderbäck 1999 28
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.*; Första argumentet URL:en Andra argumentet eventuell fil dit utmatningen skall ske public class HttpClient { public static void main(string[] args) { try { 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; previous next 57... 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ömm ar 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 58 Björn Eiderbäck 1999 29
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 59 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]); Argumentet anger den port som servern skall köra på Skapa serversocket på angiven port Vänta till klient ansluter ServerSocket ss = new ServerSocket(port); for(;;) { Socket client = ss.accept(); Vi kör om och om igen ända tills servern termineras (med tex CTRL-C) previous next 60 Björn Eiderbäck 1999 30
... Skapa in- och utmatningsströmm ar 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 61... 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 62 Björn Eiderbäck 1999 31
Weizenbaums klassiska Eliza (serverdelen) import java.net.*; import java.io.*; public class Therapist { static public void main (String [ ] args) { try { Therapist world = new Therapist(); catch (IOException e) { System.out.println("Received an IO Exception" + e); static final public int portnumber = 5321; previous next 63 (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(); previous next 64 Björn Eiderbäck 1999 32
Terapisten med tråd som servar viss klient... import java.io.*; 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); private String name = ""; private BufferedReader in; private Writer out; previous next 65... (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?"; previous next 66 Björn Eiderbäck 1999 33
... (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 boolean isrelative (String name) { return name.equals("mother") name.equals("father") name.equals("brother") name.equals("sister") name.equals("uncle"); previous next 67... (terapisten)... public void run () { boolean continuereading = true; try { // 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 68 Björn Eiderbäck 1999 34
...Eliza (klientdelen) import java.io.*; import java.net.*; public class TherapyClient { public static void main (String [ ] args) { try { 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; previous next 69... (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()); previous next 70 Björn Eiderbäck 1999 35
... (klienten) // 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 71 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/99-00/contents/exempel.html previous next 72 Björn Eiderbäck 1999 36