java клиент серверное приложение с базой данных

Пример простого клиент-серверного приложения на Java

«Клиент-сервер» это очень распространенная и логичная архитектура приложений. Мне кажется, что в наши дни редко можно встретить standalone-клиентское приложение. Поэтому я принял решение рассмотреть пример построения клиент-серверного приложения на Java без привязки к конкретной задаче. Сначала вкратце пробежимся по классовой структуре приложения, потом посмотрим на отдельную реализацию каждого класса. В самом конце статьи я дам ссылку на скачивание архива с готовой структурой приложения. Итак, начнем.

Основные компоненты приложения

Основными компонентами, естественно, являются непосредственно клиент и сервер. Однако, кроме них необходим еще пакет вспомогательных классов, которые, в простейшем случае, будут отвечать за обмен сообщениями между клиентом и сервером. В минимальной комплектации нужны такие классы: MessageReader/MessageWriter(считывает/записывает сообщение в поток на сокете), MessageFactory(содержит идентификаторы всех возможных сообщений), набор сообщений-запросов(Request) и набор сообщений-ответов(Response). Все они будут размещены в пакете «core», который должны иметь у себя и клиент и сервер.

Рассмотрим классовую структуру всего проекта, а потом перейдем к реализации.

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

Исходный код клиента на Java

Разобраться с клиентом гораздо проще, он по сути своей не делает ничего супер сложного, просто создает сокет и подключается к сервер-сокету с помощью связки host:port. Лаунчер создает объект класса Client и запускает его работу. Исходный код привожу без импортов, ибо любая IDE вам их подключит(те, кто пишет на Java точно знают, что без IDE очень сложно). Кроме того, в конце статьи вы сможете скачать архив с этим проектом.

ClientLauncher.java

Client.java

Под словами «логика приложения» я подразумеваю протокол обмена сообщениями с сервером, передачу каких-либо данных для достижения конечной цели.

Исходный код сервера на Java

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

Напомню, что в классе ClientSession описан основной алгоритм работы с клиентом, обмен сообщениями, данными и прочее. В классе Context содержится общая информация для всех клиентов сервера, например, пути для сохранения логов.

ServerLauncher.java

Server.java

Context.java

ClientSession.java

SessionsManager.java

Вспомогательные классы из пакета «core»

Помещу все вспомогательные классы под один кат, название классов в точности соответствует названиям из списка «классовая структура» выше, по нему вы можете определить пакет каждого класса.

Пара слов о сообщениях, классы Request и Response являются абстрактными и играют роль классификаторов сообщения. Благодаря этому очень удобно разграничивать «запросы» от «ответов». В этом примере я привел только одно сообщение — Handshake, которое отвечает за первое «рукопожатие» клиента и сервера. Все последующие сообщения должны быть прописаны в классе MessageFactory по примеру этих двух.

Скачать архив с шаблоном клиент-серверного приложения на Java

Заключение

Главная цель, которую я преследовал при написании этой статьи заключается в том, чтобы дать возможность мне или кому-либо еще за считанные минуты «собрать» готовое клиент-серверное приложение. Кажется, я с этим справился, если будут дополнения или замечания, пишите в комментариях или на почту. А на сегодня у меня все, спасибо за внимание!

Источник

Apache NetBeans 12.5

Автор: Трой Джуниперо (Troy Giunipero)

В этом документе описана процедура создания простого веб-приложения, которое подключается к серверу базы данных MySQL. Здесь также рассмотрены основные идеи и технологии веб-разработки, такие какJavaServer Pages (JSP), библиотека стандартных тегов JavaServer Pages (JSTL), интерфейс API связи с базами данных Java (JDBC) и двухуровневая архитектура между клиентом и сервером. Этот учебный курс разработан для начинающих разработчиков, обладающих базовыми знаниями в области веб-разработок и желающих применить свои знания к базе данных MySQL.

MySQL является популярной системой управления базами данных с открытым кодом, которая обычно используется в веб-приложениях благодаря своей скорости, гибкости и надежности. MySQL использует SQL (язык структурированных запросов) для доступа к данным в базе данных и их обработки.

