JDK (Java Development Kit) Tutorials
Dr. Herong Yang, Version 5.00

ReverseEchoServer.java - A Multi-Connection Socket Server

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

Last update: 2006.

Sections in This Chapter

What Is a Socket?

Establishing a Socket Communication Link

ReverseEchoer.java - A Simple Server Socket Application

SocketClient.java - A Simple Client Socket Application

ReverseEchoServer.java - A Multi-Connection Socket Server

Binding Sockets to Specific Ports

Dr. Herong Yang, updated in 2008
ReverseEchoServer.java - A Multi-Connection Socket Server