// =========================================================
// Использование датаграммных сокетов
// Приложение сервера
//
// (C) Фролов А.В, 1997
//
// E-mail: frolov@glas.apc.org
// WWW:    http://www.glasnet.ru/~frolov
//            или
//         http://www.dials.ccas.ru/frolov
// =========================================================
import java.io.*;
import java.net.*;
import java.util.*;

public class DatagramServer
{
	// -------------------------------------------------------
  // main
  // Метод, получающий управление при запуске приложения
  // -------------------------------------------------------
  public static void main(String args[])
  {
    // Массив для ввода строки с клавиатуры
    byte bKbdInput[] = new byte[256];

    // Буфер для чтения команд
    byte buf[] = new byte[512];

    // Сокет сервера
    DatagramSocket s;

    // Принимаемый пакет
    DatagramPacket pinp;

    // Адрес узла, откуда пришел принятый пакет
    InetAddress SrcAddress;

    // Порт, откуда пришел принятый пакет
    int SrcPort;

    try
    {
      // Выводим строку приглашения
      System.out.println("Datagramm Socket Server Application");
    }
    catch(Exception ioe)
    {
      // При возникновении исключения выводим его описание
      // на консоль
      System.out.println(ioe.toString());
    }
    
    try
    {
      // Создаем сокет сервера
      s = new DatagramSocket(9998);

      // Создаем пакет для приема команд
      pinp = new DatagramPacket(buf, 512);

      // Цикл обработки команд, полученных от клиента
      while(true)
      {
        // Принимаем пакет от клиента
        s.receive(pinp);

        // Получаем адрес узла, приславшего пакет
        SrcAddress = pinp.getAddress();

        // Получаем порт, на котором был передан пакет
        SrcPort    = pinp.getPort();

        // Отображаем принятую команду на консоли сервера

        // Формируем строку из принятого блока
        String str = new String(buf, 0);

        // Обрезаем строку, удаляя символ конца строки
        StringTokenizer st;
        st   = new StringTokenizer(str, "\r\n");
        str = new String((String)st.nextElement());

        // Выводим строку команды на консоль
        System.out.println(">  " + str + " < " +
          "port: " + SrcPort);

        // Если пришла команда 'quit', прерываем цикл
        if(str.equals("quit"))
          break;
      }

      // Закрываем сокет сервера
      s.close();

    }
    catch(Exception ioe)
    {
      System.out.println(ioe.toString());
    }
    
    try
    {
      System.out.println(
        "Press <Enter> to terminate application...");

      System.in.read(bKbdInput);
    }
    catch(Exception ioe)
    {
      System.out.println(ioe.toString());
    }
  }
}