4909

Клиент-серверные взаимодействия на основе сокетов

Реферат

Информатика, кибернетика и программирование

Клиент-серверные взаимодействия на основе сокетов Рассматривается методика построения Web-приложений на основе сокетных соединений. Приводятся примеры построения клиентских и серверных приложений, реализующих клиент-серверные взаимодействия. Техн...

Русский

2012-11-29

80 KB

31 чел.

Клиент-серверные взаимодействия на основе сокетов

Рассматривается методика построения Web-приложений на основе сокетных соединений. Приводятся примеры построения клиентских и серверных приложений, реализующих клиент-серверные взаимодействия.

1. Технология работы с URL-адресами

Определение IP-адреса. Рассмотрим технологию определения доменного имени и числового IP-адреса при помощи методов класса InetAddress.

А. Проанализируйте структуру файла InetAddressDemo.java и обратите внимание на три возможных способа вызова методов класса InetAddress, при помощи которых осуществляется определение числового IP-адреса, а также его доменного имени.

Б. Создайте проект с именем InetAddressDemo согласно следующей методике:

  1.  Выбрать пункт меню File | New Project.
  2.  В панели Project Wizard Step 1 of 3 ввести в окно Name имя проекта и нажать на кнопку Finish.
  3.  Выбрать пункт меню File | New.
  4.  В панели Object Gallery выбрать вкладку General, выделить тип приложения Class и нажать на кнопку OK.
  5.  В панели Class Wizard ввести в окно Class Name имя класса, совпадающее с именем проекта, и нажать на кнопку OK.

Замените в проекте файл InetAddressDemo.java приводимым далее программным кодом и проведите тестирование проекта в среде JBuilder.

     Файл InetAddressDemo.java

package inetaddressdemo;

import java.net.*;

//класс InetAddressDemo

class InetAddressDemo

{

 public static void main(String args[]) throws UnknownHostException {

   //создание объекта класса InetAddress методом getLocalHost

   InetAddress Address = InetAddress.getLocalHost();

   System.out.println(Address);

   //создание объекта класса InetAddress методом getByName

   Address = InetAddress.getByName("127.0.0.1");

   System.out.println(Address);

   //создание объекта класса InetAddress методом getAllByName

   InetAddress ar[] = InetAddress.getAllByName("localhost");

   for (int i=0; i<ar.length; i++)

     System.out.println(ar[i]);

 }

}

Определение компонентов URL-адреса. Рассмотрим методику определения компонентов URL-адресов при помощи методов класса URL.

А. Проанализируйте структуру файла MyURL.java и обратите внимание на методы класса URL, при помощи которых осуществляется определение имени протокола, номера порта, имени хоста и полного адреса URL.

Б. Создайте проект с именем MyURL согласно методике, изложенной на с. 65, заменив в проекте файл MyURL.java приводимым далее программным кодом. Протестируйте проект в среде JBuilder.

    Файл MyURL.java

package myurl;

import java.net.*;

// класс MyURL

class MyURL {

 public static void main(String args[]) throws MalformedURLException {

   URL hp = new URL("http://www.eltech.ru/index.html");

   // вывод имени протокола, порта, хоста, файла и URL

   System.out.println("Протокол: " + hp.getProtocol());

   System.out.println("Порт: " + hp.getPort());

   System.out.println("Хост: " + hp.getHost());

   System.out.println("Файл: " + hp.getFile());

   System.out.println("URL: " + hp.toExternalForm());

 }

}

Определение атрибутов удаленного ресурса. Рассмотрим методику просмотра свойств удаленного объекта перед его транспортировкой.

А. Проанализируйте структуру файла URLCon.java и обратите внимание на методы класса URLConnection, при помощи которых осуществляется определение даты, типа содержимого, срока хранения, времени последнего изменения и содержимого объекта URL.

Б. Создайте проект с именем URLCon согласно методике, изложенной на с. 65, заменив в проекте файл URLCon.java приводимым далее программным кодом. Протестируйте проект в среде JBuilder, используя в качестве объекта анализа приводимый далее файл Test.html.

     Файл URLCon.java

