Hämta data mha Föreläsning 2b För För mer mer info info se se tex texharold, Hall Halleller Tut Tut (den (den senare senare är är ganska ganska rättfram). Innehåll Klassen URL Arbeta med, exempel Hur hittar jag info om protokoll? Lite info om laborationerna kompilera, köra, (bas-) exempel Referenser Harold, Java Network Programming, Elliotte Harold Ince, Developing Distributed and E-commerce Applications Hall, "CORE Web Programming" Tut, dvs SUNs tutorial (~kurs) om på nätet, se http://java.sun.com/docs/books/tutorial/networking/urls/index.html previous next Klassen URL I Java finns det en klass java.net.url som hanterar Med denna klass kan man enkelt hämta filer från webservrar En absolut URL skapas på följande sätt URL gt = new URL("http://www.nada.kth.se/"); En URL kan skapas relativt en annan URL ip = new URL(gt, "kurser/kth/2d1390/default.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/default.html"); previous next 2 Björn Eiderbäck 1999-2003 1
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 ta hand om undantaget previous next 3 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 Läs innehållet och i det här fallet casta till lämplig typ try{ content = (BufferedInputStream)url.getContent(); catch(ioexception e) { Skapa läsström Läs radvis BufferedReader buffer = new BufferedReader(new InputStreamReader(content)); String line; while((line = readline(buffer))!= null) System.out.println(line); previous next 4 Björn Eiderbäck 1999-2003 2
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 previous next 5 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 previous next 6 Björn Eiderbäck 1999-2003 3
exempel med indirekt URLConnection Man kan öppna en läsström med openstream() 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(); previous next 7 vi kan också använda URLConnection mer explicit 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) previous next 8 Björn Eiderbäck 1999-2003 4
Några exempel Nu följer tre exempel på lite olika användning av 1 Hämta innehållet från vad som pekas ut av en URL och skriv det antingen på skärmen eller på en fil 2 Skriv information om innehållet i den URL som pekas ut 3 Använd en URL och mailto: för att skicka elektronisk post previous next 9 Hämta innehållet i en URL public class GetURL { public static void main(string[] args) { Deklarera in- och InputStream in = null; utmatningsströmmar OutputStream out = null; try { if ((args.length!= 1) && (args.length!= 2)) throw new IllegalArgumentException("Wrong number of arguments"); Skapa URL öppna inström välj typ av utström (fil eller terminal) URL url = new URL(args[0]); in = url.openstream(); if (args.length == 2) out = new FileOutputStream(args[1]); else out = System.out; previous next 10 Björn Eiderbäck 1999-2003 5
kopiera innehållet till utström stäng alltid strömmarna 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 <URL> [<filename>]"); finally { try { in.close(); out.close(); catch (Exception e) { previous next 11 Skriv information om URL via URLConnection import java.util.date; public class GetURLInfo { public static void printinfo(url url) throws IOException { Använd URLConnection c = url.openconnection(); URLConnection 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())); previous next 12 Björn Eiderbäck 1999-2003 6
Om det är en HTTPanslutning skriv ut lite mer info 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()); Skapa URL och skriv ut info 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 <url>"); previous next 13 Skicka e-post via en URL Om maildator angiven så public class SendMail { tala om det för systemet public static void main(string[] args) { try { if (args.length >= 1) System.getProperties().put("mail.host", args[0]); Inmatningsström från terminal BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); Be användaren om brevhuvud System.out.print("From: "); String from = in.readline(); System.out.print("To: "); String to = in.readline(); System.out.print("Subject: "); String subject = in.readline(); Notera att likheten med att skicka brev i ett vanligt program för elektronisk post OBS i Lab 3 ska ni inte göra så här utan använda socketar och SMTP! previous next 14 Björn Eiderbäck 1999-2003 7
Skapa en mailto:-url URL u = new URL("mailto:" + to); URLConnection c = u.openconnection(); Vi vill skriva på URLen så vi använder en URLConnection c.setdoinput(false); // Ingen inmatning från URLen c.setdooutput(true); // men däremot utmatning till den System.out.println("Connecting"); System.out.flush(); Anslut Utmatningsström skapas c.connect(); PrintWriter out = new PrintWriter(new OutputStreamWriter(c.getOutputStream())); Skriv sidhuvud på URLen out.println("from: \"" + from + "\" <" + System.getProperty("user.name") + "@" + InetAddress.getLocalHost().getHostName() + ">"); out.println("to: " + to); out.println("subject: " + subject); out.println(); // vi avslutar med en tom rad (som indikerar att brevhuvudet är klart) previous next 15 Be användaren skriva brevkroppen Läs brevkropp och skriv den på URLen 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 [<mailhost>]"); previous next 16 Björn Eiderbäck 1999-2003 8
Vi ser också på SUNs tutorial om http://java.sun.com/docs/books/tutorial/networking/index.html Och speciellt http://java.sun.com/docs/books/tutorial/networking/urls/index.html previous next 17 Hur hittar jag info om protokoll? Vi tittar på RFC (Request For Comments) Tex via http://www.ietf.org/rfc.hml Vi tittar kort på tex SMTP, IMAP, NNTP Några länkar från boken kan vi också besöka previous next 18 Björn Eiderbäck 1999-2003 9