import java.io.*; import java.net.*; import java.util.*; public class TcpEchoServer { private int port; public static void main(String[] args) { int port; if (args.length < 1) { (new TcpEchoServer()).go(); } else { try { port = Integer.parseInt(args[0]); (new TcpEchoServer(port)).go(); } catch(NumberFormatException ex) { System.out.println("Usage: TcpEchoServer [port]"); } } } public TcpEchoServer() { this(7); } public TcpEchoServer(int port) { super(); this.port = port; } public void go() { ServerSocket echoSocket; Socket clientSocket; try { echoSocket = new ServerSocket(port); System.out.println("Waiting for connections on port " + port + " ..."); try { while (true) { clientSocket = echoSocket.accept(); System.out.println("Connection from " + clientSocket.getInetAddress() + " accepted."); (new ClientThread(clientSocket)).start(); } } finally { echoSocket.close(); } } catch(Exception ex) { System.out.println(ex); } System.exit(0); } class ClientThread extends Thread { Socket clientSocket; public ClientThread(Socket clientSocket) { super(); this.clientSocket = clientSocket; } public void run() { OutputStream out; InputStream in; byte[] inBuffer = new byte[1]; int bytesRead; try { in = clientSocket.getInputStream(); out = clientSocket.getOutputStream(); try { while (true) { bytesRead = in.read(inBuffer); // If EOF, then socket was closed by client, so break. if (bytesRead == -1) { break; } out.write(inBuffer); } } finally { clientSocket.close(); } } catch(Exception ex) { System.out.println(ex); } System.out.println("Connection from " + clientSocket.getInetAddress() + " terminated."); } } // end ClientThread } // end TcpEchoServer