package urlcon;

import java.net.*;

import java.io.*;

import java.util.Date;

// класс URLCon

class URLCon

{

 public static void main(String args[]) throws Exception {

   int c;

   URL hp = new URL("http://127.0.0.1/Test.html");

   URLConnection hpCon = hp.openConnection();

   System.out.println("Дата: " + new Date(hpCon.getDate()));

   System.out.println("Тип содержимого: " + hpCon.getContentType());

   System.out.println("Срок хранения: " + hpCon.getExpiration());

   System.out.println("Последнее изменение: " +

                      new Date(hpCon.getLastModified()));

   int len = hpCon.getContentLength();

   System.out.println("Длина содержимого: " + len);

   if (len > 0) {

     System.out.println("=== Содержимое===");

     InputStream input = hpCon.getInputStream();

     int i = len;

     while (((c = input.read()) != -1) && (--i > 0)) {

       System.out.print((char) c);

     }

     input.close();

   } else {

     System.out.println("Нет содержимого");

   }

 }

}

      Тестовый файл Test.html   

<!-- Test.html -->

<html>

<head><title>Welcome to Our Store</title ></head >

<body>

<h1>Welcome to Our Store</h1>

<h1> HTML for Web-page. </h1>

</body >

</html>

2. Серверные приложения на основе сокетов

Методика создания сокетного соединения на сервере. Сокеты дают возможность одному процессу устанавливать соединение с другим процессом. Во время такого соединения оба процесса осуществляют обмен данными с помощью потоков, при этом используется протокол управления передачей данных TCP (Transmission Control Protocol).

      Сокетное соединения на сервере реализуется выполнением следующих действий:

  1.  Создание объекта класса ServerSocket при помощи конструктора, аргументы которого задают допустимый номер порта и число клиентов, осуществляющих соединение с сервером.

    ServerSocket s  = new ServerSocket ( порт, длина очереди );

  1.  Обращение к методу accept класса ServerSocket для ожидания попыток соединения клиента с сервером

    Socket connection = s.accept ();

  1.  Получение объектов потока вывода ObjectOutputStream и потока ввода ObjectInputStream, позволяющих клиенту взаимодействовать с сервером. Потоки вывода и ввода класса Socket создаются путем вызова методов getOutputStream и getInputStream 

         ObjectOutputStream output = new ObjectOutputStream(

                      connection.getOutputStream() );

        ObjectInputStream input = new ObjectInputStream(

                     connection.getInputStream() );

  1.  Взаимодействие сервера и клиента через созданные потоки ввода и вывода.
  2.  Закрытие соединения путем вызова метода close класса Socket.

Реализация серверного приложения. Рассмотрим общую методику построения серверного приложения.

А. Проанализируйте структуру файла MyServer.java и обратите внимание на содержание методов main и jbInit, где создается необходимый интерфейс, и на структуру метода runServer, где реализуется сетевое взаимодействие на основе сокетного соединения.

Б. Создайте проект с именем MyServer согласно методике, изложенной на с. 65, заменив в проекте файл MyServer.java приводимым далее программным кодом. Протестируйте проект в среде JBuilder.

     Файл MyServer.java

package myserver;

import java.io.*;

import java.net.*;

import java.awt.*;

import java.awt.event.*;

//класс MyServer

public class MyServer extends Frame {

 private TextArea textArea1 = new TextArea();

 private TextField textField1 = new TextField();

 private ObjectOutputStream output;

 private ObjectInputStream input;

 public MyServer() {

   try {

     jbInit();

   }

   catch(Exception e) {

     e.printStackTrace();

   }

 }

 public static void main(String[] args) {

   MyServer mS = new MyServer();

   mS.setTitle("Окно Сервера");

   mS.setSize(350,250);

   mS.setVisible(true);

   mS.runServer();

 }

