Transcript ppt
Networking in Java
Representation and Management
of Data on the Internet
1
Client-Server Model
Client
Application
Port 80
132.65.32.29
Server
Application
64.208.34.100
www.google.com
Client
Application
132.68.7.11
2
Client
• Initiates connection
• Retrieves data
• Displays data
• Responds to user input
• Requests more data
• Examples:
– Web Browser
– Chat Program
– PC accessing files
3
Server
• Responds to connection
• Receives request for data
• Looks it up
• Delivers it (send it)
• Examples:
– Web Server
– Database Server
– Domain Name Server
4
Internet Architecture Model
Application Layer (HTTP, FTP, our applications) DATA
Transport Layer (TCP/IP,UDP)
HEADER
DATA
Internet Layer (IP)
HEADER
HEADER
DATA
Network Layer
HEADER
HEADER
DATA
HEADER
5
What is a Protocol?
Hi
TCP connection
request
Hi
TCP connection
reply
Got the
time?
GET http://www.cs.huji.ac.il/~dbi
2:00
<file>
time
6
TCP and UDP
• TCP (Transmission Control Protocol)
– connection-based protocol
– provides a reliable flow of data between two computers
• UDP (User Datagram Protocol)
– a protocol that sends independent packets of data,
called datagrams, from one computer to another
– arrival of datagrams is not guaranteed
– UDP is not connection-based like TCP
7
How to Choose TCP or UDP
• Use TCP when reliability is critical:
– HTTP
– FTP
– Telnet
• Use UDP when reliability is not critical:
– Ping
– Clock
8
Host and Port
• Destination in the Internet is identified by: host +
port
– a 32 bits IP-address
– a 16 bits port
• Q: Why don’t we specify the port in a Web
browser?
• Ports 0-1023 are restricted
– Do not use them
9
Destination of a Connection
• Q: How does an HTTP request “know”
where is the server to which it is intended?
• Q: How does an HTTP response “know”
where is the client to which it is intended?
• Q: There can be more then one application
running on the same host, how do we know
to which application a message is intended?
10
A Connection to Many Applications
• Q: There can be many applications that are on the
same time connected to the same host,
(for example, many browser and one search engine)
How do we send the right transmission to each
client?
• A: By adding the IP address of the client and the
port of the client to the IP packets
11
Known Ports
Client
Application
• Some known ports are
– 20, 21: FTP
mail client
– 23: telnet
web browser
– 25: SMTP
– 43: whois
21
23
25
43
80 119
– 80: HTTP
– 119: NNTP
12
Internet Addresses
• InetAddress – a class that represents Internet
Protocol (IP) addresses and the names of hosts
• Getting the InetAdddress:
– getLocalHost: Returns the local host
– getByName(String host): For the given host name
one of its IP addresses is returned
– getAllByName(String host): For a given host
name all its IP addresses are returned
13
Methods of InetAddress
• getHostAddress: Returns the IP address of
the host, in the form “%d.%d.%d.%d”
• getHostName: Returns the name of the host
14
Working with URLs
• URL (Uniform Resource Locator) - a reference
(an address) to a resource on the Internet
http://www.cs.huji.ac.il:80/~dbi/main.html#notes
Protocol
Host
Name
Port
Number
File
Name
Reference
15
Creating URLs
• The class URL is defined in the package:java.net
• Basic constructor:
– URL w3c = new URL("http://www.w3.org/");
• Relative links:
– Are created from baseURL + relativeURL
– URL amaya = new URL(w3c, “Amaya/Amaya.html”);
– URL jigsaw = new URL(w3c, “Jigsaw#Getting”);
16
Creating URLs (cont.)
• The following two are equivalent:
URL dbiNotes =
new URL(“http://www.cs.huji.ac.il:80/” +
“~dbi/main.html#notes”);
URL dbiNotes = new URL(“http”,
“www.cs.huji.ac.il”, 80,
“~dbi/main.html#notes”);
• URL Construction can throw:
MalformedURLException
17
Why Do We Need the URL Class?
• The main usage of URL is for parsing URLs
– getting the protocol
– getting the host
– getting the port
– getting the file name
– getting the reference
• Can supply URLConnection
18
Printing URL Details
import java.net.*;
public class UrlUtilities {
public static void printUrlDetails(URL url)
{
System.out.println("Protocol: “ +
url.getProtocol());
System.out.println("Host: " + url.getHost());
System.out.println("File name: " + url.getFile());
System.out.println("Port: " + url.getPort());
System.out.println("Reference: " + url.getRef());
}
19
Running the Example (1)
• If we try:
– printUrlDetails(“http://www.cs.huji.ac.il”)
• We get:
– Protocol: http
– Host: www.cs.huji.ac.il
– File name:
– Port: -1
– Reference: null
20
Running the Example (2)
• If we try:
– printUrlDetails(“http://www.cs.huji.ac.il:80/~dbi/
main.html#notes”)
• We get:
– Protocol: http
– Host: www.cs.huji.ac.il
– File name: /~dbi/main.html
– Port: 80
– Reference: notes
21
Comparing Two URLs
boolean sameFile(URL other)
• Compares two URLs, excluding the "ref" fields
• Returns true if this URL and the other argument
both refer to the same resource
• The two URLs might not both contain the same
anchor
22
Connection with a Web Resource
• We want to establish connection with servers:
– Read web page content
– Send parameters to web servers
• A URL object is no more than an object that
represents a web address, so how can we read
“its” content?
• The solution: work over the network (in which other
technology this solution was used?)
23
Reading From A URL
url
openStream
InputStream
BufferedReader
readLine
Page Content
24
import java.net.*;
import java.io.*;
public class UrlUtilities {
public static void printUrlDetails(URL url)
......
public static void printUrlContents(URL url)
throws IOException {
BufferedReader in = new BufferedReader(
new InputStreamReader(url.openStream()));
String inputLine;
while ((inputLine = in.readLine())!= null)
System.out.println(inputLine);
in.close();
}
25
Reading From a URL
• For reading a URL using a proxy, we run java with
the environment variables for http.proxyHost
and http.proxyPort set properly:
java -Dhttp.proxyHost=wwwproxy.cs.huji.ac.il
–Dhttp.proxyPort=8080 ...
• Another option is to set the environment variables
in the program itself
26
import java.net.*; I
import java.io.*;
public class UrlUtilities {
public static void printUrlDetails (URL url)
......
public static void printUrlContents(URL url)
......
public static void setHujiProxy {
System.setProperty("http.proxyHost",
"wwwproxy.cs.huji.ac.il");
System.setProperty("http.proxyPort","8080");
}
27
Running the example
• If we try:
– printUrlContents(“http://www.cs.huji.ac.il
/~dbi”)
• We get:
<HTML><HEAD><META NAME="Description"
CONTENT="The dbi course homepage">
<TITLE>Representation and Management of
Data on the Internet</TITLE> ...
28
Connecting to A URL
url
openConnection
URLConnection
getInputStream
InputStream
getOutputStream
PrintWriter
BufferedReader
println
Page
readLine
29
Interacting with a CGI script
• Create a URL
• Open a connection to the URL
• Set output capability on the URLConnection
• Get an output stream from the connection
– This output stream is connected to the standard input
stream of the cgi-bin script on the server
• Write to the output stream
• Close the output stream
30
HTTP connections
• You can create a connection to an HTTP server
with an object
HttpURLConnection
• This object extends the URLConnection object
– getResponseCode
– getResponseMessage
– setRequestMethod
• Look in the Java API
HTTP/1.1 200 OK
<HTML>
…
</HTML>
31
URLEncoder
• Contains a utility method encode for converting a
string into an encoded format
• To convert a string, each character is examined in
turn:
– The ASCII characters 'a' – 'z', 'A' – 'Z', '0' – '9', ".", "-", "*",
"_" remain the same
– Space is converted into a plus sign '+'
– All other characters are converted into the 3-character
string "%xy", where xy is the two-digit hexadecimal
representation of the lower 8-bits of the character
32
URL Connection Example
• The next example connects to a CGI script
on www.walla.co.il – a search tool is given a
word to search
33
import java.net.*;
import java.io.*;
public class SearchWalla {
public static main(String args[]) {
try {
UrlUtilities.setHujiProxy();
URL url = new
URL(“http://search.walla.co.il/guide/h_srch.cgi”);
URLConnection connection = url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setAllowUserInteraction(false);
34
PrintWriter out =
new PrintWriter(connection.getOutputStream());
out.println("q=" + URLEncoder.encode(args[0]));
out.close();
BufferedReader in = new BufferedReader (
new InputStreamReader (
connection.getInputStream() ));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
} catch (Exception e) {
e.printStackTrace();
}
} }
35
HTTP Redirection
• Consider the case where an HTTP
redirection response is sent when trying to
read from a URL
• What should be done?
36
import java.net.*;
Import java.io.*;
public class UrlUtilities {
...
public static URL getRealURL(URL url) {
URL realURL = null;
try {
URLConnection con = url.openConnection();
con.getContentLength();
realURL = con.getURL();
} catch (IOException e) {e.printStackTrace}
}
}
37
http://www.google.com http://www.google.co.il/
http://www.cs.huji.ac.il/~dbi http://www.cs.huji.ac.il/~dbi/
38
Sockets
• Communication is between sockets
• A socket is one end-point of a two-way
communication link between two programs running
on the network
• A socket has a binding to a port to which it listens
• A socket implementation gives us the ability to read
from it and write to it as if it is a file
39
In Sockets
• A socket ‘knows’ the following things
– The port number of the remote host
– The host name (InetAddress) of the remote host
– The local port to which it is bound
– The local address of its local host
40
Sockets
• The server has a socket that listens to a known
port, e.g., Web server and port 80
• The server waits (listening to the socket) until a
client requests a connection
• A client requests a connection on the known host
and port of the server
• Q: What should the server do so that it can serve
other clients as well?
41
Client Requests for a Connection
Port: 8090
Local Port: 80
Local host:
www.google.com
Remote host:
132.65.32.29
Port: 8888
Local Port: 80
Local host:
www.google.com
Remote host:
132.68.7.11
Server application
64.208.34.100
Port 8090
Port 80
Client application
132.65.32.29
Port 8888
Client application
132.68.7.11
www.google.com
42
Socket
• Class Socket – implements the client side of
the connection
• Class ServerSocket – implements the server
side of the connection
43
Using a Socket
host
Socket
port
getInputStream
InputStream
BufferedReader
readLine
Page Content
44
Using a Socket
// Constructors (partial list)
public Socket(String host, int port);
// Methods (partial list)
public void close();
public InetAddress getInetAddress();
public int getLocalPort();
public InputStream getInputStream();
public OutputStream getOutputStream();
public int getPort();
45
Using a Socket (client)
• A client:
1. Opens a socket (with a binding to which port?)
2. Opens an input stream and output stream to
the socket
3. Reads from and write to the stream according
to the client’s protocol
4. Closes the streams
5. Closes the socket
46
Using a Socket (cont.)
•
A server:
1. Opens a socket
2. Opens an input stream and output stream to
the socket
3. Reads from and writes to the stream according
to the server's protocol
4. Closes the streams
5. Closes the socket
47
A Client Example
• The following is a client that connects to a
Time Server (port 13) and returns the current
time
48
import java.net.*; import java.io.*;
public class TimeClient {
public static void main(String[] args) {
int TimePort = 13;
String host = "www.cs.huji.ac.il";
try {
Socket socket = new Socket(host, TimePort);
BufferedReader in = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
String lineInput;
while ((lineInput = in.readLine()) != null)
System.out.println(lineInput);
} catch (UnknownHostException e) {
} catch (IOException ioe) {}
} }
49
Running the TimeClient
java TimeClient
Tue Mar 13 12:42:09 2001
50
Server Socket
• A socket in a server that listen on a known
port, e.g., port 80
• Q: Why do we need a server socket in
addition to a socket?
51
ServerSocket
// Constructors (partial list)
public ServerSocket(int port);
The size of requests
queue (default=50)
public ServerSocket(int port, int count);
// Methods (partial list)
public Socket accept();
public void close();
What happens when a
running program reaches
accept()?
public InetAddress getInetAddress();
public int getLocalPort();
Why don’t we have getPort
in addition to getLocalPort?
52
A Server Example
• The following is a time server that returns
the time
• Note: When the ServerSocket constructor is
given port number 0, a random free port is
chosen
53
import java.net.*; import java.io.*;
public class TimeServer {
public static void main(String[] args) throws
Exception {
InetAddress localHost = InetAddress.getLocalHost();
ServerSocket listen = new ServerSocket(0);
System.out.println("Listening on port " +
listen.getLocalPort() + " of host " + localHost);
while (true) {
Socket client = listen.accept();
System.out.println(client.toString());
PrintWriter out = new
PrintWriter(client.getOutputStream(), true);
out.println(new Date());
client.close();
}
}}
54
Working with Server Socket
• A ServerSocket waits for requests to come in over
the network
• Upon request, a new socket is constructed (does
this new socket contain the details of the server or
the details of the client?)
• The server performs some operation based on that
request, and then possibly returns a result to the
requester through the new socket
55
56
HelloServer
import java.net.*;
import java.io.*;
// A server that says 'hello'
class HelloServer {
public static void main(String[] args) {
int port = Integer.parseInt(args[0]);
ServerSocket server = null;
try {
server = new ServerSocket(port);
} catch (IOException ioe) {
System.err.println("Couldn't run" +
"server on port " + port);
return;
}
57
HelloServer (cont.)
while(true) {
try {
Socket connection = server.accept();
BufferedReader reader =
new BufferedReader(
new InputStreamReader(
connection.getInputStream()));
PrintWriter writer =
new PrintWriter(
new OutputStreamWriter(
connection.getOutputStream()));
String clientName = reader.readLine();
writer.println("Hello " + clientName);
writer.flush();
} catch (IOException ioe1) {}
}
58
import java.net.*;
import java.io.*;
HelloClient
// A client of an HelloServer
class HelloClient {
public static void main(String[] args) {
String hostname = args[0];
int port = Integer.parseInt(args[1]);
Socket connection = null;
try {
connection = new Socket(hostname, port);
} catch (IOException ioe) {
System.err.println("Connection failed");
return;
}
59
HelloClient (cont.)
try {
BufferedReader reader =
new BufferedReader(
new InputStreamReader(
connection.getInputStream()));
PrintWriter writer =
new PrintWriter(
new OutputStreamWriter(
connection.getOutputStream()));
writer.println(args[2]); // client name
writer.flush();
String reply = reader.readLine();
System.out.println("Server reply: "+reply);
} catch (IOException ioe1) {
}
}
60
Datagrams
• Datagram packets are used to implement a connectionless,
packet based, delivery service
• Each message is routed from one machine to another
based solely on information contained within that packet
• Multiple packets sent from one machine to another might be
routed differently, and might arrive in any order
• Packets may be lost or duplicated during transit
• The class DatagramPacket represents a datagram in Java
61
DatagramPacket Class
//Constructors (partial list)
public DatagramPacket(byte ibuf[], int ilength);
public DatagramPacket(byte ibuf[], int ilength,
InetAddress iaddr, int iport);
// Methods (partial
public synchronized
public synchronized
public synchornized
int getLength();
void
void
void
void
list)
InetAddress getAddress();
int getPort();
byte[] getData();
setAddress(InetAddress iaddr);
setPort(int iport);
setData(byte ibuf[]);
setLength(int ilength);
62
DatagramSocket
• This class represents a socket for sending and receiving
datagram packets
• Addressing information for outgoing packets is contained in
the packet header
• A socket that is used to read incoming packets must be
bound to an address (sockets that are used for sending must be
bound as well, but in most cases it is done automatically)
• There is no special datagram server socket class (why?)
• Since packets can be lost, the ability to set timeouts is
important
63
Class DatagramSocket
// Constructors (partial list)
DatagramSocket()
DatagramSocket(int port)
// Methods (partial list)
void close()
int getLocalPort()
int getSoTimeout()
void receive(DatagramPacket p)
void send(DatagramPacket p)
setSoTimeout(int timeout)
64
Echo Servers
• A common network service is an echo server
• An echo server simply sends packets back
to the sender
• A client creates a packet, sends it to the
server, and waits for a response
• Echo services can be used to test network
connectivity and performance
65
import java.net.*; import java.io.*; import java.util.*;
public class EchoClient {
int echoPort = 7000, msgLen = 16, timeOut=1000;
public static void main(String argv[]) {
try {
DatagramSocket socket = new DatagramSocket();
DatagramPacket packet;
byte msg[] = new byte[msgLen];
InetAddress echoHost = InetAddress.getByName(argv[0]);
packet = new
DatagramPacket(msg,msgLen,echoHost,echoPort);
socket.send(packet);
socket.setSoTimeout(timeOut);
socket.receive(packet);
}
catch (InterruptedIOException e)
{System.out.println("Timeout");}
catch (Exception e) {}}}
66
import java.net.*;import java.io.*;import java.util.*;
public class EchoServer {
static int echoPort = 7000;
public static void main(String args[]) {
try {
DatagramSocket socket = new DatagramSocket(echoPort);
DatagramPacket p,reply;
for (;;) {
sock.receive(p);
System.out.println(p.getAddress());
reply = new DatagramPacket(p.getData(),p.getLength(),
p.getAddress(),p.getPort());
socket.send(reply);
}
} catch (Exception e) {} }}
67