TCP/IP Protocol Stack
IP
Device Drivers
TCP UDP
Application
Sockets(Gate to network)
TCP:
–Establish connection
–Maintain connection during the communication
–Release connection
–Reliable (Acknowledged, in order)
UDP:
–No need to setup a link
–Independent packets
–Not reliable (no acknowledgement)
Programming with Sockets
• Sockets are Berkeley software distribution UNIX interface to network protocols
• Endpoint of communication, has a type and one associated process
• Uses file system model (open-close-read-write)• Internet vs. Unix domain
Client-Server Architecture
request
response
Process request
client
Host: www.vcu.edu
Port: 80
4 steps in programming a client
• Open a socket.
• Open an input and output stream to the socket.
• Read from and write to the socket according to the server's protocol.
• Clean up.
Socket in Java
• Two important classes– Socket: a normal socket as communication end– ServerSocket: accept the incoming request
• ServerSocket is an analogy to the custom service phone number, it will dispatch your call to a specialized staff--- normal Socket.
Client Socket Creation
the machine you are trying to open a connection to
SOCKET DESCRIPTOR
Socket MyClient;MyClient = new Socket("Machine name", PortNumber);
port (a number) on which the server you want
port numbers between 0 and 1,023 are reserved for for standard services, such as email, FTP, and HTTP. for your server, select one that is greater than 1,023
Create Server Socket
• If you are programming a server, then this is how you open a socket:
•ServerSocket MyService;try { MyServerice = new ServerSocket(PortNumber); } catch (IOException e) { System.out.println(e); }
Use ServerSocket: listen, accept, and Create connections from clients.
Socket clientSocket = null;try { serviceSocket = MyService.accept(); }catch (IOException e) { System.out.println(e);}
A blocking call, will return when a request arrive
Send Data to Socket at Client
• PrintStream output;try { output = new PrintStream(MyClient.getOutputStream());…
String inL=“hello”; output.writeBytes(inL+"\n");• }
Read data from Socket at Client
• DataInputStream input;try { input = new DataInputStream(MyClient.getInputStream());
…..
String responseLine = input.readLine();
System.out.println("Server: " + responseLine);}
Send Data to Socket at Server
• PrintStream output;try { output = new PrintStream(serviceSocket.getOutputStream());output.println(“this is server reply”);
• }
• Use the serviceSocket: returned from the accept() call.
Read Data From Socket at Server
• Same as client case• DataInputStream input;
try { input = new DataInputStream(serviceSocket.getInputStream());
• String req=input.readLine();• }
Close Socket Connection
• On the client side: • try {
output.close(); input.close(); MyClient.close();} catch (IOException e) { System.out.println(e);}
• On the server side:
• try { output.close(); input.close(); serviceSocket.close(); MyService.close();} catch (IOException e) { System.out.println(e);}
A Simple Echo Server• import java.io.*;
import java.net.*;public class echo3 { public static void main(String args[]) { ServerSocket echoServer = null; String line; DataInputStream is; PrintStream os; Socket clientSocket = null; try { echoServer = new ServerSocket(9999); } catch (IOException e) { System.out.println(e); }
•// listen and accept connections.// Open input and output streams
try { clientSocket = echoServer.accept(); is = new DataInputStream (clientSocket.getInputStream()); os = new PrintStream (clientSocket.getOutputStream());
// As long as we receive data, echo that data back to the client. while (true) { line = is.readLine(); os.println(line); } } catch (IOException e) { System.out.println(e); } }}
A simple clientsmtpSocket = new
Socket("128.172.167.167", 9998); os = new
DataOutputStream(smtpSocket.getOutputStream());
is = new DataInputStream(smtpSocket.getInputStream());
while (true){
inL=d.readLine();os.writeBytes(inL+"\n");if (inL.compareTo("quit")==0) break;
// keep on reading from/to the socket till we receive the "Ok" from SMTP,
// once we received that then we want to break.
responseLine = is.readLine(); System.out.println("Server: " + responseLine); responseLine = is.readLine(); System.out.println("Server: " + responseLine); responseLine = is.readLine(); System.out.println("Server: " + responseLine);
}
Reference
• Class ServerSocke– A server socket waits for requests to come in over the
network. It performs some operation based on that request, and then possibly returns a result to the requester.
– accept() Listens for a connection to be made to this socket and accepts it.
– getInetAddress() • Returns the local address of this server socket.
Class Socket• This class implements client sockets (also called just "sockets"). A
socket is an endpoint for communication between two machines. • Socket(InetAddress address, int port) • connect(SocketAddress endpoint)
Connects this socket to the server. • getPort()
Returns the remote port to which this socket is connected. • getLocalPort()
Returns the local port to which this socket is bound.• getInputStream()
Returns an input stream for this socket.• getOutputStream()
Returns an output stream for this socket. • getInetAddress()
Returns the address to which the socket is connected. • getLocalAddress()
Gets the local address to which the socket is bound.
Other Parameters in Socket
• Buffer size– Incoming buffer size– Outgoing buffer size
• Time out or not– Otherwise a bad read will block your browser
for ever.
• Status check