Отримання додаткової інформації на сервері
Програмування мережевого клієнт-серверного додатку, який демонструє технологію обміну даними за допомогою сокетів. Організація вхідних та вихідних даних сервлета і аплета. Опис логічної структури, принципу роботи та алгоритму написання протоколу.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | практическая работа |
Язык | украинский |
Дата добавления | 13.06.2010 |
Размер файла | 29,6 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Отримання додаткової інформації на сервері
АНОТАЦІЯ
Опис програми Л.Ф.Ф.507193-01 13 01-1 містить відомості про функціональне призначення програми, відомості про структуру вхідних та вихідних даних, особливості побудови і роботи.
Текст програми Л.Ф.Ф.507193-01 12 01-1 написаний на об'єктно-орієнтованій мові програмування Java.
ЗМІСТ
1.Вступ
2.Призначення та область використання
3.Технічні характеристики
3.1 Постановка задачі для розробки програми
3.2 Опис організації вхідних та вихідних даних
4.Техніко-економічні показники
5. Опис програми
Література
Додаток
1. ВСТУП
Програма Л.Ф.Ф.507193-01 представляє собою мережевий клієнт-серверний додаток, який демонструє технологію обміну даними за допомогою сокетів. Робота виконувалась двома студентами. В якості сервера було створено програму-сервлет, який розміщується на WEB-сервері. Клієнтська частина програми реалізована у вигляді аплета, що включається в динамічно створену сервлетом WEB-сторінку.
Використання технології сервлетів дає змогу перейти від типових CGI-скриптів, що зустрічаються на багатьох WEB-серверах, на більш розвинуту технологію платформово-незалежних додатків. Вивчення сокетів дало можливість отримати повне уявлення про ієрархічну структуру мережевих протоколів і написати свій протокол прикладного рівня.
2.ПРИЗНАЧЕННЯ ТА ОБЛАСТЬ ВИКОРИСТАННЯ
Програма Л.Ф.Ф.507193-01 призначена для демонстрації можливості написання і роботи мережевих додатків на транспортному рівні за допомогою сокетів. Програма також демонструє можливості і переваги технології сервлетів. Ця технологія є незамінною при організації великих WEB-сайтів, що працюють з великою кількістю запитів, наприклад, з базами даних. Керування аплетом демонстраційної програми здійснюється за допомогою клавіатури і миші.
3.ТЕХНІЧНІ ХАРАКТЕРИСТИКИ
3.1 ПОСТАНОВКА ЗАДАЧІ ДЛЯ РОЗРОБКИ ПРОГРАМИ
У відповідності до завдання курсової роботи, потрібно розробити клієнт-серверний додаток, що реалізує передачу даних за допомогою сокетів.
Програма реалізована на основі двох базових класів, написаних на мові Java - rcSocketServlet і rcSocketApplet. Перший представляє собою додаток-сервлет, що встановлюється на WEB-сервер, другий клас - це аплет, що завантажується з WEB-сервера разом з динамічно створеною сервлетом сторінкою. Між цими додатками створюється зв'язок на рівні потоків байт через сокети.
Сервлет - це частина веб-сервера. Він не містить ніяких явних огранів взаємодії з користувачем і призначений тільки для обробки запитів з машини клієнта за протоколом HTTP. Керування сервлетом в програмі не здійснюється, потрібне лише його встановлення і початкове конфігурування на веб-сервері.
Аплет програми містить набір графічних органів управління для взаємодії з користувачем. Початкове вікно містить поле для вводу логіна користувача, його пароля і кнопки для підтвердження реєстрації, а також кількох міток з текстом для виведення підказок. Кінцеве вікно містить текстові поля з інформацією про користувача, яку можна редагувати, кнопок для збереження інформації на сервері і припинення зв'язку і мітки з підказками.
Суть програми полягає в демонстрації можливостей роботи з мережевими додатками за допомогою сокетів.
3.2 ОПИС ОРГАНІЗАЦІЇ ВХІДНИХ ТА ВИХІДНИХ ДАНИХ
Вхідні та вихідні дані програми можна розділити на вхідні дані сервлета і вхідні дані аплета. Вхідними даними сервлета є дані, передані йому аплетом, а також файли з даними про користувачів і файлами шаблонів. Вихідними даними сервлета є дані про користувача, що передаються через сокет і дані вихідного потоку, для динамічного формування веб-сторінки.
Вхідними даними аплета є реєстраційні дані введені користувачем. Вихідними - інформація про користувача, прийнята і відображена у діалоговому вікні, і дані що передаються сервлету.
4. ТЕХНІКО-ЕКОНОМІЧНІ ПОКАЗНИКИ
Швидкість роботи програми залежить від кількох факторів. Зокрема це швидкість і завантаженість мережі, що з'єднує машини клієнта і сервера (програма може виконуватись і на одній машині, тоді ця проблема відпадає) а також швидкість роботи машини сервера і клієнта. Програма була розроблена і відтестована в середовищі Windows 2000 Professional з веб-сервером Microsoft Information Services і розширенням для запуску сервлетів New Atlanta ServletExec на машині AMD Athlon 700/128RAM. Час завантаження аплета з такого сервера і результату обробки сервлета склав приблизно 2сек.
5. ОПИС ПРОГРАМИ
ЗАГАЛЬНІ ПОЛОЖЕННЯ
Програма Л.Ф.Ф.507193-01 призначена для демонстрації можливостей роботи з сокетами, а також для демонстрації технології сервлетів. Програму написано мовою ООП Java. Передача даних в програмі відбувається через вхідні і вихідні потоки. Взаємодія з клієнтською частиною програми здійснюється за допомогою клавіатури і миші.
ФУНКЦІОНАЛЬНЕ ПРИЗАЧЕННЯ
Програма призначена для видачі даних про користувача після його реєстрації на сервері через клієнтську частину, яка представляє собою аплет. Користувач реєструється логіном або номером і паролем, після чого аплет відображає отриману з сервера інформацію про користувача.
ОПИС ЛОГІЧНОЇ СТРУКТУРИ
Програма реалізована у двох базових класах rcSocketServlet і rcSocketApplet. Перший клас представляє собою сервлет, який встановлюється на веб-сервері. Клас перекриває метод doGet класу сервлета, реалізуючи всю структуру взаємодії з клієнтом. Крім цього сервлет використовує файли ресурсів, що розміщені на сервері. Клас є платформово-незалежним від файлової системи веб-сервера.
Другий клас представляє собою аплет, що завантажується з веб-сервера разом з веб-сторінкою, яка формується динамічно сервлетом. Аплет містить частини графічного інтерфейсу для взаємодії з користувачем. Клас встановлює з'єднання з вільним портом сервера, який передається йому параметром у веб-сторінці, після чого обмінюється інформацією з сервлетом через сокети.
ТЕХНІЧНІ ЗАСОБИ, ЩО ВИКОРИСТОВУЮТЬСЯ
Для тестування програми потрібна ЕОМ з встановленою графічною мережевою операційною системою з переглядачем веб-сторінок.
Для запуску сервлета потрібна машина з встановленим веб-сервером з підтримкою технології сервлетів.
ЗАВАНТАЖЕННЯ ТА ЗВЕРНЕННЯ ДО ПРОГРАМИ
Компіляція програми здійснюється за допомогою Java SDK з встановленими класами для розробки сервлетів. Серверна частина програми запускається на веб-сервері. Клієнтська частина запускається через переглядач веб-сторінок з цього сервера, наприклад Internet Explorer або Netscape Communicator.
ВХІДНІ ДАНІ
Для реєстації на сервері користувач повинен ввести в поля запиту свій логін або порядковий номер (слід обрати потрібний варіант). Як вихідні дані користувач отримує інформацію про себе, яку знову ж може редагувати як вхідні дані і відправити їх на сервер для оновлення.
ВИХІДНІ ДАНІ
Вихідними даними є інформація про користувача, що отримується з сервера.
Вибір технічного та програмного забезпечення
Перед тим, як приступити до вибору технічного забезпечення потрібно визначити канали зв'язку. Тобто канал зв'язку сервера з всесвітньою глобальною мережею Internet.
Не маючи прямого доступу до супутника, можна одержати доступ до нього через будь-якого провайдера. Тобто наземними каналами зв'язку (у нашому випадку цифрова або аналогова виділена лінія). Аналогова лінія в даний час уже не має змісту, так як пропускна здатність у неї набагато нижча, ніж у цифровому каналі, який дозволяє працювати на швидкостях до 56 Кбіт/с. У будь-якому випадку потрібно реєструватися у провайдера і купляти виділений канал.
Київська фірма "EuropeOnLine" дозволяє користувачу отримувати доступ до мережі Internet з швидкістю 2 Мбіт/с з спутникової тарілки. Як відомо співвідношення відправлених та одержаних байт, в залежності від величини файлів, що зкачуються, становить всередньому 1:10. Це значить, що на один відправлений байт інформації ми можемо одержати 10 таких байт інформації. Звідси виходить, що для того, щоб забезпечити швидкість отримування даних 2Мбіт/с з "EuropeOnLine" без затримок нам потрібно "землею" відправляти запити з швидкістю 200 Кбіт/с. Для наземного каналу - це досить висока швидкість. Тому нам потрібно взяти трафік у будь-якого провайдера на менше 64 К.
Тернопільський "Інфоком" дає можливість користувачам підключатися до нього без проведення виділеного каналу безпосередньо до місця підключення. Потрібно тільки провести виділений канал до місцевого "Укртелекому".
Для забезпечення багатоканальності телефонного номера, у місцевого "Укртелекому" закупляємо цілий цифровий блок.
Для організації цього зв'язку потрібно два модеми: один тернопільському "Інфокому", а другий для себе. Модеми повинні забезпечувати швидкість передачі даних 64 К. В якості таких модемів візмемо: U.S.ROBOTICSCOURIER 56k ext v.34 external с v.90 56Kbps* и x2, v.34, v.32, v.22, v.21, v.17. Цей модем підтримує багато протоколів, а також відповідає нашим вимогам.
Спочатку можна розраховувати на одночасну роботу 10 абонентів. Для цього нам потрібно 10 вхідних модемів по класу нижче за попередні. Тобто можна зупинити свій вибір на GVC EXT. 56600 VOICE/ MODEM ВЕКТОР SS 1156V/R21L. Цей модем буде забезпечувати стійку швидкість та надійну роботу абонентів з мережею Internet.
Для того, щоб підібрати конфігурацію сервера, слід врахувати під управлінням якої операційною системою він буде працювати.
В якості операційної системи на сервері візьмемо ОС Windows 2000 Profesional Server. ОС типу Windows 9x/Windows NT краще показали себе в роботі на процесорах Intel. Тому візьмемо процесор Intel Pentium III 800 Mhz BOX. Відповідно до процесора візьмемо материнську плату та інше, що потрібне для нормальної роботи ОС Windows 2000 (особлива вимога оперативна пам'ять (не менше 96 Мб) та місце на жорсткому диску (не менше 1Гб). Якщо під електронну пошту виділити на окремого користувача 5 Мб, то потреба в ємності жорсткого диску різко зросте, тому придбаємо один жорсткий диск SCSI, ємність якого буде складати порядка 4,3 Гб - під операційну систему; та другий під користувачів на 30 Гб 7200 об.
Локальну мережу будемо створювати на витій парі. Швидкість та надійність такої мережі буде забезпечувати ефективне функціонування мережі. Тому нам потрібно придбати один 24-х канальних хаб, або два 12 канальні і т.д. (також потрібно врахувати довжину кабелю та кількість конекторів.
Визначимо ще один сервер під ІР-телефонію та мережевий маркетинг. По параметрах він буде відповідати основному домену. Також для нього взятий ще один багатоканальний телефонний номер. Такий розподіл ресурсів в мережі дозволить краще настроїти функції серверів, та підвищити контроль від несенкціонованого доступу. На додатковому сервері будуть також розміщатися Web-сайти різних організацій та підприємств, чи просто приватних осіб. В майбутньому він буде виступати в ролі пошуково-інформаційного сервера.
Визначимо ще чотири робочих станції під ІР-телефонію та послуги Internet. Ці робочі станції будуть працювати під управлінням ОС Windows NT 4.0 WorkStation на базі процесора Intel Celeron 700 Mhz BOX. Процесор працює на шині 100 Mhz, тому в роботі себе показав як швидкісний.
Все технічне обладнання детальніше розглядається в економічному розрахунку, а дані зведені в додатку а.
ПРИНЦИП РОБОТИ ПРОГРАМИ
Програма представляє собою мережний клієнт-серверний додаток, що обмінюється даними через сокети. Загальні принципи роботи програми полягають в наступному.
Серверна частина представляє собою клас, який є сервлетом. Цей клас встановлюється на веб-сервері, який підтримує технологію сервлетів. Більш детальна інформація по настройці веб-сервера і встановленню наведена нижче. Після встановлення сервлета користувач отримує можливість його виклику. Це здійснюється шляхом введення адреси і псевдоніма сервлета у адресному рядку браузера. Результат такої дії, як і виклик по гіперссилці, є передача запиту GET браузером на веб-сервер. Сервлет перехоплює цей виклик. Для цього у класі сервлета визначений метод doGet.
Після цього сервлет пробує знайти вільний порт. Якщо такого немає, у відповідь баузеру (у його вхідний потік) засилається повідомлення про відсутність вільних портів і програма припиняє роботу. Взагалі, для зменшення об'єму сервлету, в програмі використовуються файли ресурсів, розміщені на локальному диску веб-сервера у каталог /usr/patterns/. Це заготовки (частини) HTML-сторінок, які зчитуються рядок за рядком і передаються у вхідний потік браузера. Такий підхід дозволяє значно зменшити код сервлета від надлишкового тексту і суттєво зекономити пам'ять веб-сервера, особливо при активних запитах на сервлет.
Як тільки вільний порт було знайдено, сервер створює динамічну веб сторінку, використовуючи файли ресурсів, сам формує теги аплета, заносячи в його параметри номер порту і свій доменний адрес у мережі і відправляє ці дані у вхідний потік браузера, після чого створює на знайденому порті сокет і починає очікувати з'єднання. Аплет, що є клієнтом у програмі, завантажується браузером, зчитує параметри (номер порта і адрес сервера) з свого тегу у веб-сторінці, формує на вказаному порті сокет і намагається з'єднатись з сервлетом. Якщо на цьому етапі помилок не виникло (в програмі передбачене перехоплення практично всіх виключень, тому при появі помилки інформація про це буде виведена користувачеві), аплет виводить форму вводу логіна і пароля, при чому в якості логіна можна використати як псевдонім (нік) користувача, так і його реєстраційний номер (спосіб обирається перемикачами) і очікує вводу даних, після чого передає ці дані сервлету через сокет.
Сервлет отримує реєстраційні дані користувача і відкриває файл з логінами і паролями всіх зареєстрованих користувачів і починає пошук користувача і порівняння паролів. При відсутності користувача в цьому файлі або невірності пароля інформація про це передається аплету, після чого цикл реєстрації повторюється. Якщо ж реєстрація пройшла успішно, аплету передаються дані про користувача - повне ім'я, адрес електронної пошти, телефон та інтереси. Аплет відображує ці дані у текстових полях, що підлягають модифікації. Модифіковані дані користувач може знов направити на сервер сервлетові і останній їх зберігає у файлі користувача. Ім'я цього файлу співпадає з номером користувача. На цьому сеанс з'єднання клієнта з сервером припиняється і всі задіяні на нього ресурси (порти, сокети і потоки) звільняються.
КОНФІГУРУВАННЯ СЕРВЛЕТІВ І НАСТРОЙКА ВЕБ-СЕРВЕРА MICROSOFT INFORMATION SERVICES З ВИКОРИСТАННЯМ NEW ATLANTA ServletExec
Програма була написана, відлагоджена і протестована з використанням веб-сервера Microsoft Internet Information Services (IIS), що входить у склад операційної системи Microsoft Windows 2000 Professional. Оскільки даний веб-сервер не підтримує технології сервлетів і Microsoft не займається розробкою розширень сервера для впровадження цієї технології, доводиться встановлювати розширення, написані іншими виробниками. Дана робота розроблялася і тестувалася за допомогою ISAPI розширення сервера New Atlanta ServletExec. Нижче приведений короткий опис роботи з цим продуктом.
Інсталяція, настройка параметрів
Програма розширення поставляється у вигляді інсталятора. Процес інсталяції програми доволі простий. Слід лише запустити програму-інсталятор і виконувати всі вказані нею дії. У процесі інсталяці можливі такі нетипові ситуації:
Інсталятор не знайшов віртуальної машини Java фірми Sun версії 1.3. При цьому буде використовуватись віртуальна машина від Microsoft, але її можливості значно обмеженіші. Рекомендується встановити Sun Java Runtime Environment v1.3.
Інсталятор не зміг знайти жодного віртуального каталога з правом на читання і локальний запуск скриптів. При цьому буде здійснено запит на вибір такого каталога вручну. Після інсталяції цьому каталогу слід надати обумовлені права.
Інсталятор сам настроїть веб сервер, додавши свій ISAPI фільтр. При цому буде перекритий віртуальний каталог servlet веб-сервера. Ні в якому випадку не слід створювати такий каталог вручну, оскільки це викличе конфлікт в роботі фільтра.
Для завершення інсталяції слід перезапустити сервіс веб-сервера.
Додавання і конфігурація сервлетів
Подальше керування і настройка сервлетів здійснюється за допомогою веб-інтерфейсу програми ServletExec. Для запуску конфігуратора слід у адресному рядку браузера ввести такий URL:
http://<Ім'я сервера>/servlet/admin
Після цього у вікні з'явиться веб-сторінка конфігуратора. З лівої сорони розміщені групи зсилок, що дозволяють провести певну кофігурацію сервлетів і веб-сервера. Розглянемо лише ті, що мають суттєве відношення до сервлетів. Більш детальна інформація приведена у файлі документації, що входить в дистрибутив.
Servlets Configure
Основна форма для реєстрації сервлетів на сервері. Форма містить кнопки:
Add Servlet. Викликає наступну форму для додавання сервлета. У формі слід вказати: Servlet Name - псевдонім сервлета, Servlet Class - ім'я класу сервлета, Code base - URL класу сервлета. Крім цього є можливість задати дані ініціалізації.
Update - встановити новий ордер завантаження для сервлетів. Ордер вказує на кількість сервлетів, що знаходитимуться у пам'яті веб-сервера на момент його запуску. Якщо ордер не вказаний, то сарвлети завантажуватимуться по приходженні запиту.
Reload - перезавантажує у пам'ять заново клас сервлета. Якщо сервлет не має параметра ордеру завантаження, то операції перезавантаження виконувати не потрібно.
Remove - видаляє сервлет з списку зареєстрованих.
Servlets Aliases
Форма дозволяє створювати префіксні та суфіксні псевдоніми для виклику сервлетів. В поле Alias форми вноситься префікс або суфікс псевдоніма а у поле Servlet Name(s) його ім'я (псевдонім з попередньо розглянутої форми). Префікс повинен починатися з символа "/", а суфікс "*.". Якщо веб-сервер у запиті зустріне URL з співпадаючим префіксом або суфіксом, то буде викликаний сервлет, який з ним асоційований.
Приклад
Наведемо приклад реєстрації сервлета.
Нехай є клас сервлета rcServletDemo, локально розміщений на веб-сервері в директорії c:\user\servlet\. Зареєструємо його з іменем fire. Для цього в розділі Servlets виберемо пункт configure. У формі натиснемо кнопку Add Servlet. Заповнимо форму, що з'явилася такими даними: Servlet Name: fire, Servlet Class: rcServletDemo, Code Base: file:///c:/user/servlet// Натиснемо кнопку Submit. Сервлет тепер зареєстрований. Для його запуску слід скористатися URL: http://<ServerName>/servlet/users.
Тепер припустимо, що потрібно викликати сервлет не вказуючи віртуальної директорії servlet. Для цього в формі Servlets aliases в поле Alias введемо новий псевдонім-префікс, наприклад /fire, а в поле ServletName(s) - fire. Тепер ми можемо звертатись до сервлета просто: http://<ServerName>/use.
ЛІТЕРАТУРА
Фролов В.И. Программирование на Java.
Sun Java SDK Documentation v1.3.0
ДОДАТОК
Текст програми
/*********************************************************************\
// Importing Classes
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.net.*;
import java.util.*;
// Main applet class.
// It extends ActionListener interface to catch button clicks.
public class rcSocketApplet extends Applet implements ActionListener {
// Defining AWT GUI components
Panel mainPanel1 = new Panel();
Panel mainPanel2 = new Panel();
GridBagLayout rcGridBagLayout1 = new GridBagLayout();
GridBagLayout rcGridBagLayout2 = new GridBagLayout();
Label rcLabel1 = new Label();
CheckboxGroup rcCheckboxGroup = new CheckboxGroup();
Checkbox rcLogNumber = new Checkbox();
Checkbox rcLogNick = new Checkbox();
Panel rcPanel1 = new Panel();
Label rcLabel2 = new Label();
BorderLayout rcBorderLayout1 = new BorderLayout();
Panel rcPanel2 = new Panel();
BorderLayout rcBorderLayout2 = new BorderLayout();
Label rcLabel3 = new Label();
TextField rcLogin = new TextField();
Panel rcPanel3 = new Panel();
BorderLayout borderLayout1 = new BorderLayout();
Label rcLabel4 = new Label();
TextField rcPassword = new TextField();
Button rcSubmit = new Button();
Panel panel2 = new Panel();
Label label2 = new Label();
Panel panel3 = new Panel();
Label label3 = new Label();
Panel panel4 = new Panel();
Label label4 = new Label();
Panel panel5 = new Panel();
Label label5 = new Label();
TextField fullName = new TextField("Full name is here");
TextField mail = new TextField("fire@sacura.net");
TextField phone = new TextField("(03722) 44073");
Checkbox isProgramming = new Checkbox("Програмування");
Checkbox isNets = new Checkbox("Мережi");
Checkbox isInternet = new Checkbox("Iнтернет");
Checkbox isDataBases = new Checkbox("Бази даних");
Checkbox isGames = new Checkbox("Iгри");
Checkbox isMusic = new Checkbox("Музика");
Button saveInfo = new Button("Зберегти");
Button quitAll = new Button("Вийти");
CardLayout rcCardLayout = new CardLayout();
// Defining socket, streams & other variables
Socket s = null;
InputStream is = null;
OutputStream os = null;
String server,login,password;
int port;
// Init applet
public void init() {
// Getting parameters from HTML. They'R generated by servlet
server = getParameter("server");
port = Integer.parseInt(getParameter("port").trim());
// Probing 2 establish connection though sockets
try {
s = new Socket(server,port);
is = s.getInputStream();
os = s.getOutputStream();
}
catch(Exception e) {
rcLabel1.setFont(new java.awt.Font("SansSerif", 1, 16));
rcLabel1.setText("Втрачено з'єднання з сервером!");
this.add(rcLabel1);
return;
}
// Adding GUI components to the applet
panel2.setBackground(Color.orange);
label2.setFont(new java.awt.Font("Dialog", 1, 14));
label2.setText("Повне iм\'я:");
panel3.setBackground(Color.orange);
label3.setFont(new java.awt.Font("Dialog", 1, 14));
label3.setText("E-Mail:");
panel4.setBackground(Color.orange);
label4.setFont(new java.awt.Font("Dialog", 1, 14));
label4.setText("Телефон:");
panel5.setBackground(Color.orange);
label5.setFont(new java.awt.Font("Dialog", 1, 14));
label5.setText("Iнтереси:");
rcLabel1.setFont(new java.awt.Font("SansSerif", 1, 16));
rcLabel1.setText("Введiть iдентифiкацiйнi данi");
this.setBackground(Color.lightGray);
this.setLayout(rcCardLayout);
mainPanel1.setLayout(rcGridBagLayout1);
mainPanel2.setLayout(rcGridBagLayout2);
rcLogNumber.setBackground(Color.gray);
rcLogNumber.setCheckboxGroup(rcCheckboxGroup);
rcLogNumber.setForeground(Color.white);
rcLogNumber.setLabel("Мiй порядковий номер");
rcLogNick.setBackground(Color.gray);
rcLogNick.setCheckboxGroup(rcCheckboxGroup);
rcLogNick.setForeground(Color.white);
rcLogNick.setLabel("Мiй нiк (звичайний логiн)");
rcCheckboxGroup.setSelectedCheckbox(rcLogNick);
rcPanel1.setLayout(rcBorderLayout1);
rcPanel1.setBackground(Color.orange);
rcLabel2.setText("В якостi логiна використати:");
rcPanel2.setLayout(rcBorderLayout2);
rcPanel2.setBackground(Color.orange);
rcLabel3.setText("Введiть логiн:");
rcPanel3.setLayout(borderLayout1);
rcPanel3.setBackground(Color.orange);
rcLabel4.setText("Введiть пароль:");
rcPassword.setEchoChar('*');
rcSubmit.setLabel("OK");
rcSubmit.addActionListener(this);
rcSubmit.setActionCommand("submit");
saveInfo.addActionListener(this);
saveInfo.setActionCommand("save");
quitAll.addActionListener(this);
quitAll.setActionCommand("quit");
this.add(mainPanel1);
this.add(mainPanel2);
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx=0;
gbc.gridwidth=2;
gbc.gridheight=1;
gbc.insets=new Insets(2,2,2,2);
gbc.gridy=1;
gbc.ipadx=289;
gbc.ipady=-10;
mainPanel2.add(panel2,gbc);
panel2.add(label2);
gbc.gridy=2;
gbc.ipadx=200;
gbc.ipady=0;
mainPanel2.add(fullName,gbc);
gbc.gridy=3;
gbc.ipadx=324;
gbc.ipady=-10;
mainPanel2.add(panel3,gbc);
panel3.add(label3);
gbc.gridy=4;
gbc.ipadx=200;
gbc.ipady=0;
mainPanel2.add(mail,gbc);
gbc.gridy=5;
gbc.ipadx=300;
gbc.ipady=-10;
mainPanel2.add(panel4,gbc);
panel4.add(label4);
gbc.gridy=6;
gbc.ipadx=100;
gbc.ipady=0;
mainPanel2.add(phone,gbc);
gbc.gridy=7;
gbc.ipadx=300;
gbc.ipady=-10;
mainPanel2.add(panel5,gbc);
panel5.add(label5);
gbc.gridwidth=1;
gbc.gridy=8;
gbc.ipadx=0;
gbc.ipady=0;
gbc.insets.left = 67;
mainPanel2.add(isProgramming,gbc);
gbc.gridy=9;
gbc.ipadx=0;
gbc.ipady=0;
gbc.insets.left = 25;
mainPanel2.add(isNets,gbc);
gbc.gridy=10;
gbc.ipadx=0;
gbc.ipady=0;
gbc.insets.left = 8;
mainPanel2.add(isGames,gbc);
gbc.gridy=11;
gbc.ipadx=50;
gbc.ipady=-3;
mainPanel2.add(saveInfo,gbc);
gbc.gridx=1;
gbc.gridy=8;
gbc.ipadx=0;
gbc.ipady=0;
gbc.insets.left = 10;
mainPanel2.add(isInternet,gbc);
gbc.gridy=9;
gbc.ipadx=0;
gbc.ipady=0;
gbc.insets.left = 24;
mainPanel2.add(isDataBases,gbc);
gbc.gridy=10;
gbc.ipadx=0;
gbc.ipady=0;
gbc.insets.left = 5;
mainPanel2.add(isMusic,gbc);
gbc.gridy=11;
gbc.ipadx=50;
gbc.ipady=-3;
mainPanel2.add(quitAll,gbc);
gbc.gridx=0;
gbc.gridy=1;
gbc.gridwidth=1;
gbc.gridheight=1;
gbc.insets=new Insets(2,2,0,2);
gbc.ipadx=136;
gbc.ipady=0;
mainPanel1.add(rcPanel1, gbc);
rcPanel1.add(rcLogNumber, BorderLayout.CENTER);
rcPanel1.add(rcLabel2, BorderLayout.NORTH);
rcPanel1.add(rcLogNick, BorderLayout.SOUTH);
gbc.gridy=0;
gbc.gridwidth=2;
gbc.insets=new Insets(2,2,2,2);
gbc.ipadx=0;
gbc.ipady=0;
mainPanel1.add(rcLabel1, gbc);
gbc.gridy=2;
gbc.gridwidth=1;
gbc.insets=new Insets(6,2,2,2);
gbc.ipadx=214;
gbc.ipady=2;
mainPanel1.add(rcPanel2, gbc);
rcPanel2.add(rcLabel3, BorderLayout.NORTH);
rcPanel2.add(rcLogin, BorderLayout.SOUTH);
gbc.gridy=3;
gbc.ipadx=201;
mainPanel1.add(rcPanel3, gbc);
rcPanel3.add(rcLabel4, BorderLayout.NORTH);
rcPanel3.add(rcPassword, BorderLayout.SOUTH);
gbc.gridy=4;
gbc.ipadx=50;
gbc.ipady=-3;
mainPanel1.add(rcSubmit, gbc);
}
// Simple function. It removes spaces from String
public String removeSpaces(String tstr) {
String str4ret=new String(), tempstr = tstr.trim();
StringTokenizer st = new StringTokenizer(tempstr);
while (st.hasMoreTokens()) {
str4ret = str4ret+st.nextToken();
}
return str4ret;
}
// Next function converts zeros & ones to boolean values
public boolean BOOL(String check) {
if(check.trim().compareTo("1") == 0) return true;
else return false;
}
// Implementation of abstract function of ActionListener interface.
// here it starts when button click event is active.
public void actionPerformed(ActionEvent e) {
// Quit button pressed:
if (e.getActionCommand() == "quit") {
try {
is.close();
os.close();
s.close();
}
catch (Exception exc) {
return;
}
}
// OK button pressed in registration form
if (e.getActionCommand() == "submit") {
rcLogin.setText(removeSpaces(rcLogin.getText()));
rcPassword.setText(removeSpaces(rcPassword.getText()));
rcLogin.select(0,14);
rcPassword.select(0,14);
login = rcLogin.getSelectedText();
password = rcPassword.getSelectedText();
rcLogin.setText(login);
rcPassword.setText(password);
byte[] trans = null;
byte[] buf = new byte[512];
String responded;
if (rcLogNick.getState()) {
try {
trans = new String("log_nick "+login+" "+password).getBytes();
}
catch (Exception eee) {
}
}
else {
try {
int a = Integer.parseInt(login);
}
catch (Exception ne) {
rcLabel1.setText("Некоректно введений номер");
return;
}
try {
trans = new String("log_number "+login+" "+password).getBytes();
}
catch (Exception eee) {
}
}
rcLabel1.setText("Передача даних на сервер...");
rcSubmit.setEnabled(false);
try {
os.write(trans,0,trans.length);
os.flush();
}
catch(Exception exc) {
rcLabel1.setText("Помилка звернення на сервер!");
return;
}
try {
is.read(buf);
}
catch(Exception exc) {
rcLabel1.setText("Помилка звернення на сервер!");
return;
}
responded = new String(buf).trim();
if(responded.compareTo("log_nouser") == 0) {
rcLabel1.setText("Такого користувача немає!");
rcLogin.setText("");
rcPassword.setText("");
rcSubmit.setEnabled(true);
return;
}
if(responded.compareTo("log_nopassword") == 0) {
rcLabel1.setText("Невiрний пароль!");
rcPassword.setText("");
rcSubmit.setEnabled(true);
return;
}
rcLabel1.setText("Реєстрацiя пройшла успiшно");
byte[] uname = new byte[256],umail = new byte[256],uphone = new byte[256],uinterests = new byte[256];
try {
is.read(uname);
os.write(uname);
os.flush();
responded = new String(uname);
fullName.setText(responded);
}
catch(Exception exc) {
rcLabel1.setText("Помилка звернення на сервер!");
return;
}
try {
is.read(umail);
os.write(umail);
os.flush();
responded = new String(umail);
mail.setText(responded);
}
catch(Exception exc) {
rcLabel1.setText("Помилка звернення на сервер!");
return;
}
try {
is.read(uphone);
os.write(uphone);
os.flush();
responded = new String(uphone);
phone.setText(responded);
}
catch(Exception exc) {
rcLabel1.setText("Помилка звернення на сервер!");
return;
}
try {
is.read(uinterests);
os.write(uinterests);
os.flush();
responded = new String(uinterests);
StringTokenizer strt = new StringTokenizer(responded.trim());
isProgramming.setState(BOOL(strt.nextToken()));
isInternet.setState(BOOL(strt.nextToken()));
isNets.setState(BOOL(strt.nextToken()));
isDataBases.setState(BOOL(strt.nextToken()));
isGames.setState(BOOL(strt.nextToken()));
isMusic.setState(BOOL(strt.nextToken()));
}
catch(Exception exc) {
rcLabel1.setText("Помилка звернення на сервер!");
return;
}
rcCardLayout.last(this);
}
// Save button pressed in user information dialog:
if(e.getActionCommand() == "save") {
try {
os.write(new String("save").getBytes());
os.flush();
byte[] buf = new byte[256];
is.read(buf);
os.write(new String(fullName.getText()).getBytes());
os.flush();
is.read(buf);
os.write(new String(mail.getText()).getBytes());
os.flush();
is.read(buf);
os.write(new String(phone.getText()).getBytes());
os.flush();
is.read(buf);
String inter = new String();
if(isProgramming.getState()) inter += "1 ";
else inter += "0 ";
if(isInternet.getState()) inter += "1 ";
else inter += "0 ";
if(isNets.getState()) inter += "1 ";
else inter += "0 ";
if(isDataBases.getState()) inter += "1 ";
else inter += "0 ";
if(isGames.getState()) inter += "1 ";
else inter += "0 ";
if(isMusic.getState()) inter += "1 ";
else inter += "0 ";
os.write(new String(inter.trim()).getBytes());
os.flush();
is.read(buf);
is.close();
os.close();
s.close();
}
catch(Exception exc) {
return; }}}}
\***************************************************************/
// Importing Classes
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
import java.net.*;
// Main Class
public class rcSocketServlet extends HttpServlet
{
// doGet method responds to browser address bar requests
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
{
// Setting content type
res.setContentType("text/html");
// Making back printer
PrintWriter out = res.getWriter();
// Defining sockets, streams & other variables
String userNumber = new String();
ServerSocket ss = null;
Socket s;
InputStream is;
OutputStream os;
BufferedReader br;
BufferedWriter bw;
// Searching for free ports
int portToConnect = 9000;
while(portToConnect<=10000) {
try {
ss = new ServerSocket(portToConnect);
break;
}
catch(Exception e) {
portToConnect++;
continue;
}
}
if(portToConnect==10001) {
// If free ports'R missing
try {
br = new BufferedReader(new FileReader("/usr/patterns/ss_noports.htm"));
while(true) {
String ts = br.readLine();
if(ts == null) break;
out.println(ts);
}
br.close();
}
catch(Exception e) {
out.println("No free ports! Try later!");
}
return;
}
// Responding with HTML content. It'll'B read from pattern file
try {
br = new BufferedReader(new FileReader("/usr/patterns/ss_ok1.htm"));
while(true) {
String ts = br.readLine();
if(ts == null) break;
out.println(ts);
}
br.close();
// Forming applet tags
out.println("<applet width=\"480\" height=\"350\" code=\"rcSocketApplet.class\" codebase=\"http://"
+req.getServerName()+"/applets/\">");
out.println("<param name=\"port\" value=\""+portToConnect+"\">");
out.println("<param name=\"server\" value=\""+req.getServerName()+"\">");
out.println("</applet>");
br = new BufferedReader(new FileReader("/usr/patterns/ss_ok2.htm"));
while(true) {
String ts = br.readLine();
if(ts == null) break;
out.println(ts);
}
br.close();
}
catch(Exception e) {
out.println("Server internal error!");
return;
}
// Flushing buffer. It's important, coz page'll not B displayed!
res.flushBuffer();
// Probing 2 establish connection
s = ss.accept();
is = s.getInputStream();
os = s.getOutputStream();
String login = new String(), password = login, method;
StringTokenizer received;
byte[] buf = null;
boolean isuser = false, ispassword = false;
int length;
while(!ispassword) {
isuser = false;
buf = new byte[512];
// Reading user login information
length = is.read(buf);
if(length == -1) {
is.close();
os.close();
s.close();
ss.close();
return;
}
// Checking in database
received = new StringTokenizer(new String(buf).trim());
method = received.nextToken();
try {
login = received.nextToken();
password = received.nextToken();
}
catch (Exception eee) {
}
try {
br = new BufferedReader(new FileReader("/usr/data/user.pwd"));
while(true) {
String rnum, rlog, rpwd, ts = br.readLine();
if(ts == null) break;
received = new StringTokenizer(ts.trim());
rnum = received.nextToken();
rlog = received.nextToken();
rpwd = received.nextToken();
userNumber = rnum;
if(method.compareTo("log_number") == 0) {
if(rnum.compareTo(login) == 0)
isuser = true;
}
if(method.compareTo("log_nick") == 0) {
if(rlog.compareTo(login) == 0)
isuser = true;
}
if(isuser) {
if(rpwd.compareTo(password) == 0)
ispassword = true;
break;
}
}
br.close();
}
catch(Exception e) {
out.println("Database ERROR!");
is.close();
os.close();
s.close();
ss.close();
return;
}
byte[] b = null;
if(!ispassword)
b = new String("log_nopassword").getBytes();
if(!isuser)
b = new String("log_nouser").getBytes();
if(isuser && ispassword)
b = new String("log_ok").getBytes();
os.write(b,0,b.length);
os.flush();
}
// If login OK, gathering user information and sending it to client
try {
byte[] tmpBuf = new byte[256];
br = new BufferedReader(new FileReader("/usr/data/"+userNumber));
byte[] b = br.readLine().getBytes();
os.write(b,0,b.length);
os.flush();
is.read(tmpBuf);
b = br.readLine().getBytes();
os.write(b,0,b.length);
os.flush();
is.read(tmpBuf);
b = br.readLine().getBytes();
os.write(b,0,b.length);
os.flush();
is.read(tmpBuf);
b = br.readLine().getBytes();
os.write(b,0,b.length);
os.flush();
is.read(tmpBuf);
br.close();
}
catch(Exception e) {
out.println("Database ERROR!");
is.close();
os.close();
s.close();
ss.close();
return;
}
try {
buf = new byte[256];
int lll;
lll = is.read(buf);
if(lll == -1) {
is.close();
os.close();
s.close();
ss.close();
return;
}
os.write(buf);
os.flush();
if(new String(buf).trim().compareTo("save") == 0) {
byte[] u_name = new byte[256];
byte[] u_mail = new byte[256];
byte[] u_phone = new byte[256];
byte[] u_inter = new byte[256];
bw = new BufferedWriter(new FileWriter("/usr/data/"+userNumber));
String tstr;
is.read(u_name);
os.write(u_name);
os.flush();
tstr = new String(u_name).trim() + "\r\n";
bw.write(tstr,0,tstr.length());
is.read(u_mail);
os.write(u_mail);
os.flush();
tstr = new String(u_mail).trim() + "\r\n";
bw.write(tstr,0,tstr.length());
is.read(u_phone);
os.write(u_phone);
os.flush();
tstr = new String(u_phone).trim() + "\r\n";
bw.write(tstr,0,tstr.length());
is.read(u_inter);
os.write(u_inter);
os.flush();
tstr = new String(u_inter).trim() + "\r\n";
bw.write(tstr,0,tstr.length());
bw.close();
}
}
catch(Exception exc) {
is.close();
os.close();
s.close();
ss.close();
return;
}
is.close();
os.close();
s.close();
ss.close();
}
// Servlet info
public String getServletInfo()
{
return "(C) 2001";
}
}
Подобные документы
Теоретичні відомості про пакет ІЗВП Borland Delphi та СУБД MS Access, оцінка їх функціональних особливостей. Опис структури бази даних. Проектування інтерфейсу програми, опис її логічної структури та функцій. Контроль коректності вхідних, вихідних даних.
курсовая работа [4,5 M], добавлен 03.01.2014Види секретної інформації та методи захисту. Тип і об’єм вхідних даних. Програмна реалізація системи алгоритму шифрування зі стисненням. Призначення та опис програмного продукту Export. Алгоритми захисту зберігання та обміну секретною інформацією.
дипломная работа [1,1 M], добавлен 19.09.2012Характеристика мов програмування. Опис логічної структури. Створення головної сторінки електронного журналу за допомогою гіпертекстової розмітки, бази даних для роботи журналу. Розробка таблиць, форм та скрипту. Тестування програмного забезпечення.
курсовая работа [659,7 K], добавлен 01.04.2016Створення баз даних для автоматизування роботи торгового представника в середовищі програмування Delрhі. Опис вхідної та результуючої інформації, формалізований опис задачі. Розробка технічного та робочого проекту, опис та обґрунтування вибору структури.
курсовая работа [135,8 K], добавлен 11.10.2010Опис та аналіз діаграм компонентів, послідовності, розгортання. Опис NoSQL бази даних. Архітектура програмної системи та обрані технології. Мова програмування Kotlin. Структури обміну даними. Патерн проектування MVP. Тестування мобільних пристроїв.
дипломная работа [8,6 M], добавлен 19.08.2016Проектування бази даних предметної області "Магазин будівельних матеріалів". Аналіз сукупності вхідних і вихідних даних, шляхи удосконалення інформаційної системи обліку товару. Організація інформаційної бази, розробка логічної і фізичної моделі.
курсовая работа [559,2 K], добавлен 09.05.2016Мови програмування. Алгоритм програми, функціональні обмеження на застосування. Опис логічної структури. Типи комп'ютерів, що використовуються при роботі програми. Виклик і завантаження. Організація, характер та попередня підготовка вихідних даних.
курсовая работа [95,0 K], добавлен 01.04.2016Історія розробки систем управління базами даних. Принципи проектування баз даних. Розробка проекту "клієнт-серверного" додатку, який гарантує дотримання обмежень цілісності, виконує оновлення даних, виконує запити і повертає результати клієнту.
курсовая работа [1,8 M], добавлен 22.04.2023Розробка програми перевірки логічного мислення людини на мові програмування С++, результатом якої є моделювання координатного переміщення. Визначення структури вхідних та вихідних даних, вибір мови програмування. Розгляд алгоритму рішення задачі.
курсовая работа [55,8 K], добавлен 28.04.2015Сутність та характеристика обліку касових операцій. Програмування та алгоритмічні мови, його основи сутність та основні особливості. Технічні характеристики. Визначення структури вхідних та вихідних даних. Вимоги до технічних засобів. Опис алгоритмів.
курсовая работа [357,5 K], добавлен 13.02.2009