Networking with Java. Introduction to Networking.

50
Networking Networking with Java with Java
  • date post

    15-Jan-2016
  • Category

    Documents

  • view

    268
  • download

    4

Transcript of Networking with Java. Introduction to Networking.

Page 1: Networking with Java. Introduction to Networking.

Networking with Networking with JavaJava

Page 2: Networking with Java. Introduction to Networking.

Introduction to NetworkingIntroduction to Networking

Page 3: Networking with Java. Introduction to Networking.

ProtocolsProtocols

Hi TCP connection request

HiTCP connectionreplyGot the

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

2:00<file>

time

Client

Server

Page 4: Networking with Java. Introduction to Networking.

Internet Architecture ModelInternet Architecture Model

Application (HTTP, FTP) DATA

Transport (TCP,UDP) HEADER DATA

Network (IP) HEADER HEADER DATA

Link (LINK) HEADER HEADER HEADER DATA

Page 5: Networking with Java. Introduction to Networking.

TCP (TCP (Transmission-Control Protocol)Transmission-Control Protocol)

• Enables symmetric byte-stream transmission between two

endpoints (applications)

• Reliable communication channel

• TCP perform these tasks:

- connection establishment by handshake (relatively slow)

- division to numbered packets (transferred by IP)

- error correction of packets (checksum)

- acknowledgement and retransmission of packets

- connection termination by handshake

Page 6: Networking with Java. Introduction to Networking.

UDP (User Datagram Protocol)UDP (User Datagram Protocol)

• Enables direct datagram (packet) transmission from one

endpoint to another

• No reliability (except for data correction)

- sender does not wait for acknowledgements

- arrival order is not guaranteed

- arrival is not guaranteed

• Used when speed is essential, even in cost of reliability

- e.g., streaming media, games, Internet telephony, etc.

Page 7: Networking with Java. Introduction to Networking.

PortsPorts

• A computer may have several applications that

communicate with applications on remote computers

through the same physical connection to the network

• When receiving a packet, how can the computer tell

which application is the destination?

• Solution: each channel endpoint is assigned a unique

port that is known to both the computer and the other

endpoint

Page 8: Networking with Java. Introduction to Networking.

Ports (cont)Ports (cont)

• Thus, an endpoint application on the Internet is

identified by

- A host name → 32 bits IP-address

- A 16 bits port

• Q: Why don’t we specify the port in a Web

browser?

Page 9: Networking with Java. Introduction to Networking.

Known PortsKnown Ports

• Some known ports are

- 20, 21: FTP

- 23: TELNET

- 25: SMTP

- 110: POP3

- 80: HTTP

- 119: NNTP

21 23 25 110 80 119

Client Application

web browsermail client

Page 10: Networking with Java. Introduction to Networking.

SocketsSockets

• A socket is a construct that represents one end-point of a

two-way communication channel between two programs

running on the network

• Using sockets, the OS provides processes a file-like

access to the channel

- i.e., sockets are allocated a file descriptor, and processes can

access (read/write) the socket by specifying that descriptor

• A specific socket is identified by the machine's IP and a

port within that machine

Page 11: Networking with Java. Introduction to Networking.

Sockets (cont)Sockets (cont)

• A socket stores the IP and port number of the other end-

point computer of the channel

• When writing to a socket, the written bytes are sent to

the other computer and port (e.g., over TCP/IP)

- That is, remote IP and port are attached to the packets

• When OS receives packets on the network, it uses their

destination port to decide which socket should get the

received bytes

Page 12: Networking with Java. Introduction to Networking.

Client-Server ModelClient-Server Model

• A common paradigm for distributed applications

• Asymmetry in connection establishment:

- Server waits for client requests (daemon) at a well known

address (IP+port)

- Connection is established upon client request

• Once the connection is made, it can be either symmetric

(TELNET) or asymmetric (HTTP)

• For example: Web servers and browsers

Page 13: Networking with Java. Introduction to Networking.