 private void jbInit() throws Exception {

   textArea1.setBackground(Color.yellow);

   textField1.addActionListener(new java.awt.event.ActionListener() {

     public void actionPerformed(ActionEvent e) {

       textField1_actionPerformed(e);

     }

   });

   this.addWindowListener(new java.awt.event.WindowAdapter() {

     public void windowClosing(WindowEvent e) {

       this_windowClosing(e);

     }

   });

   this.add(textArea1,  BorderLayout.CENTER);

   this.add(textField1,  BorderLayout.SOUTH);

 }

 void this_windowClosing(WindowEvent e) {

   System.exit(0);

 }

 void textField1_actionPerformed(ActionEvent e) {

   sendData( e.getActionCommand() );

 }

 public void runServer()  {

   ServerSocket server;

   Socket connection;

   int counter = 1;

   try {

      // Шаг 1 : создание  объекта ServerSocket.

      server = new ServerSocket( 2000, 100 );

      while ( true ) {

         // Шаг 2 : ожидание соединения.

         textArea1.setText( "Ожидание соединения\n" );

         connection = server.accept();

         textArea1.append( "Соединение  " + counter +

            " получено от: " +

            connection.getInetAddress().getHostName() );

         // Шаг 3 : создание потоков ввода и вывода.

         output = new ObjectOutputStream(

                      connection.getOutputStream() );

         output.flush();

         input = new ObjectInputStream(

                     connection.getInputStream() );

         textArea1.append( "\nСозданы потоки ввода и вывода\n" );

         // Шаг 4 : работа с соединением.

         String msg =

            "SERVER ==> Соединение прошло успешно ";

         output.writeObject( msg );

         output.flush();

         textField1.setEnabled( true );

         do {

            try {

               msg = (String) input.readObject();

               textArea1.append( "\n" + msg );

               textArea1.setCaretPosition(

                  textArea1.getText().length() );

            }

            catch ( ClassNotFoundException cnfex ) {

               textArea1.append(

                  "\nПолучен неизвестный тип объекта" );

            }

         } while ( !msg.equals( "CLIENT ==> ЗАКОНЧИТЬ" ) );

         // Шаг 5 : закрытие соединения.

         textArea1.append( "\nКлиент закончил соединение" );

         textField1.setEnabled( false );

         output.close();

         input.close();

         connection.close();

         ++counter;

      }

   }

   catch ( EOFException eof ) {

      System.out.println( "Клиент закончил соединение" );

   }

   catch ( IOException io ) {

      io.printStackTrace();

   }

   }

 private void sendData( String s )   {

   try {

        output.writeObject( "SERVER ==> " + s );

        output.flush();

        textArea1.append( "\nSERVER ==>" + s );

       }

   catch ( IOException cnfex ) {

        textArea1.append(

           "\nОшибка при выводе" );

      }

  }

}

Контрольное задание 1. Составьте вариант проекта MyServer1, в котором изменено взаимное расположение областей ввода и вывода информации. Протестируйте проект в среде JBuilder.

Клиентские приложения на основе сокетов

Методика создания сокетного соединения клиента. Сокетное соединение на стороне клиента реализуется путем выполнения следующих действий:

  1.  Создание объекта класса Socket при помощи конструктора класса

    Socket connection  = new Socket ( адрес, порт );

   Аргументы конструктора задают используемый адрес и номер порта

   сервера.

  1.  Получение объектов потока вывода ObjectOutputStream и потока ввода ObjectInputStream, позволяющих клиенту взаимодействовать с сервером. Для создания потоков используются методы getOutputStream и getInputStream класса Socket

         ObjectOutputStream output = new ObjectOutputStream(

                      connection.getOutputStream() );

         ObjectInputStream input = new ObjectInputStream(

                     connection.getInputStream() );

  1.  Взаимодействие сервера и клиента через созданные потоки вывода и ввода.
  2.  Закрытие соединения путем вызова метода close класса Socket.

Реализация клиентского приложения. Рассмотрим общую методику построения клиентского приложения.

А. Проанализируйте структуру файла MyClient.java и обратите внимание на содержание методов main и jbInit, где создается необходимый интерфейс, и на структуру метода runClient, где реализуется сетевое взаимодействие на основе сокетного соединения.

