import java.io.*;
import java.net.*;

class ServerOne extends Thread {
   private Socket socket;
   private BufferedReader in;
   private PrintWriter out;
   
   public ServerOne(Socket s) throws IOException {
      socket = s;
      in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
      out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
      start(); 
   }
   
   public void run() {
      try {
         while (true) {
            String str = in.readLine();
            if (str.equals("END"))
               break;
            System.out.println("Получено: " + str);
            out.println(str);
         }
         System.out.println("Соединение закрыто");
      }
      catch (IOException e) {
         System.err.println("Ошибка чтения/записи");
      }
      finally {
         try {
            socket.close();
         }
         catch (IOException e) {
            System.err.println("Сокет не закрыт");
         }
      }
   }
}

public class Server {
   static final int PORT = 1234;
   
   public static void main(String[] args) throws IOException {
      ServerSocket s = new ServerSocket(PORT);
      System.out.println("Мультипоточный сервер стартовал");
      try {
         while (true) {
            Socket socket = s.accept();
            try {
               System.out.println("Новое соединение установлено");
               System.out.println("Данные клиента: "+
                  socket.getInetAddress());
               new ServerOne(socket);
            }
            catch (IOException e) {
               socket.close();
            }
         }
      }
      finally {
         s.close();
      }
   }
}