Client-Server InteractionClient-Server Interaction

Client

Server

80

Client

Page 14: Networking with Java. Introduction to Networking.

Client-Server InteractionClient-Server Interaction

Client

Server

80

Client

6945

Page 15: Networking with Java. Introduction to Networking.

Client-Server InteractionClient-Server Interaction

Client

Server

80

Client

1932

6945

Page 16: Networking with Java. Introduction to Networking.

Client-Server InteractionClient-Server Interaction

Client

Server

80

Client

1932

6945

8002

Page 17: Networking with Java. Introduction to Networking.

Client-Server InteractionClient-Server Interaction

Client

Server

80

Client

1932

6945

8002

2341

Page 18: Networking with Java. Introduction to Networking.

Java SocketsJava Sockets

Low-Level Networking

Page 19: Networking with Java. Introduction to Networking.

Java SocketsJava Sockets

• Java wraps OS sockets (over TCP) by the objects of

class java.net.Socket

• new Socket(String remoteHost, int remotePort) creates a

TCP socket and connects it to the remote host on the

remote port (hand shake)

• Write and read using streams:

- InputStream getInputStream()

- OutputStream getOutputStream()

Page 20: Networking with Java. Introduction to Networking.

A Socket ExampleA Socket Example

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

public class SimpleSocket {

  public static void main(String[] args) throws IOException { ... next slide ...

 }}

Page 21: Networking with Java. Introduction to Networking.

 Socket socket = new Socket("www.cs.huji.ac.il", 80);    InputStream istream = socket.getInputStream();    OutputStream ostream = socket.getOutputStream();

    String request =       "GET /~dbi/admin.html HTTP/1.1\r\n"  +       "Host: www.cs.huji.ac.il\r\n" +       "Connection: close\r\n\r\n";            ostream.write(request.getBytes());

    byte[] response = new byte[4096]; int bytesRead = -1; 

    while ((bytesRead = istream.read(response)) >= 0) {      System.out.write(response, 0, bytesRead);    }    socket.close();

Page 22: Networking with Java. Introduction to Networking.
Page 23: Networking with Java. Introduction to Networking.

Java Java ServerSocketServerSocket

• ServerSocket represents a socket that listens and waits for

requests from clients

• Construction:

- new ServerSocket(int port)

- Why do want to specify the port?

• Listen and accept incoming connections

- Socket accept()

- returns a new socket (with a new port) for the new channel

- blocks until connection is made

Page 24: Networking with Java. Introduction to Networking.

public class EchoServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(8000); Socket socket = null;

while (true) { try { ... next slide ... } catch (IOException exp) { ... }

finally { try {if (!socket.isClosed()) socket.close(); } catch (IOException e) {} }}}}

Page 25: Networking with Java. Introduction to Networking.

socket = serverSocket.accept();

String clientName = socket.getInetAddress().getHostName();

BufferedReader reader = new BufferedReader( new InputStreamReader(socket.getInputStream())); PrintStream writer = new PrintStream(socket.getOutputStream());

writer.println("Hello " + clientName + "!"); writer.flush();

String lineRead = null;

while ((lineRead = reader.readLine()) != null) { writer.println("You wrote: " + lineRead); writer.flush(); }

Page 26: Networking with Java. Introduction to Networking.

Accepting ConnectionsAccepting Connections

• Usually, the accept() method is executed within

an infinite loop

- i.e., while(true){...}

• Whenever accept() returns, a new thread is

launched to handle that interaction

• Hence, the server can handle several requests

concurrently

Page 27: Networking with Java. Introduction to Networking.

TimeoutTimeout

• You can set timeout values to these blocking

methods:

- read() of Socket

- accept() of ServerSocket

• Use the method setSoTimeout(milliseconds)

• If timeout is reached before the method returns,

java.net.SocketTimeoutException is thrown

Page 28: Networking with Java. Introduction to Networking.

Java Sockets and HTTPJava Sockets and HTTP

