Transcript WECPP

Java networking
Jim Briggs
based on notes by Amanda Peart
based on Bell & Parr's bonus chapter
http://www.shu.ac.uk/java/networkprogramming/starthere.html
WECPP
1
Aims
•
•
•
•
•
To understand Java networking
To appreciate socket programming
Define the client socket
How to use sockets
Overview of server sockets
WECPP
2
Review Internet basics
• TCP/IP protocol (contra UDP/IP)
– ensures reliable transmission of data
• IP address
– identifies Internet host (strictly interface)
• Domain name
– user-friendly way of identifying hosts
– DNS maps names to IP addresses (and vice-versa)
• Port
– identifies particular service on a host (e.g. HTTP = 80)
WECPP
3
Sockets
• Sockets
– abstract input-output devices
– could apply to any sort of device, but most often
referred to in the context of networking:
• software mechanism for one program to talk to another
• Two-way connection between two programs
– full-duplex link
– more than one socket can be associated with a port
WECPP
4
Client and server sockets
• Client socket and server socket need to be
programmed in different ways
• Client socket assumes the server is ready to
accept connections
• Server needs to listen for connection
requests
WECPP
5
How is a socket used?
• A new socket is created by a program
• The socket attempts to connect to a remote
host
• Once the connection has been established,
the local machine and the remote machine
send and receive data
• When the transmission is complete, one or
both machines closes the connection
WECPP
6
Socket Programming
• Java uses ‘class Sockets’ to interface to TCP
sockets (import java.net.*)
• The constructor method for the class:
• creates a TCP socket
• allows the user to specify a host and port
• attempts to connect to the host
Socket connection = new Socket("www.port.ac.uk", 80);
Socket connection = new Socket(InetAddress, port);
WECPP
7
When connection is established...
• The client host port is chosen by the system at run
time
• The client port number can be accessed using:
connection.getLocalPort()
• A socket is closed when:
– The socket is garbage collected
– The program ends
– The program explicitly closes it:
connection.close()
WECPP
8
Errors and exceptions
• ConnectException
– The connection is refused by the remote host.
– Host could be busy or there might be no server
on the port
• NoRouteToHostException
– The connection has timed out.
WECPP
9
Input with sockets
• For input it is most convenient to create a
BufferedReader (java.io) as follows:
BufferedReader in = new BufferedReader (new
InputStreamReader(socket.getInputStream()));
• This enables readLine to be used for string input.
Data ends when null is returned. Example:
String line;
while ((line = in.readLine()) != null) {
processLine();
}
WECPP
10
Output with sockets
• For output to a stream it is convenient to create a
PrintWriter (java.io) object as follows:
PrintWriter out = new
PrintWriter(socket.getOutputStream(), true);
• Use method println to output a line.
out.println("string");
• Closing a socket closes all of the associated
streams.
WECPP
11
Socket crashes
• When a program reads from a socket, the call on
read blocks (waits) until the data has been
obtained
• But if the remote host crashes, the program is left
hanging
• An alternative is to call setSoTimeout(timeout)
– Sets the maximum waiting time (in milliseconds)
• When the time expires, an InterruptedException is
thrown
WECPP
12
Port scanner example
• A port scanner is a program that hunts for working
ports on an Internet host
– Warning: can be impolite
• PortScanner.java
– Checks for unknown host
– Attempts to connect to ports 1 to 256 of specified host
– Ignores ports where no socket can be established
WECPP
13
Get server time example
• Connect to server's port 13
• Read a line of text (containing time and
date)
• GetRemoteTime.java
• Of course it cannot connect if no service is
running
WECPP
14
Class Sockets
Description
Example
constructors
public Socket(String
host, int port)
creates a new Socket
Socket socket = new
object corresponding to Socket("www.shu.ac.u
destination host and
k", 80);
port
public
Socket(InetAddress
host, int port)
creates a new Socket
Socket socket = new
object corresponding to Socket(inetAddress,
the InetAddress object 80);
and port
WECPP
15
Class Sockets
Description
Example
Object Method
public InetAddress
getInetAddress()
returns the InetAddress InetAddress iNE =
object corresponding to socket.getInetAddress(
the host that is, or will );
be, connected to.
public int getPort()
returns the port number int port =
of the host to which the socket.getPort();
socket is, or will be,
connected.
WECPP
16
Class Sockets
Description
Example
Object Method
public int
getLocalPort()
returns the local port
number.
int port =
socket.getLocalPort();
public InputStream
getInputStream()
returns an input stream
that can be used by the
program for input.
InputStream is =
socket.getInputStream();
public OutputStream
getOutputStream()
returns an output stream
that can be used by the
program for output.
OutputStream os =
socket.getOutputStream();
WECPP
17
Class Sockets
Description
Example
Object Method
public synchronized void disconnects a socket. This also
close()
closes the streams associated
with the socket
socket.close();
public String toString()
String details =
socket.toString()
returns a string representation
of a socket with remote host
name, remote IP address,
remote port, local port.
public synchronized void sets the time-out to the
setSoTimeout(int ms)
parameter value (in
milliseconds)
WECPP
socket.
setSoTimeout(18000
);
18
Sockets and Server Sockets
• Socket:
• Server socket:
– Implemented by class
socket
– A socket object is a
connection to a certain
host on a particular
port
– Socket objects are used
for data transfer
– A Socket object
initiates a connection
WECPP
– Implemented by class
ServerSocket
– A SocketServer object
just waits on a
particular port for
incoming connections
from anywhere
– A ServerSocket object
waits for connections
19
The algorithm for a server 1
• Create ServerSocket object on a particular port
ServerSocket server = new ServerSocket(12345, 100);
• ServerSocket object listens for any connection
attempts
Socket connection = server.accept();
• The server is blocked (waits) until a client
attempts to connect
• When a client attempts to connect, the server
wakes up
WECPP
20
The algorithm for a server 2
• When a client connects, method accept returns a
new Socket object representing the connection
between the server and the client
• That socket object's getInputStream and/or
getOutputStream methods are called to obtain
streams which can be used to send/receive data
• The server and the client interact using streams
according to an agreed protocol
• When finished, the server, the client, or both close
the connection
WECPP
21
Daytime server example
• DaytimeServer.java
• Listens on port 13
• When a connection is accepted it uses the
socket's output stream to write the current
date and time
• Then closes the socket and listens for a new
connection (forever)
WECPP
22
More complex servers
• A server dealing with one connection
cannot respond to further connections
– Normally, connection requests are queued
• May be better to create a new thread to deal
with each connection
– Allows main thread to keep listening for new
connections
WECPP
23
Reading
• Bell and Parr - bonus chapter
http://www.shu.ac.uk/java/networkprogram
ming/
starthere.html
• Deitel, chapter 18
WECPP
24