This section provides a tutorial example on how to write a network application, ReverseEchoServer.java, that creates a server socket and listens for multiple remote socket connection requests. It creates a new execution thread each time, for each new connection.
ReverseEchoer runs perfectly if there is only one client program talking
to it. If we run another copy of SocketClient, while a copy of SocketClient
is running and connected to ReverseEchoer, the second copy of SocketClient
will not be able establish a communication link with ReverseEchoer, because
it is busy with the first copy of SocketClient.
To create a server application that can handle multiple connections, a new execution
thread needs to be created for each connection. The following program,
called ReverseEchoServer, offers the same function to client program.
But it can handle multiple connections.
/**
* ReverseEchoServer.java
* Copyright (c) 2002 by Dr. Herong Yang
*/
import java.io.*;
import java.net.*;
public class ReverseEchoServer implements Runnable {
private Socket con = null;
public static void main(String[] args) {
try {
ServerSocket s = new ServerSocket(8888);
printServerSocketInfo(s);
while (true) {
Socket c = s.accept();
printSocketInfo(c);
ReverseEchoServer v = new ReverseEchoServer(c);
Thread t = new Thread(v);
t.start();
}
} catch (IOException e) {
System.err.println(e.toString());
}
}
public ReverseEchoServer(Socket c){
con = c;
}
public void run() {
try {
BufferedWriter w = new BufferedWriter(new OutputStreamWriter(
con.getOutputStream()));
BufferedReader r = new BufferedReader(new InputStreamReader(
con.getInputStream()));
String m = "Welcome to Reverse Echo Server."+
" Please type in some words.";
w.write(m,0,m.length());
w.newLine();
w.flush();
while ((m=r.readLine())!= null) {
if (m.equals(".")) break;
char[] a = m.toCharArray();
int n = a.length;
for (int i=0; i<n/2; i++) {
char t = a[i];
a[i] = a[n-1-i];
a[n-i-1] = t;
}
w.write(a,0,n);
w.newLine();
w.flush();
}
w.close();
r.close();
con.close();
} catch (IOException e) {
System.err.println(e.toString());
}
}
private static void printSocketInfo(Socket s) {
System.out.println("Remote address = "
+s.getInetAddress().toString());
System.out.println("Remote port = "
+s.getPort());
System.out.println("Local socket address = "
+s.getLocalSocketAddress().toString());
System.out.println("Local address = "
+s.getLocalAddress().toString());
System.out.println("Local port = "
+s.getLocalPort());
}
private static void printServerSocketInfo(ServerSocket s) {
System.out.println("Server socker address = "
+s.getInetAddress().toString());
System.out.println("Server socker port = "
+s.getLocalPort());
}
}
Here is the output displayed on the ReverseEchoServer console window, with
two copies of SocketClient running:
Server socker address = 0.0.0.0/0.0.0.0
Server socker port = 8888
Remote address = /127.0.0.1
Remote port = 1084
Local socket address = /127.0.0.1:8888
Local address = /127.0.0.1
Local port = 8888
Remote address = /127.0.0.1
Remote port = 1085
Local socket address = /127.0.0.1:8888
Local address = /127.0.0.1
Local port = 8888