Page 29: Networking with Java. Introduction to Networking.

HTTP Message StructureHTTP Message Structure

• A HTTP message has the following structure:

Request/Status-Line \r\nHeader1: value1 \r\nHeader2: value2 \r\n...HeaderN: valueN \r\n\r\n

Message-BodyMessage-Body

Page 30: Networking with Java. Introduction to Networking.

Reading HTTP MessagesReading HTTP Messages

• Several ways to interpret the bytes of the body

- Binary: images, compressed files, class files, ...

- Text: ASCII, Latin-1, UTF-8, ...

• Commonly, applications parse the headers of the

message, and process the body according to the

information supplied by the headers

- E.g., Content-Type, Content-Encoding, Transfer-Encoding

Page 31: Networking with Java. Introduction to Networking.

An ExampleAn Example

Page 32: Networking with Java. Introduction to Networking.

Parsing the HeadersParsing the Headers

• So how are the headers themselves are represented?

• Answer: The headers of a HTTP message must be in

US-ASCII format (1 byte per character)

• However, in order to parse the headers, it may be

impossible to use readLine() of BufferedReader,

since the body should be later read as binary bytes

• Hence, we convert bytes to characters

Page 33: Networking with Java. Introduction to Networking.

Socket socket = new Socket(argv[0], 80); InputStream istream = socket.getInputStream();OutputStream ostream = socket.getOutputStream();

 String request = "GET / HTTP/1.1\r\n" +                 "Host: " + argv[0] + "\r\n" +              "Connection: close\r\n\r\n"; ostream.write(request.getBytes());

StringBuffer headers = new StringBuffer(); int byteRead = 0;while ( !endOfHeaders(headers) && 

(byteRead = istream.read()) >= 0) {      headers.append((char) byteRead);}System.out.print(headers);socket.close();

Example: Extracting the HeadersExample: Extracting the Headers

Page 34: Networking with Java. Introduction to Networking.

public static boolean endOfHeaders(StringBuffer headers) {     int lastIndex = headers.length() - 1;

    if (lastIndex < 3 || headers.charAt(lastIndex) != '\n')      return false;

    return ( headers.substring(lastIndex - 3, lastIndex + 1)         .equals("\r\n\r\n"));  }

Example: Extracting the Headers Example: Extracting the Headers (cont)(cont)

Page 35: Networking with Java. Introduction to Networking.

Persistent ConnectionsPersistent Connections

• According to HTTP/1.1, a server does not have to close the

connection after fulfilling your request

• One connection (socket) can be used for several requests and

responses send more requests

- even while earlier responses are being transferred (pipelining)

• Question: how can the client know when one response ends

and a new one begins?

• To avoid persistency, require explicitly by the header:

Connection: close

Page 36: Networking with Java. Introduction to Networking.

URL and URLConnectionURL and URLConnection

High-Level Networking

Page 37: Networking with Java. Introduction to Networking.

ProtocolHost

NamePort

Number

File Nam

e

Reference

Working with URLsWorking 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

Page 38: Networking with Java. Introduction to Networking.

The Class URLThe Class URL

• The class URL is used for parsing URLs

• Constructing URLs:

- URL w3c1 = new URL("http://www.w3.org/TR/");

- URL w3c2 = new URL("http","www.w3.org",80,"TR/");

- URL w3c3 = new URL(w3c2, "xhtml1/");

• If the string is not an absolute URL, then it is considered

relative to the URL

Page 39: Networking with Java. Introduction to Networking.

Parsing URLsParsing URLs

• The following methods of URL can be used for

parsing URLs

getProtocol(), getHost(), getPort(), getPath(),

getFile(), getQuery(), getRef(), getQuery()

Page 40: Networking with Java. Introduction to Networking.

The class URLConnectionThe class URLConnection

• To establish the actual resource, we can use the object

URLConnection obtained by url.openConnection()

• If the protocol of the URL is HTTP, the returned object

is of class HttpURLConnection

