Ladda ner presentationen
Presentation laddar. Vänta.
Publicerades avLudvig Mattsson
1
next previous Innehåll Del 1-trådar Del 2-URLer Del 1: Trådar Föreläsning 8
2
previous next 2 Trådar. Nätverk och internet grunder Sekvensiella beskrivningar trevliga –men det är problematiskt att beskriva aktiviteter som naturligt har flera parallella aktiviteter som en enda sekvensiell process –Exempel på sådana situationer är skriva och läsa mot gemensam resurs –databas –bankomat system som består av flera samverkande hårdvaror –automatisk dörr –farthållare –microvågsugn –hiss
3
previous next 3 Trådar. Nätverk och internet grunder... Istället kan vi beskriva var och en av aktiviteterna som en separat process Problemet blir mer då att samordna aktiviteterna och hanteringen av gemensamma (delade) resurser Detta kan göras med hjälp av lättviktsprocesser som synkroniseras via tex –semaforer –monitorer
4
previous next 4 Trådar. Nätverk och internet grunder Konflikter Det kan uppstå konflikter då flera processer använder gemensam resurs, ett par typiska är: –Läsa-skriv-konflikter dvs en process skriver (uppdaterar) en resurs som en annan process läser beroende av ordning mellan processerna blir resultatet olika –Skriva-skriva-konflikter Om två trådar båda försöker skriva på samma resurs så vet man inte vad resultatet kommer vara vid nästa läsning
5
previous next 5 Trådar. Nätverk och internet grunder En tråd, lättviktsprocess eller exekveringsomgivning är en viss sekvens av kontroll inom ett program I Java skapas en tråd som antingen subklass till klassen Thread eller genom att implementera gränssnittet Runnable i båda fallen skrivs en metod run som definierar vad som skall göras i tråden Trådar Program med två trådar
6
previous next 6 Trådar. Nätverk och internet grunder Subklassa Thread eller implementera Runnable Beskriva egen tråd genom att subklassa Thread class MyThread extends Thread { public void run() { //Här beskriver vi vad som skall göras så länge tråden "lever" //ofta en while-loop med stoppvillkor } MyThread «interface» Runnable run (): void Thread run(): void relevanta delar av Thread samt Runnable
7
previous next 7 Trådar. Nätverk och internet grunder Exempel public class MyThread extends Thread { public void run() { int x = 0; while(x < 100) { System.out.println("x: " + x); x++; } Vi testar tråden, dvs startar via meddelandet start MyThread myThread = new MyThread(); myThread.start(); MyThread Thread Runnable Alternativ notation för att visa att Thread implementerar Runnable
8
previous next 8 Trådar. Nätverk och internet grunder... trådar med Runnable I många fall fungerar det inte att subklassa Thread utan vi vill kanske ha en annan superklass Då kan vi istället implementera Runnable public class MyRunnable implements Runnable { public void run() { int x = 0; while(x < 100) { System.out.println("x: " + x); x++; } MyRunnable run() «interface» Runnable
9
previous next 9 Trådar. Nätverk och internet grunder... och testar genom att starta en instans av vår klass via klassen Thread Thread wrappingThread = new Thread(new MyRunnable()); wrappingThread.start(); Vi ser på fler exempel från Suns tutorial om trådar Thread run(): void Thread(Runnable r) target : Runnable if (target != null) { target.run(); } target = r; relevanta delar av Thread
10
previous next 10 Trådar. Nätverk och internet grunder Exempel Counter Kodexempel i bla JBuilder –Vi gör en räknare på två olika sätt Subklassa Thread Implementera Runnable
11
previous next 11 Trådar. Nätverk och internet grunder Uppdatering av gemensam resurs Ge värden för a, b, c och d m1 = max(a, b); m2 = max(c, d); Antag att vi har följande program (beskrivet med ett aktivitetsdiagram) Här har det ingen betydelse om m1 eller m2 beräknas först då satserna disjunkta m = max(m1, m2);
12
previous next 12 Trådar. Nätverk och internet grunder... med tidsberoende beteende j = 10; j.print(); j = 100; Om vi istället betraktar följande program Så är resultatet (utskriften via print ) beroende av vilken av grenarna som utförs först
13
previous next 13 Trådar. Nätverk och internet grunder Exempel: bankkonto public class BankAccount{ protected int balance = 0; public void deposit (int amount) { balance = balance + amount; } public void withdraw (int amount) { balance = balance - amount; } public int balance (){ return balance; }
14
previous next 14 Trådar. Nätverk och internet grunder... BankAccount account1, account2; int transfer; account1 = new BankAccount(); account2 = new BankAccount(); account1.deposit(200); account2.deposit(100); transfer = 75; account1.withdraw(transfer); account2.deposit(transfer); account2.balance(); // resultat 175
15
previous next 15 Trådar. Nätverk och internet grunder Bankkonto med flera trådar kan ge problem BankAccount deposit(int amount) withdraw(int amount) int balance = 0 b1 = balance; balance = b1 + amount; b2 = balance; balance = b2 - amount; Tråd 1 //visa kontohavare1 balansen account.balance.display() //kontohavare1 tar ut belopp account.withdraw(100) // visa hur mycket som finns på kontot account.balance.display() Tråd 1 //visa kontohavare1 balansen account.balance.display() //kontohavare1 tar ut belopp account.withdraw(100) // visa hur mycket som finns på kontot account.balance.display() vi initierar kontot (sätter in 500) account.balance = 500 vi initierar kontot (sätter in 500) account.balance = 500 Tråd 2 //visa kontohavare2 balansen account.balance.display() //kontohavare2 sätter in belopp account.deposit(200) // visa hur mycket som finns på kontot account.balance.display() Tråd 2 //visa kontohavare2 balansen account.balance.display() //kontohavare2 sätter in belopp account.deposit(200) // visa hur mycket som finns på kontot account.balance.display()
16
previous next 16 Trådar. Nätverk och internet grunder Bankkonto och flera trådar, problem Om flera trådar samtidigt har möjlighet att uppdatera bankkontot så får vi tidsberoende resultat Beroende av ordning kommer kontot nu ha 400, 600 eller 700 Tråd1Tråd2 b1b2balance b1 = balance500500 b2 = balance500 balance = b2 + 200700 balance = b1 - 100400 Tråd1Tråd2 b1b2balance b1 = balance500500 balance = b1 - 100400 b2 = balance400 balance = b2 + 200600 Tråd1Tråd2 b1b2balance b1 = balance500500 b2 = balance500 balance = b1 - 100 400 balance = b2 + 200 700 Möjlighet 1 Möjlighet 2-3 (samma resultat om tråd 2 först) Möjlighet 2-3 (samma resultat om tråd 2 först) Möjlighet 4
17
previous next 17 Trådar. Nätverk och internet grunder Kritiska regioner I bankkontoexemplet kan vi identifiera kritiska regioner som måste exekveras tillsammans Både kodkroppen i withdraw och deposit är kritiska regioner vi vill skydda kritisk region –en process i taget i regionen –ingen annan process ska få komma in om någon annan redan där –helst skall ingen process behöva vänta i det oändliga på att komma in b1 = balance; balance = b1 + amount; b2 = balance; balance = b2 - amount; Kritisk region
18
previous next 18 Trådar. Nätverk och internet grunder... kritiska regioner Alltså, om flera trådar kan exekvera samma delar av ett objekt så kan vi få problem även om programmet fungerar fullt tillfredställande om vi kör det som en enda sekvensiell process Vi kan identifiera kritiska regioner som måste skyddas för att vi ska få ett förutsägbart resultat class Even { // Do not use private int n = 0; public int next(){ // POST?: next is always even ++n; return n; } Vad är resultatet om två olika processer anropar next() ? Kritisk region
19
previous next 19 Trådar. Nätverk och internet grunder Mutex Kritiska regioner kan skyddas med olika tekniker för inbördes exklusiv exekvering (mutexbegin/mutexend) Man använder lås innan man exekverar kritisk region och släpper det när man är klar med kodavsnittet Man kan skydda med –semafor –monitor –brevlåda Vi kommer titta en aning mer på monitorer, semaforer och relaterade tekniker. Fast detaljerna hör till en annan kurs (tex en i parallell programmering) mutexbegin; b1 = balance; balance = b1 + amount; mutexend;
20
previous next 20 Trådar. Nätverk och internet grunder Monitorer En monitor är ett objekt som kan fungera som ett staket runt kritisk data En monitor används för att låsa en viss kritisk region. Medan kodsekvens/objekt finns i monitorn kan ingen annan exekvera denna region/del av objektet
21
previous next 21 Trådar. Nätverk och internet grunder Exklusiv exekvering av delar av objekt I Java finns en inbyggd konstruktion för att hantera kritiska regioner –Om man använder nyckelordet synchronized antingen i en metoddeklaration synchronized void metod() { //... } –eller genom att låsa ett objekt i ett visst kodblock //... synchronized(lockObject) { //... }
22
previous next 22 Trådar. Nätverk och internet grunder... Det förstnämnda fallet är ekvivalent med att skriva void metod() {synchronized(this) { //... } Vad som händer är att alla synkroniserada kodavsnitt placeras i en monitor för objektet i vilket bara en tråd i taget kan befinna sig –Dvs alla synchronized-deklarerade metoder och kodavsnitt låses –Andra metoder och kodavsnitt är inte låsta
23
previous next 23 Trådar. Nätverk och internet grunder Bankkonto med flera trådar: lös problemet med synchronized BankAccount deposit(int amount) withdraw(int amount) int balance = 0 synchronized(this) { b1 = balance; balance = b1 + amount; } synchronized(this) { b1 = balance; balance = b1 + amount; } synchronized(this) { b2 = balance; balance = b2 - amount; } synchronized(this) { b2 = balance; balance = b2 - amount; } En enkel lösning på problemet är att använda synchronized i dom kritiska regionerna Nu kommer dom kritiska regionerna köras odelade och endast en av regionerna kan köras i taget Nu kommer dom kritiska regionerna köras odelade och endast en av regionerna kan köras i taget
24
previous next 24 Trådar. Nätverk och internet grunder...bankkonto Enklast är att deklarera metoderna som synkroniserade public class SynchronizedBankAccount1{ protected int balance = 0; public synchronized void deposit (int amount) { balance = balance + amount; } public synchronized void withdraw (int amount) { balance = balance - amount; } public int balance (){ return balance; }
25
previous next 25 Trådar. Nätverk och internet grunder...bankkonto alternativ med subklass Alternativt skulle vi kunna subklassa och skriva över dom metoder som behöver synkroniseras public class SynchronizedBankAccount2 extends BankAccount{ public synchronized void deposit (int amount) { super.deposit(amount); } public synchronized void withdraw (int amount) { super.withdraw(amount); } Metoder som inte är synkroniserade i superklasser kan skrivas över i subklass och samtidigt deklareras som synkroniserade Metoder som inte är synkroniserade i superklasser kan skrivas över i subklass och samtidigt deklareras som synkroniserade
26
previous next 26 Trådar. Nätverk och internet grunder Exempel class ExpandableArray { protected Object[] data; // the elements protected int size = 0; // the number of array slots used // INV: 0 <= size <= data.length public ExpandableArray(int cap) { data = new Object[cap]; } public synchronized int size() { return size; } public synchronized Object get(int i) // subscripted access throws NoSuchElementException { if (i = size ) throw new NoSuchElementException(); return data[i]; }
27
previous next 27 Trådar. Nätverk och internet grunder... public synchronized void add(Object x) { // add at end if (size == data.length) { // need a bigger array Object[] olddata = data; data = new Object[3 * (size + 1) / 2]; System.arraycopy(olddata, 0, data, 0, olddata.length); } data[size++] = x; } public synchronized void removeLast() throws NoSuchElementException { if (size == 0) throw new NoSuchElementException(); data[--size] = null; }
28
previous next 28 Trådar. Nätverk och internet grunder Vänta För att flera parallellt exekverande trådar om vart annat skall få exekvera så kan man låta dem sova under vissa stunder. Medan en tråd sover får en annan tillfälle att exekvera I Java kan man helt enkelt låta aktuell tråd sova genom att skicka meddelandet sleep till den sleep(milliseconds); En annan möjlighet är att släppa kontrollen via meddelandet yield() –Då låter aktuell tråd annan tråd med samma prioritet ta över
29
previous next 29 Trådar. Nätverk och internet grunder Vänta genom att “sova” viss tid public class SimpleThread extends Thread { public SimpleThread(String str) { super(str); } public void run() { for (int i = 0; i < 10; i++) { System.out.println(i + " " + getName()); try { sleep((long)(Math.random() * 1000)); } catch (InterruptedException e) {} } System.out.println("DONE! " + getName()); }
30
previous next 30 Trådar. Nätverk och internet grunder... public class TwoThreadsTest { public static void main (String[] args) { new SimpleThread("Jamaica").start(); new SimpleThread("Fiji").start(); } Kan ge något i stil med 0 Jamaica 0 Fiji 1 Fiji 1 Jamaica 2 Jamaica 2 Fiji 3 Fiji 3 Jamaica 4 Jamaica 4 Fiji 5 Jamaica 5 Fiji 6 Fiji 6 Jamaica 7 Jamaica 7 Fiji 8 Fiji 9 Fiji 8 Jamaica DONE! Fiji 9 Jamaica DONE! Jamaica
31
previous next 31 Trådar. Nätverk och internet grunder Använd wait och notify En annan möjlighet är att låta en process vänta till dess att en annan process meddelar om att en viss resurs är tillgänglig P1 resurs.wait(); print(resurs.get()); P2 resurs.set(i++); resurs.notify();
32
previous next 32 Trådar. Nätverk och internet grunder Dödläge Om en process P1 väntar på en resurs som hålls av process P2 innan den kan fortsätta men P2 samtidigt väntar på en resurs som hålls av P1 innan den kan fortsätta så har vi ett dödläge (eng. deadlock) –jmf Joseph Hellers ”Moment 22” Def. En process är i dödläge då den väntar på en resurs den aldrig kan få Vi kan rita en resursallokeringsgraf över den ovan beskrivna situationen P1 P2 R1 R2 Request Allocation
33
previous next 33 Trådar. Nätverk och internet grunder Exempel: dödläge class Cell { // Do not use private long value; synchronized long getValue() { return value; } synchronized void setValue(long v) { value = v; } synchronized void swapValue(Cell other) { long t = getValue(); long v = other.getValue(); setValue(v); other.setValue(t); } Tråd1Tråd2 a.swapValue(b) t = getValue()b.swapValue(a) v = other.getValue()t = getValue() v = other.getValue() Går bra (vi har redan låset) Lås a Lås b Vänta på lås för b Går bra Vänta på lås för a
34
previous next 34 Trådar. Nätverk och internet grunder Ömsesidig uteslutning Ett vanligt problem är att flera processer behöver dela en resurs Typiskt skriver en process och en annan läser vad som skrivs (då det finns något att läsa) För att åstadkomma detta så behöver vi sätt att kommunicera mellan processerna –Fast vi vill inte ha några direkta referenser dem emellan En process skall kunna vänta på förändring medan en annan meddelar om att sådan skett Jmf mönstret Observer där ett objekt meddelar (publicerar) att förändring skett till beroende objekt (prenumeranter)
35
previous next 35 Trådar. Nätverk och internet grunder Kommunicera mellan trådar i Java Vi kan använda wait and notify för att vänta på respektive meddela om att en viss resurs är tillgänglig –wait() Vänta ända till notifikation sker (dvs ingen tidsgräns) –wait(milliseconds) Vänta till notifikation sker men vänta max givet antal millisekunder –notify() Meddela precis en (slumpvis utvald) väntande process –notifyAll() Meddela alla väntande processer (i slumpvis ordning)
36
previous next 36 Trådar. Nätverk och internet grunder Exempel: tre trådar som skriver på terminalen class MyThreadNotifyer2 extends Thread { Object toNotify; public MyThreadNotifyer2(Object t) { toNotify = t; } public void info() { synchronized(toNotify) { toNotify.notifyAll(); System.out.println("."); try{toNotify.wait(200);} catch(InterruptedException e) {}; } public void run() { for(int i = 1; i < 21; i++) { info(); } Vänta max 200 ms
37
previous next 37 Trådar. Nätverk och internet grunder... public class MyThreadTest2 extends Thread { int start = 0; Object sync; public MyThreadTest2(int s, Object sync) { start = s; this.sync = sync; } public void info(int i) { synchronized(sync) { try{sync.wait();} catch(InterruptedException e) {}; System.out.println(i); } public void run() { for(int i = start; i < (start + 10); i++) { info(i); }
38
previous next 38 Trådar. Nätverk och internet grunder... public static void main(String[] args) { Object sync = new Object(); MyThreadTest2 myThread1 = new MyThreadTest2(1, sync); MyThreadTest2 myThread2 = new MyThreadTest2(100, sync); MyThreadNotifyer2 notifier = new MyThreadNotifyer2(sync); myThread1.start(); myThread2.start(); notifier.start(); //Vi väntar på en inmatning från terminalen try{System.in.read();} catch(Exception e) {} }
39
previous next 39 Trådar. Nätverk och internet grunder Exempel: producer-consumer public class Producer extends Thread { private CubbyHole cubbyhole; private int number; public Producer(CubbyHole c, int number) { cubbyhole = c; this.number = number; } public void run() { for (int i = 0; i < 10; i++) { cubbyhole.put(i); System.out.println("Producer #" + this.number + " put: " + i); try { sleep((int)(Math.random() * 100)); } catch (InterruptedException e) { } } Producer
40
previous next 40 Trådar. Nätverk och internet grunder... public class Consumer extends Thread { private CubbyHole cubbyhole; private int number; public Consumer(CubbyHole c, int number) { cubbyhole = c; this.number = number; } public void run() { int value = 0; for (int i = 0; i < 10; i++) { value = cubbyhole.get(); System.out.println("Consumer #" + this.number + " got: " + value); } Consumer
41
previous next 41 Trådar. Nätverk och internet grunder... public class CubbyHole { private int contents; private boolean available = false; public synchronized int get() { while (available == false) { try { wait(); } catch (InterruptedException e) { } } available = false; notifyAll(); return contents; } Delad resurs
42
previous next 42 Trådar. Nätverk och internet grunder... public synchronized void put(int value) { while (available == true) { try { wait(); } catch (InterruptedException e) { } } contents = value; available = true; notifyAll(); }
43
previous next 43 Trådar. Nätverk och internet grunder …”huvudprogram” public class ProducerConsumerTest { public static void main(String[] args) { CubbyHole c = new CubbyHole(); Producer p1 = new Producer(c, 1); Consumer c1 = new Consumer(c, 1); p1.start(); c1.start(); }
44
previous next 44 Trådar. Nätverk och internet grunder Prioritering av processer Vi kan definiera processer med olika prioritet –En process med högre prioritet går före en process med lägre prioritet Preemptive –Att processer med högre prioritet får exekvera före och kan avbryta processer med lägre prioritet kallas för ”preemptive” I Java kan en tråds prioritet sättas med setPriority(int newPriority) –där newPriority [1, 10] se Suns tutorial för exempel
45
previous next 45 Trådar. Nätverk och internet grunder Prioritetsinvertering Problem: En process med lägre prioritet kan blockera en process med högre prioritet Orsak: En process med lägre prioritet, p low, kan ha fått tillgång till en resurs (icke preemptive tex fil eller skrivare) en process med lite högre prioritet, p medium, vill exekvera och får det samtidigt som en annan process, p high, vill exekvera och ha tillgång till resursen som, p low, håller. Dvs p high avbryter och väntar på samma resurs som p low har. Vilket resulterar att p medium får exekvera och p low kan inte släppa resursen Botemedel Vid blockering av p high så höjs prioriteten för den process som har resursen till p high :s prioritet p low p medium p high
46
next previous Innehåll Klassen URL Arbeta med URLer, exempel Referenser Harold,”Java Network Programming”, Elliotte Harold Hall, "CORE Web Programming" Tut, dvs SUNs tutorial (~kurs) om URLer på nätet, se http://java.sun.com/docs/books/tutorial/networking/urls/index.html http://java.sun.com/docs/books/tutorial/networking/urls/index.html Del 2: Hämta data mha URLer Föreläsning 7 För mer info se tex Harold, Hall eller Tut (den senare är ganska rättfram). För mer info se tex Harold, Hall eller Tut (den senare är ganska rättfram).
47
previous next 47 Trådar. Nätverk och internet grunder Klassen URL I Java finns det en klass java.net.URL som hanterar URLer Med denna klass kan man enkelt hämta filer från webservrar En absolut URL skapas på följande sätt URL kth = new URL(”http://www.nada.kth.se/"); En URL kan skapas relativt en annan URL ip = new URL(kth, ”kurser/kth/2D1390/index.html"); Generellt kan vi ange både protokoll, webplats, fil och portnummer separat URL nada = new URL(”http”, ”www.nada.kth.se”, 80, ”kurser/kth/2D1390/index.html");
48
previous next 48 Trådar. Nätverk och internet grunder Kastande av undantag vid konstruktion av URL … Då vi skapar en URL måste vi ta hand om undantaget MalformedURLException Så vi konstruerar en URL på följande sätt try { URL myURL = new URL(...) } catch (MalformedURLException e) {... // felhantering här... } dvs ta alltid hand om undantaget
49
previous next 49 Trådar. Nätverk och internet grunder Läsa data mha av URL … Vi kan med hjälp av en URL direkt be om innehållet i den fil den pekar ut –använd metoden getContent() –Observera att getContent() returnerar ett objekt som beror av innehållet, eller fallerar om den inte kan tolka vad som finns där try{ content = (BufferedInputStream)url.getContent(); } catch(IOException e) {} BufferedReader buffer = new BufferedReader(new InputStreamReader(content)); String line; while((line = readLine(buffer)) != null) System.out.println(line); Läs innehållet och i det här fallet ”casta” till lämplig typ Skapa läsström Läs radvis
50
previous next 50 Trådar. Nätverk och internet grunder... där readLine kan se ut ungefär så här: public String readLine(BufferedReader b) { String line = null; try{ line = b.readLine(); } catch(IOException e) {} return line; } Mer generellt kan vi läsa innehållet via en URLConnection, se nästa sida
51
previous next 51 Trådar. Nätverk och internet grunder Läsa och skriva mha URLConnection... Om vi från en URL skapar en instans av en subklass till den abstrakta klassen URLConnection. Denna instans ger oss möjlighet att kontrollera vad som skall hända i lite mer detalj –Bland annat kan vi förutom läsa information från URLen också där det är möjligt skriva information till den –Vissa metoder i URL använder en URLConnection för att ”lösa sina uppgifter”, tex metoden getContent() –Se paketet sun.net.www.protocol för konkreta klasser, bland andra FtpURLConnection HttpURLConnection MailToURLConnection
52
previous next 52 Trådar. Nätverk och internet grunder …exempel med indirekt URLConnection... Man kan öppna en läsström med openStream() import java.net.*; import java.io.*; public class URLReader { public static void main(String[] args) throws Exception { URL nada = new URL("http://www.nada.kth.se/"); BufferedReader in = new BufferedReader( new InputStreamReader(nada.openStream())); String inputLine; while ((inputLine = in.readLine()) != null) System.out.println(inputLine); in.close(); }
53
previous next 53 Trådar. Nätverk och internet grunder … vi kan också använda URLConnection mer explicit import java.net.*; import java.io.*; public class URLConnectionReader { public static void main(String[] args) throws Exception { URL nada = new URL("http://www.nada.kth.se/"); URLConnection nc = nada.openConnection(); BufferedReader in = new BufferedReader( new InputStreamReader( nc.getInputStream())); String inputLine; while ((inputLine = in.readLine()) != null) System.out.println(inputLine); in.close(); } Om vi vill skriva kan vi använda URLConnections:s getOutputStream() (se Tut)
54
previous next 54 Trådar. Nätverk och internet grunder Några exempel Nu följer tre exempel på lite olika användning av URLer 1Hämta innehållet från vad som pekas ut av en URL och skriv det antingen på skärmen eller på en fil 2Skriv information om innehållet i den URL som pekas ut 3Använd en URL och mailto: för att skicka elektronisk post
55
previous next 55 Trådar. Nätverk och internet grunder Hämta innehållet i en URL import java.io.*; import java.net.*; public class GetURL { public static void main(String[] args) { InputStream in = null; OutputStream out = null; try { if ((args.length != 1) && (args.length != 2)) throw new IllegalArgumentException("Wrong number of arguments"); URL url = new URL(args[0]); in = url.openStream(); if (args.length == 2) out = new FileOutputStream(args[1]); else out = System.out; Deklarera in- och utmatningsströmmar Skapa URL öppna inström välj typ av utström (fil eller terminal)
56
previous next 56 Trådar. Nätverk och internet grunder... byte[] buffer = new byte[4096]; int bytes_read; while((bytes_read = in.read(buffer)) != -1) out.write(buffer, 0, bytes_read); } catch (Exception e) { System.err.println(e); System.err.println("Usage: java GetURL [ ]"); } finally { try { in.close(); out.close(); } catch (Exception e) {} } kopiera innehållet till utström stäng alltid strömmarna
57
previous next 57 Trådar. Nätverk och internet grunder Skriv information om URL via URLConnection import java.net.*; import java.io.*; import java.util.Date; public class GetURLInfo { public static void printinfo(URL url) throws IOException { URLConnection c = url.openConnection(); c.connect(); System.out.println(" Content Type: " + c.getContentType()); System.out.println(" Content Encoding: " + c.getContentEncoding()); System.out.println(" Content Length: " + c.getContentLength()); System.out.println(" Date: " + new Date(c.getDate())); System.out.println(" Last Modified: " + new Date(c.getLastModified())); System.out.println(" Expiration: " + new Date(c.getExpiration())); Använd URLConnection
58
previous next 58 Trådar. Nätverk och internet grunder... if (c instanceof HttpURLConnection) { HttpURLConnection h = (HttpURLConnection) c; System.out.println(" Request Method: " + h.getRequestMethod()); System.out.println(" Response Message: " + h.getResponseMessage()); System.out.println(" Response Code: " + h.getResponseCode()); } public static void main(String[] args) { try {printinfo(new URL(args[0])); } catch (Exception e) { System.err.println(e); System.err.println("Usage: java GetURLInfo "); } Om det är en HTTP- anslutning skriv ut lite mer info Skapa URL och skriv ut info
59
previous next 59 Trådar. Nätverk och internet grunder Skicka e-post via en URL import java.io.*; import java.net.*; public class SendMail { public static void main(String[] args) { try { if (args.length >= 1) System.getProperties().put("mail.host", args[0]); BufferedReader in = new BufferedReader( new InputStreamReader(System.in)); System.out.print("From: "); String from = in.readLine(); System.out.print("To: "); String to = in.readLine(); System.out.print("Subject: "); String subject = in.readLine(); Om maildator angiven så tala om det för systemet Inmatningsström från terminal Be användaren om brevhuvud Notera att likheten med att skicka brev i ett vanligt program för elektronisk post
60
previous next 60 Trådar. Nätverk och internet grunder... URL u = new URL("mailto:" + to); URLConnection c = u.openConnection(); c.setDoInput(false); // Ingen inmatning från URLen c.setDoOutput(true); // men däremot utmatning till den System.out.println("Connecting..."); System.out.flush(); c.connect(); PrintWriter out = new PrintWriter( new OutputStreamWriter(c.getOutputStream())); out.println("From: \"" + from + "\" "); out.println("To: " + to); out.println("Subject: " + subject); out.println(); // vi avslutar med en tom rad (som indikerar att brevhuvudet är klart) Utmatnings- ström skapas Anslut Skapa en ”mailto:-url” Skriv sidhuvud ”på URLen” Vi vill skriva på “URLen” så vi använder en URLConnection
61
previous next 61 Trådar. Nätverk och internet grunder... System.out.println("Enter the message. " + "End with a '.' on a line by itself."); String line; for(;;) { line = in.readLine(); if ((line == null) || line.equals(".")) break; out.println(line); } out.close(); System.out.println("Message sent."); System.out.flush(); } catch (Exception e) { System.err.println(e); System.err.println("Usage: java SendMail [ ]"); } Läs brevkropp och skriv den på ”URLen” Be användaren skriva brev- kroppen
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.