Hämta data mha URLer
Föreläsning 7
Innehåll
För mer info se tex
Harold, Hall eller Tut (den
senare är
ganska rättfram).
• 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
previous
next
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 gt = new URL(”http://www.gt.kth.se/");
• En URL kan skapas relativt en annan
URL ip =
new URL(gt, ”education/kurspm/4K1525/default.html");
• Generellt kan vi ange både protokoll, webplats, fil och portnummer
separat
URL nada = new URL(”http”, ” www.gt.kth.se”, 80,
”education/kurspm/4K1525/default.html");
previous
next
2
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 ta hand om undantaget
previous
next
3
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
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
BufferedReader buffer = new BufferedReader(new
InputStreamReader(content));
String line;
while((line = readLine(buffer)) != null)
System.out.println(line);
Läs radvis
previous
next
4
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
previous
next
5
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
previous
next
6
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();
}
}
previous
next
7
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)
previous
next
8
Nätverk och internet grunder
Några exempel
• Nu följer tre exempel på lite olika användning av
URLer
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
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) {
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
URL url = new URL(args[0]);
in = url.openStream();
if (args.length == 2)
out = new FileOutputStream(args[1]);
else out = System.out;
öppna inström
välj typ av
utström
(fil eller
terminal)
previous
next
10
Nätverk och internet grunder
...
kopiera
innehållet
till utström
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) {}
}
stäng alltid
strömmarna
}
}
previous
next
11
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();
Använd
c.connect();
URLConnection
System.out.println("
System.out.println("
System.out.println("
System.out.println("
System.out.println("
System.out.println("
previous
next
Content Type: " + c.getContentType());
Content Encoding: " + c.getContentEncoding());
Content Length: " + c.getContentLength());
Date: " + new Date(c.getDate()));
Last Modified: " + new Date(c.getLastModified()));
Expiration: " + new Date(c.getExpiration()));
12
Nätverk och internet grunder
...
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());
}
}
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>");
}
}
Skapa URL
och skriv ut
info
}
previous
next
13
Nätverk och internet grunder
Skicka e-post via en URL
import java.io.*;
import java.net.*;
Om maildator angiven så
tala om det för systemet
public class SendMail {
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
previous
System.out.print("From: ");
String from = in.readLine();
System.out.print("To: ");
String to = in.readLine();
System.out.print("Subject: ");
String subject = in.readLine();
next
Notera att likheten med att skicka
brev i ett vanligt program
för elektronisk post
14
Nätverk och internet grunder
...
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
c.connect();
PrintWriter out =
new PrintWriter(new OutputStreamWriter(c.getOutputStream()));
Utmatningsström skapas
Skriv sidhuvud
”på URLen”
previous
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)
next
15
Nätverk och internet grunder
...
Be användaren
skriva brevkroppen
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);
}
Läs brevkropp
och skriv den
på ”URLen”
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