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}