01: //*****
02: import java.net.Socket;
03: import java.net.ServerSocket;
04: import java.io.IOException;
05: import java.io.BufferedReader;
06: import java.io.InputStreamReader;
07: import java.io.PrintWriter;
08: public class ReverseServerMT {
09:     public static void main(String[ ] args) {
10:       try {
11:          ServerSocket ssock = new ServerSocket(port, max_conn);
12:          // Start new thread per client connection.
13:          while (true) {
14:              Socket sock = ssock.accept();    
15:              new ClientHandler(sock).start(); 
16:          }
17:       }
18:       catch(IOException e) { System.err.println(e); }
19:     }
20:     private static final int port = 9876;
21:     private static final int max_conn = 100;
22: }
23: class ClientHandler extends Thread {
24:     ClientHandler(Socket sock) { this.sock = sock; }
25:     public void run() {
26:        try {
27:          // Read the request and produce response.
28:          InputStreamReader isr = new InputStreamReader(sock.getInputStream());
29:          BufferedReader  in = new BufferedReader(isr);
30:          String req = in.readLine(); // blocks
31:          String res = new StringBuffer(req).reverse().toString();
32:          // Write the response to the client.
33:          PrintWriter out = new PrintWriter(sock.getOutputStream());
34:          out.println(res);
35:          out.flush();
36:          sock.close();  
37:        }
38:        catch(IOException e) { System.err.println(e); }
39:     } //*** a Thread stops when exiting run()
40:     private Socket sock;
41: }