netbeans stamp 80 74 73

Для работы с этим учебным курсом требуется следующее программное обеспечение и ресурсы.

7.2, 7.3, 7.4, 8.0, пакет Java EE

Драйвер JDBC MySQL Connector/J

GlassFish Server Open Source Edition 3.1.2.2

Примечания:

Комплект загрузки Java среды IDE NetBeans позволяет пользователям установить сервер GlassFish. Для работы с данным учебным курсом требуется сервер GlassFish.

Если необходимо сравнить проект с работающим решением, можно загрузить демонстрационное приложение.

Планирование структуры

С помощью двухуровневой архитектуры, в которой клиент взаимодействует с сервером напрямую, можно создать простое веб-приложение. В рамках данного учебного курса веб-приложение Java взаимодействует напрямую с базой данных MySQL с использованием API связи с базами данных Java. В сущности, именно драйвер MySQL Connector/J JDBC обеспечивает обмен данными между кодом Java, распознанным сервером приложения (GlassFish), и любым содержимым на SQL, языке, понятном для сервера базы данных (MySQL).

Для реализации описанного выше сценария необходимо разработать простое приложение для организации IFPWAFCAD Международной ассоциации по консультированию и развитию для бывших профессиональных борцов.

index.jsp

index page

response.jsp

response page

Создание нового проекта

Сначала необходимо создать новый веб-проект в среде IDE:

