Basic Socket Programming
with Java
What is a socket?
Generally refers to a stream connecting processes
running in different address spaces (across a
network or on the same machine).
We say create a socket connection between
machine A and machine B. This means, roughly,
create input and output streams for sending data
between programs running simultaneously on each
machine.
The programs can then talk to each other.
This is lowest-level form of communication from
application developers view
Sockets, cont.
Sockets represent a low-level abstraction for
application communication.
Programmer is aware of a stream that connects two
computers.
Programmer fully responible for managing/interpreting
flow of bytes between computers
Higher-level techniques
message passing systems (MPI, SOAP, JMS),
extensions to web servers (ASP, JSP, servelets, etc),
distributed objects (CORBA, RMI), web services, etc.
More about sockets in Java
One of the good things about Java
Supported natively by the standard
languages (j2sdk)
Distinction between high and low-level
blurred somewhat by ability to wrap
streams (ObjectOutputStream, etc.)
Still, socket programming differs from other
distributed programming in its low-level
nature.
Why is this paradigm useful?
Shared resources (web servers, ftp servers,
mail servers)
Online auctions, exchanges, etc.
Data locality
Localize computing power
Crash protection
Software maintainability
Conceptual overview of basic
client-server program
Write a program that dials up another program at a
specified IP address running on a specified port.
Call this program the client.
Second program (server) accepts connection and
establishes input/output stream to client.
When server accepts, client can establish
input/ouput stream to server
Client makes request of server by sending data.
Server sends replies to client. Protocol must be
defined so client/server understand can interpret
messages.
Conceptual overview of basic
peer-to-peer program
Two processes running on specific port of
specific machine.
Either process can dial up the other process.
When connection is established,
applications talk at a peer level, rather than
one making requests and the other serving
up those requests.
Will see many examples soon.
Socket Machinery in Java
Java classes for direct socket
programming
Good news: This is very simple in Java
Really only 3 additional classes are needed
java.net.InetAddress
java.net.Socket
java.net.ServerSocket
Most important classes/methods
java.net.Socket
Socket(InetAddress addr, int port);
create a Socket connection to address addr on port port
InputStream getInputStream();
returns an instance of InputStream for getting info from the
implicit Socket object
OutputStream getOutputStream();
returns an instance of OutputStream for sending info to
implicit Socket object.
close();
close connection to implicit socket object, cleaning up
resources.
Important classes, cont.
java.net.ServerSocket
ServerSocket(int port);
enables program to listen for connections on port
port
Socket accept();
blocks until connection is requested via Socket
request from some other process. When connection
is established, an instance of Socket is returned for
establishing communication streams.
Important class, cont.
java.net.InetAddress
static InetAddress getByName(String name)
given a hostname name, return the InetAddress object
representing that name (basically encapsulates name and IP
associated with name);
static InetAddress[] getAllByName(String name)
same as above but for case where many ips mapped to single
name (try www.microsoft.com, e.g.).
static InetAddress getLocalHost()
get InetAddress object associated with local host.
static InetAddress getByAddress(byte[] addr)
get InetAddress object associated with address addr
Error Handling
Very important to ensure that server is
robust and will not crash.
Important Exceptions:
InterruptedIOException
ConnectException
Be sure to close your sockets either after a
crash or upon expected completion. Finally
clause is useful here.
Examples
Best way to learn this is to study several
canonical examples
See many simple course examples under
standaloneClient package
Next, do simple EchoServer
Then, Threaded EchoServer
Then, fully synchronized tic-tac-toe
Then, chess game