4909

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

Реферат

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

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

Русский

2012-11-29

80 KB

30 чел.

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

Рассматривается методика построения 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.


 

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

39847. Организуем компьютерное рабочее место 1.23 MB
  Настройка параметров новых документов. Настройка параметров системы КОМПАС3D LT означает выбор параметров оформления чертежа в соответствии с Единой системой конструкторской документации ЕСКД которые наилучшим образом соответствуют выбранному вами формату чертежа. Ранее вы уже познакомились с некоторыми принципами настройки параметров системы см.
39848. ЭКОНОМИКА, И УПРАВЛЕНИЕ ПРОИЗВОДСТВОМ 718.5 KB
  Именно на этом уровне создается нужные обществу товары и услуги, выпуск необходимой продукции. На предприятии сосредоточены наиболее квалифицированные кадры. Здесь решаются вопросы экономного расходования ресурсов, применение высокопроизводительной техники, технологии.
39849. Назначение и принцип действия изделия, сборочной единицы, в которую входит деталь 758 KB
  Форма детали позволяет получать заготовку простой формы с минимальными припусками.25 Диаметр отверстия шпинделя мм 55 Внутренний конус шпинделя Морзе 6 Частота вращения шпинделя мин –1 12.1000 Частота вращения шпинделя мин.9 Скорость быстрых перемещений суппорта мм мин.
39850. Проектирование участка механической обработки для изготовления детали узла 53-320-ГОСТ 387 KB
  Проектируемые и реализуемые производственные процессы должны обеспечивать решение следующих задач: выпуск продукции необходимого качества, без которого затраченные на неё труд и материальные ресурсы будут израсходованы бесполезно; выпуск требуемого количества изделий в заданный срок при минимальных затратах живого труда и вложенных капитальных затратах.
39851. Проектирование участка механической обработки деталей узла Мотоблока 1.61 MB
  Развитие и повышение эффективности машиностроения возможно при существенном росте уровня автоматизации производственного процесса. В последние годы широкое распространение получили работы по созданию новых высокоэффективных автоматизированных механосборочных производств и реконструкции действующих производств
39852. Проектирование участка механической обработки детали узла 58-308-00СБ Деталь: Вал-шестерня 58-308-01 N=400 шт 2 MB
  В связи с изменением методов проектирования и структуры технологической оснастке и широкое применение получит оснастка многократного использования. Опыт работы заводов показывает, что внедрение переналаживаемых станочных приспособлений в 2-3 раза сокращает трудоемкость проектирование и в 3-4 раза цикл изготовления станочных приспособлений.
39854. Разработка технологического процесса механической обработки деталей узла Редуктор - 338 – Б – 0002 1.34 MB
  Проектируемые и реализуемые производственные процессы должны обеспечивать решение следующих задач: выпуск продукции необходимого качества, без которого затраченные на неё труд и материальные ресурсы будут израсходованы бесполезно; выпуск требуемого количества изделий в заданный срок при минимальных затратах живого труда и вложенных капитальных затратах.
39855. Проектирование участка механической обработки для изготовления детали узла МБ – 901 «Барабан сцепления ведомый» 236.5 KB
  Проектируемые и реализуемые производственные процессы должны обеспечивать решение следующих задач: выпуск продукции необходимого качества без которого затраченные на нее труд и материальные ресурсы будут израсходованы бесполезно; выпуск требуемого количества изделий в заданный срок при минимальных затратах живого труда и вложенных капитальных затрат. В дальнейшем это позволит создавать интегрированные производства обеспечивающие автоматизацию основных и вспомогательных процессов и при минимальном участии человека в производственном...