Выберите «Файл > Новый проект» (CTRL+SHIFT+N; &#8984+SHIFT+N в Mac ОС) в главном меню. Выберите категорию «Java Web», а затем выберите «Веб-приложение». Нажмите кнопку «Далее».

new project

С помощью этого мастера можно создать пустое веб-приложение в стандартном проекте IDE. В стандартном проекте для компиляции, развертывания и выполнения приложения используется созданный в среде IDE сценарий сборки проекта Ant.

В поле «Имя проекта» введите «IFPWAFCAD». Также укажите местоположение проекта на компьютере. По умолчанию проекты в среде IDE помещаются в папку NetBeansProjects в домашнем каталоге. Нажмите кнопку «Далее».

В панели «Сервер и параметры» укажите сервер GlassFish в качестве сервера, на котором будет запускаться приложение.

*Примечание.*Сервер GlassFish отображается в раскрывающемся списке ‘Сервер’, если установлена версия Java IDE NetBeans. Поскольку сервер GlassFish включен в загрузку, он регистрируется в среде IDE автоматически. Для использования в проекте другого сервера нажмите кнопку «Добавить» рядом с полем с раскрывающимся списком «Сервер» и зарегистрируйте другой сервер в среде IDE. Работа с другими серверами, помимо GlassFish в рамках данного учебного курса не рассматривается.

В поле «Версия Java EE» выберите Java EE 5.

server settings

Для веб-проектов Java EE 6 и Java EE 7 использование дескриптора развертывания web.xml не требуется. Шаблон проекта NetBeans не содержит файл web.xml в проектах Java EE 6 и Java EE 7. Однако в данном учебном курсе рассматривается процесс объявления источника данных в дескрипторе развертывания. Функции, характерные только для Java EE 6 или Java EE 7, не требуются, поэтому в качестве версии проекта можно указать Java EE 5.

Нажмите кнопку «Завершить». Создается шаблон проекта для всего приложения и в редакторе открывается пустая страница JSP ( index.jsp ). Файл `index.jsp`служит в приложении страницей приветствия.

Подготовка веб-интерфейса

Начните с подготовки страницы приветствия ( index.jsp ) и страницы ответов ( response.jsp ). На странице приветствия реализована форма HTML для сбора пользовательских данных. На обеих страницах для просмотра структурированных данных используется таблица HTML. В этом разделе также рассматривается процесс создания таблицы стилей, которая расширяет внешний вид обеих страниц.

Настройка страницы приветствия

Убедитесь, что страница index.jsp открыта в редакторе. Если файл еще не открыт, дважды щелкните index.jsp под узлом «Веб-страницы» проекта IFPWAFCAD в окне «Проекты».

Измените текст между тегами

на Добро пожаловать в IFPWAFCAD, Международную ассоциацию по консультированию и развитию для бывших профессиональных борцов!

Откройте палитру среды IDE, выбрав в главном меню «Окно» > «Палитра» (CTRL+SHIFT+8; &#8984+SHIFT+8 в ОС Mac). Наведите курсор на значок «Таблица» в категории «HTML» и обратите внимание на то, что отображается фрагмент кода для элемента по умолчанию.

palette

Установите курсор сразу же после тегов

. (Именно в этом месте будет внедрена новая таблица HTML). Далее в окне «Палитра» дважды щелкните значок «Таблица».

В появившемся диалоговом окне «Вставка таблицы» укажите следующие значения и затем нажмите кнопку «ОК»:

Рядов: 2

Столбцов: 1

Размер границы: 0 Код таблицы HTML создан и добавлен на страницу.

Добавьте следующее содержимое в заголовок таблицы и ячейку первой строки таблицы (новое содержимое выделено полужирным шрифтом):

insert form

Нажмите клавишу Enter, чтобы добавить пустую строку после добавленного содержимого, затем дважды щелкните «Список» в палитре, чтобы открыть диалоговое окно «Вставить список».

В диалоговом окне «Вставить список» ведите subject_id для текстового поля «Имя» и нажмите «OK». Обратите внимание на то, что к форме добавляется фрагмент кода для раскрывающегося списка.

Количество параметров для раскрывающегося списка не имеет значения. Позже в этом учебном курсе будет показано добавление тегов JSTL для динамического создания на основе данных, полученных из таблицы базы данных «Subject».

Для форматирования кода щелкните правой кнопкой мыши в редакторе и выберите ‘Формат’ (Alt-Shift-F; Ctrl-Shift-F в Mac). Код автоматически форматируется и должен теперь выглядеть следующим образом:

Для просмотра этой страницы в браузере щелкните правой кнопкой мыши в редакторе и выберите ‘Запустить файл’ (Shift-F6; Fn-Shift-F6 в Mac). После этого страница JSP будет автоматически скомпилирована и развернута на сервере. Открывается браузер по умолчанию, и в нем выводится страница из местоположения, где она развернута.

browser output

Создание страницы ответов

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

Щелкните правой кнопкой мыши узел проекта «IFPWAFCAD» в окне «Проекты» и выберите «Создать > JSP». Откроется диалоговое окно «Новый файл JSP».

response jsp node

Hello World!

Для просмотра этой страницы в браузере щелкните правой кнопкой мыши в редакторе и выберите ‘Запустить файл’ (Shift-F6; Fn-Shift-F6 в Mac). Выполняется компиляция и развертывание страницы на сервере GlassFish с последующим открытием в браузере по умолчанию.

browser response

Создание таблицы стилей

Откройте мастер создания файлов, нажав кнопку ‘Создать файл’ ( new file btn) на главной панели инструментов IDE. Выберите категорию «Web», а затем выберите «Каскадная таблица стилей» и нажмите кнопку «Далее».

В редакторе добавьте следующее содержимое к файлу style.css :

Для быстрого перехода между открытыми в редакторе файлами нажмите CTRL+TAB, а затем выберите требуемый файл.

Подготовка средств обмена данными между приложениями и базой данных

Наиболее эффективным способом реализации соединения между сервером и базой данных является настройка пула подключений базы данных. Создание нового подключения для каждого запроса клиента может занимать много времени, особенно для приложений, постоянно получающих огромное количество запросов. Во избежание этого создается и поддерживается множество подключений, организованных в виде пула подключений. Входящие запросы, требующие доступа к данным приложения, используют уже созданное подключение из пула. Аналогичным образом, когда запрос завершен, подключение не закрывается, а возвращается в пул.

*Примечание. *Для дальнейшей работы необходимо убедиться в том, что база данных MySQL с именем MyNewDatabase настроена корректно и содержит данные примера из ifpwafcad.sql. Этот файл SQL создает две таблицы Subject и Counselor и затем заполняет их данными для примера. Если это не было выполнено ранее, или с этим заданием возникли сложности, то прежде чем продолжить учебный курс, обратитесь к разделу Подключение к базе данных MySQL.

Помимо этого для создания источника данных и работы с сервером GlassFish в рамках данного учебного курса необходимо защитить базу данных паролем. При использовании учетной записи MySQL root по умолчанию с пустым паролем с помощью командной строки можно установить другой пароль.

Дополнительные сведения приведены в официальном справочном руководстве по работе с MySQL: Защита исходных учетных записей MySQL.

Источник

Клиент-сервер шаг — за — шагом, от однопоточного до многопоточного (Client-Server step by step)

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

В начале будет рассмотрено создание элементарного клиент-сервера, для усвоения базовых знаний, на основе которых будет строиться многопоточная архитектура.

— Потоки: для того чтобы не перепутать что именно подразумевается под потоком я буду использовать существующий в профессиональной литературе синоним — нить, чтобы не путать Stream и Thread, всё-таки более профессионально выражаться — нить, говоря про Thread.

— Сокеты(Sockets): данное понятие тоже не однозначно, поскольку в какой-то момент сервер выполняет — клиентские действия, а клиент — серверные. Поэтому я разделил понятие серверного сокета — (ServerSocket) и сокета (Socket) через который практически осуществляется общение, его будем называть сокет общения, чтобы было понятно о чём речь.

Спасибо за подсказку про Thread.sleep();!
Конечно в реальном коде Thread.sleep(); устанавливать не нужно — это моветон! В данной публикации я его использую только для того чтобы выполнение программы было нагляднее, что бы успевать разобраться в происходящем.
Так что тестируйте, изучайте и в своём коде никогда не используйте Thread.sleep();!

1) Однопоточный элементарный сервер.
2) Клиент.
3) Многопоточный сервер – сам по себе этот сервер не участвует в общении напрямую, а лишь является фабрикой однонитевых делегатов(делегированных для ведения диалога с клиентами серверов) для общения с вновь подключившимися клиентами, которые закрываются после окончания общения с клиентом.
4) Имитация множественного обращения клиентов к серверу.

