Transcript The URL

Programming TCP Clients
InetAddress Class
• An IP address identifies uniquely a host in the internet,
which consists of 4 numbers (1 byte each one) in the IPV4.
The InetAddress class is an object which store such type of
data and has some functions to get the host name from the
IP number or vice-versa
• It has no constructors, but an object factory. A new object
of this class is created with
– InetAddress n = InetAddress.getLocalHost()
– InetAddress n = InetAddress.getByName(nombre)
• Following methods can be applied:
– String nombre = n.getHostName()
– String direccion = n.getHostAddress()
• See InetExample.java & Names.java
The URL class
• URL = Uniform Resource Locator
• It is used to connect to a web server and
donload the resources it offers
PURL
The URL
• A URL is a UNIFORM RESOURCE LOCATOR. It is a unique
address of a resource a web server has released in the Internet.
• A URL consists of 3 principal components:
– the protocol descriptor . The most used may be http which stands for
HyperText Tranfer Protocol but there is also a File Transfer protocol (ftp),
Gopher, File o News.
– The hostname of the maschine which “serves” the resource
–The name of the resource in that maschine
• With Java, it is possible to open an URL and read its content as
it were stored in a file. For that, it is necessary to create an URL
object with at least the 3 components named above.
The URL
Constructors for a URL object:
–URL aRUL = new URL(“http://www.arminco.com/index.html”);
–URL aURL = new URL(“http”;”www.arminco.com”,”index.html”);
–URL aURL = new URL(“http”,”www.arminco.com”,80,”index.html”);
• While creating a URL object an exception of the
MalformedURLException class may be generated. Because of
this, some measurements must be taken (use a try-catch)
try {
}
URL miURL = new URL(....);
catch(MalFormedURLException e) {
// code for reacting to the exception
}
• Methods available for objects of the :
getProtocol(), getHost(), getPort(), getFile(),
openConnection()
The URL
If we know beforehand that the content of a URL is text, we can
retrieve it with the following piece of program:
import java.net.*;
import java,io.*;
public class LeerURL {
public static void main(String args[]) {
try {
URL miURL = new URL(“http://www.dcc.uchile.cl”);
URLConnection c = miURL.openConnection();
BufferedReader in = new BufferedReader (
new InputStreamReader(c.getInputStream()));
String line;
while ((line = in.readLine() != null)
System.out.prinln(line);
c.close();
catch(MalFormedURLException e) { System.out.pritnln(e);}
}
}
The TCP Client’s Socket
• A socket is an abstraction representing one end in a communication link
between two programs. A socket is always bound to port (although
sometimes this will be not evident for the programmer). The port is the
way an application identifies itself with the TCP/IP layer
• A server which runs on a server is associated to certain port. This
means it listen at a certain to requests from the clients whishing to
establish a communication.
• In order to establish a communication for a client it is necessary for it to
previously know 1- the port number, 2- the host address. Having this
information the client tries a rendezvous where the client is already
running and listening.
TCP Client in Java (1)
• For trying a rendezvous in Java (with a TCP server, which could have
been written in any language) we must create an object of the Socket
class
Socket calling;
String host = “a_host_address”;
calling = new Socket(host,7);
• A host address can be given as an IP number or name:
dichato.dcc.uchile.cl or 192.24.80.40. In the first case Java will do the
DNS lookup first.
• The creation of a socket is a blocking statement. This means that the
execution of the program will block until the creation returns a socket
connected to the server or a null if it fails.
• A failure to create a socket may arise if there is no such host in the
internet, if the host is not currently reachable, of if there is no server
listening to that port on that host. The is a timeout for this sentence.
• A failure will throw an Exception. It is therefore necessary to program
the socket creation within a try-and-catch block
TCP Client in Java (2)
• If the socket is created then we can open an inputStream and an
ouputStream from that socket in order to read data from an write
data into the server.
PrintWriter out = new PrintWriter(calling.getOutputStream(), true);
BufferedReader In = new BufferedReader(new
InputStreamReader(calling.getInputStream()));
• getInputStream & getOutputStream open byte oriented data
streams. Printwriter & BufferedReader are “filters” which convert
bytes into text (string with end-of-line marks) and vice-versa.
out.print(“hello”); out.println(“how are you ?”);
String linea = in.readLine();
• Print, println and readLine are blocking sentences. For using
readLine we must be sure the server will send and eol mark.
• How can we program our own echo client ?.
A Client for the date server
The date server just waits until someone tries a
rendezvous and answers with the current date of the
server. Then the server breaks the communication (3).
This means the client must try rendezvous (1) and
then read the response of the server (2).
2
3
Date server
13
1
DateClient
Client
A Client for the echo server
The echo server waits until someone makes a
rendezvous. The it reads “line-by-line” what the client
sends and answers with the same. The connection must
be broken by the client.
2
3
Echo server
7
1
EchoClient
Client
A finger client
The server waits for a request, analyses it and then
sends a (variable) set of lines. After that the server
breakes the communication
Finger [-l] [<username>]@host
3
Finger server
7
1
Finger
Client
A pop client for mail retrieving
This protocol is described in the rfc 1939 (internet
protocol descriptions)
See http://www.ietf.org/rfc.html
cliente_pop <host> <username> <password>\
3
mail pop server
110
1
Cliente_pop
Client
A SMTP client for mail sending
We will provide a graphic interface for sending
Mails from a local computer
mail SMTP
server
25
1
ClienteSMTP
Client
A generic client in Java ?
import java.io.*;
import java.net.*;
public class Cliente {
public static void main(String[] args) throws IOException {
Socket echoSocket = null; PrintWriter out = null; BufferedReader in = null;
if (args.length != 2)
System.out.println(“Use: java GClient <host> <port> ”);
int nport = Integer.parseInt(args[1]);
try {
echoSocket = new Socket(args[0], nport);
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(new
InputStreamReader(echoSocket.getInputStream()));
} catch (UnknownHostException e) {
System.err.println("Don't know about host: "+ args[0]);
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to: "+args[0]);
System.exit(1);
}
<<Process protocol according to port number>>
}
}
The Sockets constructors
• Socket(String host, int port) The port must be in
the range 1-65,535
• Socket(Inet Address host, int port)The same but
with an InetAddress object as parameter
• Socket(String host, int port, String
localHost, int localport) Every TCP communication
consists of a local and remote host and a local and remote port.
This constructor allows us to specify all them. Specifying local
address makes only sense when local computer is multihomed
(more than one address). Null = default address. Sometimes it is
necessary to specify the local port (firewalls). 0 = the system will
assign a random port number from the still available. Numbers
from 1 to 1025 should not be used as they are reserved for “well
known services” like echo, telnet finger, ftp.
More Socket methods in Java
• InetAddress getInetAddress() returns the IP address of
•
•
•
•
•
the remote host to which the socket is connected
int getPort() returns the port number to which the socket at
the other extreme is bound
InetAddress getLocalAddress() returns the IP address of
the local host
int getLocalPort() returns the port number to to which the
socket is bound.
void setSoTimeout(int timeout)sets timeout in
milliseconds for a read operation on this socket. 0 = no timeout,
this can block the operation indefinitely. If the reading operation
is not completed in that time an InterruptedIOException is
thrown
int getSoTimeout() returns the timeout of the socket
More Socket methods in Java
• void setTcpNoDelay(boolean on) Disables/Enables using the
Nagel’s algorithm which makes TCP more efficient by delaying the
writing (sending) of small amounts of data until there is enough data to
send. This may introduce some unacceptable delays for some applications.
• boolean getTcpNoDelay() returns whether the Nagel’s algorithm is
working or not
• void setSoLinger(boolean on, int val) allows to set a linger
time-out (in milliseconds). Linger is the time the socket communication
remains “open” by the system after the program closes it. This will allow
to receive packages for confirmation which are still delayed and avoid the
using of the same port on the same machine for some 4 min.
• int getSoLinger () returns the current linger setting or –1 if not set.
•
•
•
•
void
int
void
int
setSendBufferSize(int size)
getSendBufferSize()
setReceiveBufferSize(int size)
getReceiveBufferSize()
Sockets.java
Socket originated Exceptions
• Many of the Socket constructors and methods throw an
exception. These instructions should be programmed inside a
try-and-catch block
• Most of the thrown exceptions are objects from a subclass of
the IOException class
–BindException: the requested local port or address could not be
used. Typically when the port is already used or it is a system port
or the local address is not a valid one.
–ConnectException: connection refused because there was no
server listening to that port on the remote host.
–NoRouteToHostException: remote host could not be reached
typically because of network problems or a firewall
• UnknownHostException: the given host address is not valid
(DNS Lookup filed)