Б. Создайте проект с именем MyClient согласно методике, изложенной на с. 65, заменив в проекте файл MyClient.java приводимым далее программным кодом. Протестируйте проект в среде JBuilder.

     Файл MyClient.java

package myclient;

import java.io.*;

import java.net.*;

import java.awt.*;

import java.awt.event.*;

// класс MyClient

public class MyClient extends Frame {

 private TextArea textArea1 = new TextArea();

 private TextField textField1 = new TextField();

 private ObjectOutputStream output;

 private ObjectInputStream input;

 private String msg = "";

 public MyClient() {

   try {

     jbInit();

   }

   catch(Exception e) {

     e.printStackTrace();

   }

 }

 public static void main(String[] args) {

   MyClient mC = new MyClient();

   mC.setTitle("Окно Клиента");

   mC.setSize(300,300);

   mC.setVisible(true);

   mC.runClient();

 }

 private void jbInit() throws Exception {

   textArea1.setBackground(Color.cyan);

   textField1.addActionListener(new java.awt.event.ActionListener() {

     public void actionPerformed(ActionEvent e) {

       textField1_actionPerformed(e);

     }

   });

   this.addWindowListener(new java.awt.event.WindowAdapter() {

     public void windowClosing(WindowEvent e) {

       this_windowClosing(e);

     }

   });

   this.add(textArea1,  BorderLayout.CENTER);

   this.add(textField1,  BorderLayout.SOUTH);

 }

 void textField1_actionPerformed(ActionEvent e) {

   sendData( e.getActionCommand() );

 }

 void this_windowClosing(WindowEvent e) {

 System.exit(0);

 }

 public void runClient() {

    Socket client;

    try {

       // Шаг 1 : создание  сокета для соединения.

       textArea1.setText( "Попытка соединения\n" );

       client = new Socket( InetAddress.getByName( "127.0.0.1" ), 2000 );

       textArea1.append( "Соединен с: " +

          client.getInetAddress().getHostName() );

       // Шаг 2 : создание потоков ввода и вывода.

       output = new ObjectOutputStream( client.getOutputStream() );

       output.flush();

       input = new ObjectInputStream( client.getInputStream() );

       textArea1.append( "\nСозданы потоки ввода и вывода \n" );

       textArea1.append( "\nДля прекращения связи ввести: ЗАКОНЧИТЬ \n" );

       // Шаг 3 : работа с соединением.

       textField1.setEnabled( true );

       do {

          try {

             msg = (String) input.readObject();

             textArea1.append( "\n" + msg );

             textArea1.setCaretPosition(

                textArea1.getText().length() );

          }

          catch ( ClassNotFoundException cnfex ) {

             textArea1.append( "\nПолучен неизвестный тип объекта" );

          }

       } while ( !msg.equals( "SERVER ==> ЗАКОНЧИТЬ" ) );

       // Шаг 4 : закрытие соединения.

       textArea1.append( "\nЗакрытие соединения.\n" );

       output.close();

       input.close();

       client.close();

       }

       catch ( EOFException eof ) {

          System.out.println( "Сервер закончил соединение" );

       }

       catch ( IOException e ) {

          e.printStackTrace();

       }

    }

  private void sendData( String s ) {

       try {

          msg = s;

          output.writeObject( "CLIENT ==> " + s );

          output.flush();

          textArea1.append( "\nCLIENT ==> " + s );

       }

       catch ( IOException cnfex ) {

          textArea1.append( "\nОшибка вывода объекта" );

       }

    }

}

Контрольные задания:

2. Откройте и запустите в среде JBuilder проект MyServer, а затем проект MyClient и протестируйте взаимодействие клиентского и серверного приложений на одном компьютере. 

Установите в локальной сети на компьютере приложение MyServer, а на другом компьютере приложение MyClient. Определите IP-адрес компьютера, используемого в качестве сервера, и модифицируйте в клиентском приложении адрес сервера. Протестируйте взаимодействие клиентского и серверного приложений в локальной сети. 

Выводы

Технология сокетных соединений Java позволяет компьютеру обслуживать несколько различных клиентов. Для управление таким обслуживанием вводится понятие порт, который является пронумерованным сокетом на конкретной машине. Сервер может принять много клиентов, присоединенных к одному номеру порта, хотя каждый сеанс уникален.