Итак, начнём с изучения структуры однопоточного сервер, который может принять только одного клиента для диалога. Код приводимый ниже необходимо запускать в своей IDE в этом идея всей статьи. Предлагаю все детали уяснить из подробно задокументированного кода ниже:

Сервер запущен и находится в блокирующем ожидании server.accept(); обращения к нему с запросом на подключение. Теперь можно подключаться клиенту, напишем код клиента и запустим его. Клиент работает когда пользователь вводит что-либо в его консоли (внимание! в данном случае сервер и клиент запускаются на одном компьютере с локальным адресом — localhost, поэтому при вводе строк, которые должен отправлять клиент не забудьте убедиться, что вы переключились в рабочую консоль клиента!).
После ввода строки в консоль клиента и нажатия enter строка проверяется не ввёл ли клиент кодовое слово для окончания общения дальше отправляется серверу, где он читает её и то же проверяет на наличие кодового слова выхода. Оба и клиент и сервер получив кодовое слово закрывают ресурсы после предварительных приготовлений и завершают свою работу.
Посмотрим как это выглядит в коде:

А что если к серверу хочет подключиться ещё один клиент!? Ведь описанный выше сервер либо находится в ожидании подключения одного клиента, либо общается с ним до завершения соединения, что делать остальным клиентам? Для такого случая нужно создать фабрику которая будет создавать описанных выше серверов при подключении к сокету новых клиентов и не дожидаясь пока делегированный подсервер закончит диалог с клиентом откроет accept() в ожидании следующего клиента. Но чтобы на серверной машине хватило ресурсов для общения со множеством клиентов нужно ограничить количество возможных подключений. Фабрика будет выдавать немного модифицированный вариант предыдущего сервера(модификация будет касаться того что класс сервера для фабрики будет имплементировать интерфейс — Runnable для возможности его использования в пуле нитей — ExecutorServices). Давайте создадим такую серверную фабрику и ознакомимся с подробным описанием её работы в коде:

Для имитации множественного обращения клиентов к серверу, создадим и запустим (после запуска серверной части) фабрику Runnable клиентов которые будут подключаться серверу и писать сообщения в цикле:

