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.


 

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

29419. Инвестиции и их функциональная роль. Сбережения, инвестиции, мультипликатор инвестиций. Инвестиции и реальный экономический рост 1.87 MB
  Инвестиции и их функциональная роль. Сбережения инвестиции мультипликатор инвестиций. Инвестиции и реальный экономический рост Староверова Г.
29420. Цикличность как всеобщая форма экономической динамики 58 KB
  Виды экономических циклов Современная экономическая наука насчитывает большое количество видов циклов. Объективными основаниями разграничения экономических циклов являются: а периодичность обновления отдельных частей капитала; б изменения обусловленные обновлением элементов зданий сооружений; в изменения обусловленные демографическими процессами и сельским хозяйством. Можно выделить следующие основные виды экономических циклов. Этот вид циклов Китчин связывал с изменениями мировых запасов золота Э.
29421. Денежный рынок в макроэкономике 131.5 KB
  В экономической литературе имеется несколько определений понятия денег. Наиболее характерная черта денег их высокая ликвидность. Сущность денег проявляется в их функциях. Маркс выделял пять функций денег: мера стоимости; средство обращения; образование сокровищ; средство платежа; мировые деньги.
29424. Масштабы и отраслевые приоритеты формирования госсектора 67.5 KB
  Государственный сектор экономики включает в себя все экономические ресурсы которыми владеет государство и все организации с помощью которых осуществляется государственное регулирование экономики. Государственный сектор часть смешанной экономики полностью контролируемая государственными органами находящаяся в собственности государства. В государственный сектор экономики входят: образование национальная служба здравоохранения социальные услуги общественный транспорт национальные и местные государственные предприятия и государственные...
29425. Валютные рынки: принципы организации, институты, средства обмена. Валютная система. Валютный курс 54 KB
  В зависимости от объема характера валютных операций и количества используемых валют различают мировые региональные и национальные валютные рынки. Именно межбанковская торговля и определяет значения валютных курсов регулярно публикуемых в открытой печати. Институты участники 1 основными участниками ВР являются коммерческие банки они проводят основной объем валютных операций. Суммарные заявки от импортёров формируют устойчивый спрос на иностранную валюту а от экспортёров её предложение в том числе в форме валютных депозитов временно...
29427. Спрос на деньги и их предложение. Монетаристкий и кейнсианский подходы к количественной теории денег 18.58 KB
  В данной теории рассматривается следующая цепь причинноследственных связей предложения денег и номинального ВНП: изменение денежного предложения изменение уровня процентной ставки изменение инвестиционного спроса мультипликационый эффект изменение номинального ВНП. Основное уравнение на котором базируется кейнсианская теория денег: Y= CGINX 1 где Y номинальный объем ВНП; С потребительские расходы; G государственные...