• This class encapsulates all socket management and

HTTP directions required to obtain the resource

Page 41: Networking with Java. Introduction to Networking.

public class ContentExtractor {

  public static void main(String[] argv) throws Exception {    URL url = new URL(argv[0]);        System.out.println("Host: " + url.getHost());    System.out.println("Protocol: " + url.getProtocol());    System.out.println("----");            URLConnection con = url.openConnection();    InputStream stream = con.getInputStream();            byte[] data = new byte[4096]; int bytesRead = 0;     while((bytesRead=stream.read(data))>=0) {       System.out.write(data,0,bytesRead);}}}

Page 42: Networking with Java. Introduction to Networking.
Page 43: Networking with Java. Introduction to Networking.

About URLConnectionAbout URLConnection

• The life cycle of a URLConnection object has two

parts:

- Before actual connection establishment

• Connection configuration

- After actual connection establishment

• Content retrieval

• Passage from the first phase to the second is implicit

- A result of calling some committing methods, like getDate()

Page 44: Networking with Java. Introduction to Networking.

About HttpURLConnectionAbout HttpURLConnection

• The HttpURLConnection class encapsulates all HTTP

transaction over sockets, e.g.,

- Content decoding

- Redirection

- Proxy indirection

• However, you can control requests by its methods

- setRequestMethod, setFollowRedirects,

setRequestProperty, ...

Page 45: Networking with Java. Introduction to Networking.

Sending POST RequestsSending POST Requests

• In order to send POST requests with

HttpURLConnection, you have to do the following:

- Enable connection output: con.setDoOutput(true);

- Get the output stream: con.getOutputStream()

• This changes the method from GET to POST

- Write the message body into the stream

- close the stream (important!)

Page 46: Networking with Java. Introduction to Networking.

URL url = new URL("http://find.walla.co.il/");URLConnection connection = url.openConnection();connection.setDoOutput(true);

String query = "q=" + URLEncoder.encode(args[0], "UTF-8");    OutputStream out = connection.getOutputStream();  out.write(query.getBytes());out.close();

InputStream in = connection.getInputStream();int bytesRead = -1;  byte[] response = new byte[4096];while ((bytesRead = in.read(response)) >= 0)      System.out.write(response, 0, bytesRead);in.close();

Page 47: Networking with Java. Introduction to Networking.

POST / HTTP/1.1User-Agent: Java/1.5.0_01Host: find.walla.co.ilAccept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2Connection: keep-aliveContent-type: application/x-www-form-urlencodedContent-Length: 18

q=Java+networking

java SearchWalla "Java networking"

Sent HeadersSent Headers

Page 48: Networking with Java. Introduction to Networking.

URLEncoderURLEncoder

• Contains a utility method encode for converting a string

into an encoded format (used in URLs)

• To convert a string, each character is examined in turn:

- Space is converted into a plus sign +

- a-z, A-Z, 0-9, ., -, * and _ remain the same.

- The bytes of all special characters are replaced by

hexadecimal numbers, preceded with %

• To decode an encoded string, use decode() of the class

URLDecoder

Page 49: Networking with Java. Introduction to Networking.

Defining Default ProxyDefining Default Proxy

• For reading a URL using a proxy, we run java with the

environment variables for http.proxyHost and http.proxyPort set

properly: java -DproxyHost=wwwproxy.huji.ac.il –DproxyPort=8080 ...

• Another option is to set the environment variables in the

program itselfSystem.getProperties().put( "proxyHost", "wwwproxy.huji.ac.il" );

System.getProperties().put( "proxyPort", "8080" );

Page 50: Networking with Java. Introduction to Networking.

Not Covered: UDP ConnectionsNot Covered: UDP Connections

• The URL, URLConnection, Socket and

ServerSocket classes all use the TCP protocol to

communicate over the network

• Java programs can also use UDP protocol for

communication

• For that, use DatagramPacket, DatagramSocket,

and MulticastSocket classes