Java Networking
TCP Sockets
Simple Cleint/Server:
Very simple
server that just echoes back whatever the client sends.
ü Create a server socket:
ServerSocket s = new ServerSocket (PORT);
ü Accept a client connection:
Socket socket = s.accept();
ü Get
socket input stream:
in = socket.getInputStream();
ü Get
socket output
stream:
out
= socket.getOutputStream();
ü Read :
String str = in.readLine();
ü Write:
out.println(str);
Program Listing:
public class EchoServer {
public static
final int PORT = 10101;
public static void
main (String[] args) throws IOException
{
ServerSocket s = new ServerSocket(PORT);
System.out.println("Started: " + s);
try {
Socket socket = s.accept();
try {
System.out.println("Connection accepted: "+ socket);
BufferedReader
in = new BufferedReader( new InputStreamReader(
socket.getInputStream()));
PrintWriter
out = new PrintWriter( new BufferedWriter (
new OutputStreamWriter( socket.getOutputStream())),true);
while (true)
{
String str
= in.readLine();
if (str.equals("END")) break;
System.out.println("Echoing: " + str);
out.println(str);
}
} finally {
socket.close();
}} finally {
s.close(); } } }
_____________________________________________________________________________________
Simple client to sends lines to the server and
reads lines that the server sends back.
ü Create a client socket connected to the server:
Socket socket = new Socket (addr, PORT);
ü Get socket input stream:
in = socket.getInputStream();
ü Get socket output stream:
out = socket.getOutputStream();
ü Write:
out.println(str);
ü Read:
String str = in.readLine();
Program Listing:
public class EchoClient {
public static void
main(String[] args) throws IOException
{
InetAddress addr = InetAddress.getByName(args[0]);
System.out.println("addr = " + addr);
Socket socket = new Socket(addr,
EchoServer.PORT);
try {
System.out.println
("socket = " + socket);
BufferedReader
in = new BufferedReader ( new
InputStreamReader (
socket.getInputStream()));
PrintWriter out
= new PrintWriter ( new BufferedWriter
(new OutputStreamWriter
(socket.getOutputStream())),true);
for(int i = 0; i < 10; i ++) {
out.println ("howdy
" + i);
String str
= in.readLine ();
System.out.println
(str);
}
out.println("END");
} finally {
socket.close(); } }}
How to run:
% java EchoServer
% java
EchoClient <hostname>
_____________________________________________________________________________________
Multi-Threaded Cleint/Server:
A server that uses multithreading to handle
any number of clients.
For each client connection accepted in
socket, create a new
thread to handle it:
new ServeOneEcho (socket);
The thread will then get in/out streams from socket
to read/write
Program Listing:
class EchoServOne
extends Thread {
private Socket socket;
private BufferedReader in;
private PrintWriter out;
public EchoServOne (Socket s) throws IOException {
socket = s;
in = new BufferedReader ( new InputStreamReader(
socket.getInputStream()));
out = new PrintWriter (
new BufferedWriter( new OutputStreamWriter(
socket.getOutputStream())), true);
start (); // Calls run()
}
public void run() {
try {
while (true)
{
String str = in.readLine();
if (str.equals("END")) break;
System.out.println("Echoing: " + str);
out.println(str);
}
System.out.println("closing...");
} catch(IOException e) {
System.err.println("IO Exception");
} finally {
try {
socket.close();
} catch(IOException e) {
System.err.println("Socket not closed");
} } }
}
public class MultiEchoServer {
public static void
main (String[] args) throws IOException
{
ServerSocket s = new ServerSocket
(PORT);
String ServerPort
= s.getLocalPort()+"\n";
System.out.println("Server Started at Port: " + ServerPort);
try {
while (true)
{
Socket socket = s.accept();
try {
new
EchoServOne (socket);
} catch (IOException
e) {
socket.close
();
}
}
} finally {
s.close ();
}
}
}
_____________________________________________________________________________________
Tests the MultiEchoServer by starting up
multiple clients.
ü Create many
clients up to MAX_THREADS and sleep 5000 ms
(5 seconds) after the
creation of each client.
while (true) {
if (EchoClientThread.threadCount() < MAX_THREADS)
new EchoClientThread (addr);
Thread.currentThread().sleep (5000);
}
ü Each client
sends 5 messages to the server and exits.
for (int i = 1; i <= 5; i++) {
out.println ("Client " +
id + ": " + i);
String str = in.readLine();
System.out.println (str);
}
out.println("END");
Program Listing:
class EchoClientThread extends Thread {
private Socket socket;
private BufferedReader in;
private PrintWriter out;
private static int counter = 0;
private int id = ++counter;
private static int threadcount
= 0;
public static int threadCount() {
return threadcount;
}
public EchoClientThread
(InetAddress addr, int PORT)
{
System.out.println
("Making client " + id);
threadcount++;
try {
socket = new Socket (addr, PORT);
} catch (IOException
e) {
System.err.println
("Socket failed");
}
try {
in = new BufferedReader( new InputStreamReader(
socket.getInputStream()));
out = new PrintWriter( new BufferedWriter(
new OutputStreamWriter(
socket.getOutputStream())), true);
start();
} catch(IOException e) {
try {
socket.close();
} catch(IOException e2) {
System.err.println("Socket not closed");
}
}
}
public void run() {
try {
for (int i
= 1; i <=5; i++) {
out.println("Client " + id + ": " + i);
String str = in.readLine();
System.out.println(str);
try {
sleep(5000);
} catch(InterruptedException e) {
System.err.println("Interrupted");
}
}
out.println("END");
} catch(IOException e) {
System.err.println("IO Exception");
} finally {
try {
socket.close();
} catch(IOException e) {
System.err.println("Socket not closed");
}
threadcount--; // Ending this thread
}
}
}
public class MultiEchoClient {
static final int MAX_THREADS = 5;
public static void
main (String[] args) throws IOException,
InterruptedException {
InetAddress addr = InetAddress.getByName(args[0]);
int
Sport = Integer.parseInt(args[1]);
while(true) {
if (EchoClientThread.threadCount()
< MAX_THREADS)
new EchoClientThread
(addr, Sport);
Thread.currentThread().sleep(5000);
}
}
}
How to
run:
% java MultiEchoServer
Server
Started at Port: 50897
% java MultiEchoClient
localhost 50897
(Type CTRL-C to interrupt).