Как видно из предыдущего кода фабрика запускает — TestRunnableClientTester() клиентов, напишем для них код и после этого запустим саму фабрику, чтобы ей было кого исполнять в своём пуле:

Запускайте, вносите изменения в код, только так на самом деле можно понять работу этой структуры.

Источник

БД + сервер + серверное приложение. Как это связать?

В целях изучения Java и сопутствующих технологий решил написать клиент-серверное приложение с базой данных.

Как должно работать:

Изучаю SQL и, в принципе, понимаю как создать базу данных в MySQL. Примерно понимаю как написать серверное приложение. Для изучения Tomcat, наверное, серверное приложение и база данных должны на нём крутиться.

Суть вопроса: как серверное приложение и базу данных разместить на Tomcat’e?

Я знаю, где у меня исходники и *.classes серверного приложения и не знаю, где сохраняется база данных, если я работаю через консоль MySQL.

Как все это запустить на моём PC под Windows 10 Pro?

3nCrN

photo

2 ответа 2

Итак, в целях обучения можете сделать Rest сервис. Работать это будет примерно следующим образом:

Теперь о технологиях: Rest сервис можно запросто сделать с помощью Spring (http://spring-projects.ru/guides/rest-service/) Для связи с БД используйте JDBC(так же огромное количество русских уроков)

Все это крутится на Tomcat’e А интерфейс это уже отдельная тема. Надеюсь, все доступно объяснил, если есть вопросы, с радостью отвечу.

PS Для подключения к БД используйте (Более подробно почитайте в гугле «JDBC mysql connection»):

Если клиенты отправляют запросы на сервер, то это отправляют Tomcat’y или серверному приложению, которое мне нужно написать?

Да, Tomcat’y, он следит за запросами(если можно так выразиться), а ваше приложение(сервер) их обрабатывает, выглядит это примерно так (если без спринга):

Этот фрагмент кода взят из реализации Сервлета, Если вы не знаете, что это очень рекомендую почитать, без сервлетов в j2ee никуда.

Если достаточно хорошо знаете аглицкий для чтения мануалов, то лучше почитать документацию к tomcat, javaee.
На русском легко найти про java, про servlet-ы, про jdbc отдельно. А вместе не попадалось никогда.

Сначала подключение к БД описывается где-то в контексте tomcat-а. Есть варианты как именно, в какой файл записать эти строки (см. документацию):

Обратите внимание на url. Правильно догадались, что надо прописать jdbc:mysql://hostname:port/dbname
Считайте, что url и есть база данных. Это адрес сервера (hostname:port) и имя базы, которое дали ей при созданий. Там она и хранится.
Вполне возможно и у tomcat-а есть web-морда, в которой можно создать такое подключение, вместо ручного написания xml. Не знаю. У других серверов есть такая возможность.

Потом в WEB-INF/web.xml web-приложения помещается ссылка на этот ресурс:

Несмотря на обратный порядок изложения, имя ресурса ( @Resource(name) ) задаётся в программе и это имя с помощью конфигурации связывается с настоящей базой.

Источник

Доступ к серверной базе данных из клиента в Java

Изучение механизма доступа к базе данных, расположенной на сервере, из клиента. Реализация передачи и распаковки SQL- запросов. Получение результата выполнения SQL-запроса и передача результата на сторону клиента. Организация работы в сети. По данной проблеме можно также рекомендовать [1, 10, 11, 17].

Краткие теоретические сведения

Настоящее практическое занятие объединяет знания, полученные на практических занятиях, посвященных работе с базами данных, потоками и технологии «клиент-сервер». Хорошее усвоение материала этих занятий позволит вам без особого труда разобраться с материалом этого занятия.

Рассмотрим механизмы доступа к расположенной на сервере базе данных из клиента. Технология «клиент-сервер» применяется для централизованного доступа из удаленных ЭВМ к общей базе данных, расположенной на сервере. В языке Java механизм клиент-серверного взаимодействия основан на использовании потоков и сокетных соединений. Для клиента надлежит создать два потока: один поток для работы на ввод, второй — для работы на вывод. Аналогичная ситуация с сервером. В качестве языка запросов используем язык SQL.

Клиент должен обращаться в базу с сформированным SQL- запросом. Сервер должен выполнять запрос и возвращать ответ. Окно программы сервера предствлено на рис. 2.15.

Запуск сервера на выполнение реализует кнопка Start Server. По этой кнопке запускаются два потока. Один поток работает на ввод данных от клиента, второй — на вывод. Выход из сервера реализуется по кнопке Exit.

Java and CSharp programming image026 min vs

Рис. 2.15. Окно приложения сервера

Текст потока, работающего на вывод, помещен далее (листинг 2.24). Этот поток выдает на сторону клиента результат выборки из базы данных по принятому SQL-запросу. Факт формирования результата выборки отслеживается с помощью переменной act. Строка с результатом выборки (ser2) формируется в другом потоке сервера, работающем на ввод. Объявление сокета и подключение к нему должны быть ясны из листинга 2,24 (см, также главу 2).

\ Листинг 2.24. Поток сервера server2, работающий на вывод

class server2 extends Thread

static String ser2=»accepted from 2526″; // Порт 2526

// назначен здесь // для вывода из сервера PrintStream serverprint; // Объявляем потоковый класс для

yield(); // Эта команда позволяет пропустить вперед // выполнение более приоритетных потоков

serverr=new ServerSocket(2526); // Назначаем сокет для

// статическая переменная act определяет (act=true) наличие // сформированного результата выборки по команде SQL <

ServerBD.lb.setText(«Is waiting:»+nu); sleep(1000); nu+=l;>

ServerBD.lb.setText(«Sending answer to client»); yield () ; while(true)

// С этого места реализуется вывод информации из сервера // через сокет

outserver=serverr.accept(); // Ожидание подключения

serverprint.println(ser2); // Выводится на сторону

ServerBD.act=false; // Вывод завершен. Сервер ожидает

// новый сформированный результат для вывода

Из сервера передается обратно клиенту строка с именем ser2, формируемая в первом потоке. Поток сервера, принимающий SQL-запрос от клиента, выполняется в классе public class ServerBD extends Frame implements Runnable. Рассмотрим ПОТОК сервера, работающий на ввод, а начнем с его основного метода run().

lb.setText(«Server is launched»); try <

server=new ServerSocket(2525); // Создается новое гнездо

db=DriverManager.getConnection(bdurl); // Получаем // соединение с базой данных, определенной через // переменную String bdurl=»jdbc:odbc:vfp»

< sqlst=db.createStatement(); >// Создаем команду SQL catch(Exception err2)

// Создаем потоковую переменную для ввода из сокета: serverinput=new

// Принятый SQL-запрос отображаем в текстовом поле // с именем lb

String str_sql=lb.getText(); // В переменной str_sql

// помещаем текст SQL-запроса int priz=4; // Переменная priz определяет

// распознанный тип SQL-запроса

// Вьщеляем подстроку строки SQL запроса длиной 7 символов, // имея в виду, что SQL-команда одна из: SELECT, CREATE,

// UPDATE, INSERT (6 символов + 1 символ пробела) if (swork.equals(«SELECT») )

else // Устанавливаем переменную priz в зависимости // от принятой SQL-команды if (swork.equals(«CREATE»))

// Переменная priz определяет, какая SQL-команда получена // (см. по тексту) switch(priz)

// Если команда SELECT, то она выполняется так: rs= sqlst.executeQuery(str_sql); lb.setText(«1:SELECT»);

// processing the results of selection //обработка результатов выборки: tar.setText(«»);

/ Определяем число выбранных столбцов в результирующем // наборе;

String ss=»»; // Переменная ss служит для формирования // записей для отправки клиенту while(rs.next()) // в rs — очередная запись из базы / / данных

Похожие посты:

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Источник

Понравилась статья? Поделить с друзьями:
Добавить комментарий
  • Как сделать успешный бизнес на ритуальных услугах
  • Выездной кейтеринг в России
  • Риски бизнеса: без чего не обойтись на пути к успеху
  • java как создать консольное приложение
  • java запустить стороннее приложение