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.


 

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

52342. Прес-конференція «Різноманітність птахів» 71.5 KB
  Мета: розширити знання учнів про представників класу Птахи показати їх різноманітність особливості будови та способу життя пристосування до середовища; ознайомити з характерними ознаками представників надряду Безкілеві птахи та Пінгвіни з представниками кілегрудих фауни України; продовжувати розвивати комунікативні та соціальні компетентності учнів; виховувати свідоме ставлення до природи її багатств та її захисту. Птахи це диво Їх велика кількість. Птахи Хоча ви вже багато вивчили про птахів але коли ви почуєте це слово кожний...
52343. Фантазія і творчість у роботі архітекторів 4.35 MB
  Мета уроку: Розширити уявлення про дизайн, ознайомити з наукою біонікою та показати її значення в житті людей. Спонукати до пізнання законів природи, пошуку біонічних форм. Навчити створювати контурні замальовки спрощених природних форм.
52344. Охорона біосфери 163 KB
  Тема уроку Охорона біосфери Мета: закріпити знання про біосферу як екологічну систему іі складові основні її властивості узагальнити і розширити знання учнів про напрямки діяльності людини по охороні біосфери заповідний фонд України познайомити з концепцією сталого розвитку складовими екоцентричної та антропоцентричної структури свідомості; вдосконалювати навички порівнювати робити висновки; розвивати навички вирішувати екологічні ситуації самостійно готувати матеріал до уроку створювати мультимедійну...
52345. Вплив людини на стан біосфери 162.5 KB
  МЕТА: Освітня: Розвивати вміння знаходити взаємозв’язки між діями й наслідками діяльності людини. Обладнання: Інтерактивна дошка слайди презентації фотографії з позитивним і негативними прикладами впливу людини на стан біосфери вірші про природу. Концепція уроку: Показати що діяльність людини стала провідним екологічним фактором на планеті й що зростання населення Землі призвело до демографичного вибуху перенаселеності й екологічних проблем; описати основні природні ресурси й наголосити на проблемі їхнього раціонального використання.
52346. Природные формы и явления. Выполнение творческой работы по представлению «Жар-птица» 407 KB
  Восприятие форм и цветных соотношений в природе. Воссоздание цветовых соотношений фактуры и текстуры в естественных формах в работе по воображению Жар-птица. Цель: Расширять знания о колорите палитре о теплых и холодных цветах цветовых ассоциациях; ознакомить с элементарными правилами рисования на компьютере. Развивать фантазию образное мышление чувство цвета умение передавать в колористической композиции чувства настроение фантазию образное мышление; уметь применять знания о цвете художественные техники и приемы...
52347. Обобщение темы «Птицы» 38.5 KB
  Цель: обобщить знания по теме Птицы проверить усвоение знаний об особенностях строения птиц раскрыть их значение в жизни природы и человека совершенствовать умения анализировать делать выводы работать с таблицами дополнительной литературой. Оборудование: таблица Птицы разных экологических групп таблица для Поля чудес сообщения детей Девиз: Птицы – наши...
52348. MY LAST BIRTHDAY PARTY 52 KB
  We are having an unusual lesson today. We have a lot of guests today and also a lot of interesting tasks to do. So, today we are going to speak about your favourite holiday, about birthday.
52349. AT A BIRTHDAY PARTY 93 KB
  To consolidate the previously learnt vocabulary and teach creative writing on the bases of greeting sentences and making birthday postcards. To develop skills and habits in listening, reproductive reading and speaking; To educate cultural awareness and rules of social behaviour.
52350. Порядок державної реєстрації суб‘єктів підприємницької діяльності 514 KB
  Виховна ціль: Формувати у особистості: почуття відповідальності за доручену справу; любов до майбутньої роботи в галузі підприємницької або бізнесової діяльності; сучасне економічне мислення; уміння орієнтуватися в умовах ринкових відносин; уміння самостійно приймати рішення. Завдання № 2 Визначити основні документи які необхідні для здійснення державної реєстрації юридичної особи та описати порядок державної реєстрації в залежності від запропонованої організаційноправової форми. ІІ рівень...