001package var.sockets.tcp.echo;
002
003import java.io.BufferedReader;
004import java.io.IOException;
005import java.io.InputStreamReader;
006import java.io.PrintWriter;
007import java.net.ServerSocket;
008import java.net.Socket;
009import java.net.SocketAddress;
010
011/**
012 * iterative server for var.sockets.tcp.echo Echo service. waits for the next
013 * client to connect, sends greeting message to client, reads line by line from
014 * client and sends it back adding "echo: " in front of each line until
015 * connection is closed by client.
016 *
017 * @author Sandro Leuchter
018 *
019 */
020public class EchoServerIterativ {
021        /**
022         * port on which this service is currently listening on localhost
023         */
024        private final int port;
025        /**
026         * current maximum length of the queue of incoming connections.
027         */
028        private final int backlog;
029
030        /**
031         * the only constructor for this class
032         *
033         * @param port    port on which this service will be listening on localhost
034         * @param backlog requested maximum length of the queue of incoming connections.
035         */
036        public EchoServerIterativ(int port, int backlog) {
037                this.port = port;
038                this.backlog = backlog;
039        }
040
041        /**
042         * creates server socket on localhost:port, infinitely handles connections to
043         * clients one after another
044         */
045        public void start() {
046                try (ServerSocket serverSocket = new ServerSocket(this.port, this.backlog)) {
047                        System.out.println("EchoServer (iterativ) auf " + serverSocket.getLocalSocketAddress() + " gestartet ...");
048                        while (true) {
049                                handleClient(serverSocket);
050                        }
051                } catch (IOException e) {
052                        System.err.println(e);
053                }
054        }
055
056        /**
057         * waits for the next client to connect to server, sends greeting message to
058         * client, reads line by line from client and sends it back adding "echo: " in
059         * front of each line until connection is closed by client.
060         *
061         * @param server "welcome socket" on which server is listening for clients
062         */
063        private void handleClient(ServerSocket server) {
064                SocketAddress socketAddress = null;
065                try (Socket socket = server.accept();
066                                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
067                                PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) {
068                        socketAddress = socket.getRemoteSocketAddress();
069                        System.out.println("Verbindung zu " + socketAddress + " aufgebaut");
070                        out.println("Server ist bereit ...");
071                        String input;
072                        while ((input = in.readLine()) != null) {
073                                System.out.println(socketAddress + ">> [" + input + "]");
074                                out.println("echo: " + input);
075                        }
076                } catch (IOException e) {
077                        System.err.println(e);
078                } finally {
079                        System.out.println("Verbindung zu " + socketAddress + " abgebaut");
080                }
081        }
082
083        /**
084         * main method: entrypoint to run service
085         *
086         * @param args args[0] must be the port number of the server (int); rest of args
087         *             is ignored
088         */
089        public static void main(String[] args) {
090                int port = Integer.parseInt(args[0]);
091                int backlog = 50;
092                if (args.length == 2) {
093                        backlog = Integer.parseInt(args[1]);
094                }
095
096                new EchoServerIterativ(port, backlog).start();
097        }
098}