import java.io.*;
import java.net.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class Straznik extends Thread
{
	private JLabel wiadomosc;
	private ServerSocket serwer = null;
	private int port;
	private volatile boolean petla = true;

	public Straznik (JLabel wiad, int p)
	{
		wiadomosc = wiad;
		port = p;
	}

	public void koniec ()
	{
		petla = false;
		if (serwer==null) return;
		try
		{
			serwer.close();
			wiadomosc.setText("zamknieto serwer gry dzialajacy na porcie "+port);
			System.out.println("= zamknieto serwer gry dzialajacy na porcie "+port+" =");
		}
		catch (IOException ex) {}
	}

	public void run ()
	{
		Random rnd = new Random();
        try
        {
			serwer = new ServerSocket(port,1);
			wiadomosc.setText("serwer gry dziala na porcie "+port);
			System.out.println("= uruchomiono serwer gry na porcie "+port+" =");
		}
		catch (IOException ex)
		{
			wiadomosc.setText("nie mozna uruchomic serwera gry na porcie "+port);
			return;
		}
		while (petla)
			try
			{
                Socket polaczenie = serwer.accept();
                System.out.println("- nawiazano polaczenie ("+polaczenie+")");
                BufferedReader we =
                    new BufferedReader(new InputStreamReader(polaczenie.getInputStream()));
                PrintWriter wy =
                    new PrintWriter(new OutputStreamWriter(polaczenie.getOutputStream()),true);
                wy.println(new Date());
                int liczba = rnd.nextInt(9000)+1000;
				String linia = "";
				for (int i=0; i<13; i++)
				{
					linia = we.readLine();
					if (linia==null) throw new IOException();
					if (linia.equals("."))
					{
						wy.println("klient przerwal gre");
						break;
					}
					int licz = 0;
					try { licz = Integer.parseInt(linia); }
					catch (NumberFormatException ex)
					{
						i--;
						wy.println("bledne dane");
						continue;
					}
					if (licz<1000||licz>9999)
					{
						i--;
						wy.println("liczba spoza zakresu {1000..9999}");
						continue;
					}
					if (licz<liczba) wy.println("za malo");
					else if (licz>liczba) wy.println("za duzo");
					else
					{
						wy.println("ok");
						break;
					}
					if (i==12)
					{
						wy.println("nie udalo sie zgadnac liczby");
						break;
					}
				}
                polaczenie.close();
				System.out.println("- zamknieto polaczenie");
			}
			catch (IOException ex)
			{
				if (petla) System.out.println("- blad zwiazany z gniazdem polaczenia roboczego");
			}
		try
		{
			serwer.close();
			wiadomosc.setText("zamknieto serwer gry na porcie "+port);
		}
		catch (IOException ex) {}
	}
}

class ZdarzenieOkna extends WindowAdapter
{
	private JFrame okno;
	private Straznik straznik;

	public ZdarzenieOkna (JFrame ok, Straznik straz)
	{
		okno = ok;
		straznik = straz;
	}

	public void windowClosing (WindowEvent ev)
	{
		straznik.koniec();
		try { straznik.join(); }
		catch (InterruptedException ex) {}
		System.out.println("= zamknieto aplikacje serwera gry =");
		okno.dispose();
	}
}

public class SerwerGryTCP extends JFrame
{
	private JLabel info;
	private JTextArea opis;
	private Straznik straznik;

	public SerwerGryTCP (int port)
	{
		super("serwer gry w liczby");
		info = new JLabel("serwer w trakcie konstrukcji");
		getContentPane().add(info,BorderLayout.NORTH);
		opis = new JTextArea("Gra w liczby:");
		opis.append("\n1. po nawiązaniu poączenia serwer losuje jakas liczbe z zakresu 1000...9999");
		opis.append("\n2. klient przesyla swoje propozycje do serwera,");
		opis.append("\n   a ten odpowiada czy wartosc jest za duza, za mala lub ze jest rowna");
		opis.append("\n3. klient ma tylko 12 szans na odgadniecie liczby");
		opis.setEditable(false);
		getContentPane().add(new JScrollPane(opis),BorderLayout.CENTER);
		straznik = new Straznik(info,port);
		addWindowListener(new ZdarzenieOkna(this,straznik));
		setSize(480,240);
		setResizable(false);
		setLocation(120,120);
		setVisible(true);
		System.out.println("= otworzono aplikacje serwera gry =");
		straznik.start();
	}

    public static void main (String[] arg)
    {
    	new SerwerGryTCP(2022);
	}
}
