Druzya.org
Возьмемся за руки, Друзья...
 
 
Наши Друзья

Александр Градский
Мемориальный сайт Дольфи. 
				  Светлой памяти детей,
				  погибших  1 июня 2001 года, 
				  а также всем жертвам теракта возле 
				 Тель-Авивского Дельфинариума посвящается...

Библиотека :: Компьютеры и Программирование :: А.В. Фролов, Г.В. Фролов - Microsoft Visual J++
<<-[Весь Текст]
Страница: из 275
 <<-
 
==========================================
import java.io.*;
import java.net.*;
import java.util.*;

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

    // Сокет для связи с сервером
    Socket s;

    // Входной поток для приема данных от сервера
    InputStream is;

    // Выходной поток для передачи данных серверу
    OutputStream os;

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

      // Создаем входной поток для приема данных от сервера
      is = s.getInputStream();

      // Создаем выходной поток для передачи данных серверу
      os = s.getOutputStream();

      // Буфер для передачи данных
      byte buf[] = new byte[512];

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

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

      // Вводим команды и передаем их серверу
      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);

          // Записываем строку в выходной поток, 
          // передавая ее таким образом серверу
          os.write(bKbdInput, 0, length);
          
          // Сбрасываем буфер выходного потока
          os.flush();

          // Принимаем ответ сервера
          length = is.read(buf);
          if(length == -1)
            break;

          // Отображаем принятую строку на консоли
          str = new String(buf, 0);
          st   = new StringTokenizer(str, "\n");
          str = new String((String)st.nextElement());
          System.out.println(">> " + str);

          // Если введена строка 'quit', завершаем 
          // работу приложения
          if(str.equals("quit"))
            break;
        }
      }

      // Закрываем входной и выходной потоки
      is.close();
      os.close();

      // Закрываем сокет
      s.close();
    }
    catch(Exception ioe)
    {
      System.out.println(ioe.toString());
    }
    
    try
    {
      System.out.println(
        "Press  to terminate application...");

      System.in.read(bKbdInput);
    }
    catch(Exception ioe)
    {
      System.out.println(ioe.toString());
    }
  }
}
   Описание исходного текста клиентского приложения SocketClient
   Внутри метода main клиентского приложения SocketClient определены переменные 
для ввода строки с клавиатуры (массив bKbdInput), сокет s класса Socket для 
работы с сервером SocketServ, входной поток is и выходной поток os, которые 
связаны с сокетом s.
   После вывода на консоль приглашающей строки клиентское приложение создает 
сокет, вызывая конструктор класса Socket:
s = new Socket("localhost",9999);
   В процессе отладки мы запускали сервер и клиент на одном и том же узле, 
поэтому в качестве адреса сервера указана строка “localhost”. Номер порта 
сервера SocketServ равен 9999, поэтому мы и передали конструктору это значение.
   После создания сокета наше клиентское приложение создает входной и выходной 
потоки, связанные с этим сокетом:
is = s.getInputStream();
os = s.getOutputStream();
   Теперь клиентское приложение готово обмениваться данными с сервером.
   Этот обмен выполняется в цикле, условием завершения которого является ввод 
пользователем строки “quit”.
   Внутри цикла приложение читает строку с клавиатуры, записывая ее в массив 
bKbdInput:
length = System.in.read(bKbdInput);
   Количество введенных символов сохраняется в переменной length.
   Далее если пользователь ввел строку, а не просто нажал на клавишу , 
эта строка отображается на консоли и передается серверу:
os.write(bKbdInput, 0, length);
os.flush();
   Сразу после передачи сбрасывается буфер выходного потока.
   Далее приложение читает ответ, посылаемый сервером, в буфер buf:
length = is.read(buf);
   Напомним, что наш сервер посылает клиенту принятую строку в неизменном виде.
   Если сервер закрыл канал, то
 
<<-[Весь Текст]
Страница: из 275
 <<-