Заключение

Из рассмотренных в настоящей работе способов реализации клиент-серверных взаимодействий на основе языка Java наиболее эффективным и удобным с практической точки зрения является способ, основанный на технологии активных серверных страниц. JSP-страницы являются расширением технологии сервлетов и существенно упрощают создание Web-приложений как в процессе разработки, так и при их доставке на сервер. Поэтому в ближайшей перспективе следует ожидать, что технология активных серверных страниц получит еще большее распространение и станет основной при программировании клиент-серверных взаимодействий на Java.


 

А также другие работы, которые могут Вас заинтересовать

32669. Методы управления 57.5 KB
  Огут быть сгруппированы по: Объекту управления Федер. Субъекту управления организационнораспорядительные хозяйственные Целям стратегического управления тактического оперативного Механизму влияния социальнополитические организационнораспорядительные организационнопедагогические Стилю авторитарные демократические либеральные Времени управленческих действий перспективные долгосрочные текущие Методы управления это система способов воздействия субъекта управления на объект для достижения определенного...
32670. Классификация подходов к управлению образовательным процессом 53 KB
  В качестве основы управления педагогическими системами а образовательный процесс представляет собой педагогическую систему Н. Коммуникативная функция нацелена на построение необходимых взаимоотношений и связей между субъектами управления. Конаржевский в процессе управления школой выделяет следующие функции: педагогический анализ планирование организацию внутришкольный контроль регулирование. Якунин рассматривая обучение как процесс управления в качестве относительно самостоятельных но взаимосвязанных функций управления выделяет:...
32671. Общее понятие систем 152 KB
  Системный подход – это подход к исследованию объекта проблемы процесса явления организации как системы в которой выделены элементы внутренние и внешние связи наиболее существенным образом влияющие на исследуемые результаты его функционирования а цели каждого из элементов определены исходя из общего предназначения объекта На сегодняшний день существует большое разнообразие конкретных моделей системного подхода к управлению. Сущность системного подхода заключается в исследовании наиболее общих форм организации которое предполагает...
32672. Общая характеристика образовательных систем 133 KB
  Поэтому происходит обновление деятельности всех звеньев системы образования. В новых социокультурных условиях остро стоит проблема формирования целостной системы непрерывного образования в России. Принцип непрерывности предполагает что отдельные образовательные учреждения являются подсистемами общей системы образования человека в течение всей его жизни.
32673. Образовательный процесс как система 59.5 KB
  Уровни образовательного процесса. Компоненты и структура образовательного процесса. В образовательном учреждении можно выделить большое разнообразие образовательных систем: целостный педагогический образовательный процесс процесс обучения; процесс воспитания учебное занятие Понятие процесса образовательного процесса.
32675. Понятие управления и педагогического менеджмента 127.5 KB
  Усложняются задачи управления. Отметим что в российской практике управления образовательными учреждениями а капитана корабля естественно сравнивать с руководителем школы или образовательного учреждения иного типа управленческие цели продолжают ставить чаще всего исходя из анализа состояния образовательного процесса то есть заказ является внутренним а не исходя из изменяющихся общественных потребностей внешний по отношению к учреждению заказ. На следующем этапе управления капитану необходимо построить уже конкретную программу...
32676. Эволюция управленческой мысли 55.5 KB
  Фредерик Уинслоу Тейлор опубликовал книгу Принципы научного управления. Выделяются 4 важнейших подхода: Подход с позиций выделения различных школ управления иначе его называют классическим или традиционным подходом Первая половина ХХ века 18851950 Школа научного управления 18851920 Административная школа 19201950 Школа психологии и человеческих отношений 19301950 Школа науки управления количественная школа 1950 1.Ситуационный подход 1960 Характеризуется тем что пригодность различных методов управления...
32677. Основные функции управления (педагогического менеджмента) 290.5 KB
  Планирование как функция управления Функция управления – контроль. Процесс управления 1. Понятие функции управления Каждая система которая создаётся нужна для чегото.