// =========================================================
// Использование датаграммных сокетов
// Приложение клиента
//
// (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 DatagramClient
{
	// -------------------------------------------------------
  // main
  // Метод, получающий управление при запуске приложения
  // -------------------------------------------------------
  public static void main(String args[])
  {
    // Массив для ввода строки с клавиатуры
    byte bKbdInput[] = new byte[256];

    // Размер принятого блока данных
    int length;

    // Рабочая строка
    String str;

    // Сокет клиента
    DatagramSocket s;

    // Передаваемый пакет
    DatagramPacket pout;

    try
    {
      // Выводим строку приглашения
      System.out.println("Datagram Socket Client Application" + 
        "\nEnter any string or 'quit' to exit...");
      
    }
    catch(Exception ioe)
    {
      // При возникновении исключения выводим его описание
      // на консоль
      System.out.println(ioe.toString());
    }
    
    try
    {
      // Получаем адрес локального узла
      InetAddress OutAddress = InetAddress.getLocalHost();

      // Создаем сокет с использованием любого 
      // свободного порта
      s = new DatagramSocket();

      // Создаем передаваемый пакет
      pout = new DatagramPacket(bKbdInput, bKbdInput.length, 
            OutAddress, 9998);

      // Цикл передачи команд серверу
      while(true)
      {
        // Читаем строку команды с клавиатуры
        length = System.in.read(bKbdInput);
        
        // Если строка не пустая, обрабатываем ее
        if(length != 1)
        {
          // Преобразуем строку в формат String
          str = new String(bKbdInput, 0);

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

          // Выводим передаваемую строку команды 
          // на консоль для контроля
          System.out.println(">  " + str);

          // Посылаем пакет серверу
          s.send(pout);

          // Если введена команда '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());
    }
  }
}