67
1 Networking in Java Representation and Management of Data on the Internet

1 Networking in Java Representation and Management of Data on the Internet

  • View
    217

  • Download
    0

Embed Size (px)

Citation preview

1

Networking in Java

Representation and Management

of Data on the Internet

2

Client-Server Model

64.208.34.100

132.68.7.11

132.65.32.29Port 80

Server Application

Client Application

Client Application

www.google.com

3

Client

• Initiates connection

• Retrieves data

• Displays data

• Responds to user input

• Requests more data

• Examples:

– Web Browser

– Chat Program

– PC accessing files

4

Server

• Responds to connection

• Receives request for data

• Looks it up

• Delivers it (send it)

• Examples:

– Web Server

– Database Server

– Domain Name Server

5

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 HEADER DATA

6

What is a Protocol?

Hi TCP connection request

HiTCP connectionreplyGot the

time? GET http://www.cs.huji.ac.il/~dbi

2:00<file>

time

7

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

8

How to Choose TCP or UDP

• Use TCP when reliability is critical:

– HTTP

– FTP

– Telnet

• Use UDP when reliability is not critical:

– Ping

– Clock

9

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

10

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?

11

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

12

Known Ports

• Some known ports are

– 20, 21: FTP

– 23: telnet

– 25: SMTP

– 43: whois

– 80: HTTP

– 119: NNTP

21 23 25 43 80 119

Client Application

web browsermail client

13

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

14

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

15

ProtocolHost

NamePort

Number

File Nam

e

Reference

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

16

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”);

17

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

18

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

19

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());

}

Printing URL Details

20

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

21

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

22

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

23

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?)

24

Reading From A URL

url

InputStream

openStream

BufferedReader

readLine

Page Content

25

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();

}

26

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

27

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");

}

28

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> ...

29

Connecting to A URL

url

InputStream

getInputStream

BufferedReader

URLConnection

openConnection

PrintWriter

getOutputStream

Page

println

readLine

30

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

31

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>

HTTP/1.1 200 OK

<HTML> …</HTML>

32

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

33

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

34

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);

35

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();

}

} }

36

HTTP Redirection

• Consider the case where an HTTP

redirection response is sent when trying to

read from a URL

• What should be done?

37

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}

}

}

38

http://www.cs.huji.ac.il/~dbi http://www.cs.huji.ac.il/~dbi/

http://www.google.com http://www.google.co.il/

39

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

40

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

41

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?

42

Client Requests for a Connection

64.208.34.100 132.68.7.11

132.65.32.29

Port 80

Server application

Client application

Client application

www.google.com

Port 8090

Port 8888

Port: 8090Local Port: 80Local host: www.google.comRemote host: 132.65.32.29

Port: 8888Local Port: 80Local host: www.google.comRemote host: 132.68.7.11

43

Socket

• Class Socket – implements the client side of

the connection

• Class ServerSocket – implements the server

side of the connection

44

Using a Socket

InputStream

getInputStream

BufferedReader

readLine

Page Content

Socket

host

port

45

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();

46

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

47

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

48

A Client Example

• The following is a client that connects to a

Time Server (port 13) and returns the current

time

49

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) {}

} }

50

Running the TimeClient

java TimeClient

Tue Mar 13 12:42:09 2001

51

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?

52

ServerSocket

// Constructors (partial list)

public ServerSocket(int port);

public ServerSocket(int port, int count);

// Methods (partial list)

public Socket accept();

public void close();

public InetAddress getInetAddress();

public int getLocalPort();

What happens when arunning program reachesaccept()?

Why don’t we have getPort in addition to getLocalPort?

The size of requestsqueue (default=50)

53

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

54

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();

}

}}

55

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

56

57

HelloServerimport 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; }

58

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) {} }

59

HelloClientimport java.net.*;import java.io.*;

// A client of an HelloServerclass 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; }

60

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) { }}

61

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

62

DatagramPacket Class//Constructors (partial list)

public DatagramPacket(byte ibuf[], int ilength);

public DatagramPacket(byte ibuf[], int ilength,

InetAddress iaddr, int iport);

// Methods (partial list)

public synchronized InetAddress getAddress();

public synchronized int getPort();

public synchornized byte[] getData();

int getLength();

void setAddress(InetAddress iaddr);

void setPort(int iport);

void setData(byte ibuf[]);

void setLength(int ilength);

63

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

64

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)

65

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

66

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) {}}}

67

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) {} }}