Как написать простейшее клиент-серверное приложение?
Без применения дополнительных библиотек, основа низкоуровневого сетевого взаимодействия в Java строится на двух классах: Socket и ServerSocket .
Socket – клиентское подключение. Отправляет запросы и получает ответы с заданного порта/адреса по TCP/IP-соединению. Наследники могут реализовывать протоколы более высокого уровня сетевого стека, например SSLSocket . Похож на утилиту netcat из Unix-систем. Обслуживает одно подключение к серверу, обменивается данными через InputStream и OutputStream .
ServerSocket – сервер, приёмник подключений. Занимает на машине заданный свободный порт, и в одиночку принимает все подключения к нему. Опционально можно задать свой адрес, если текущая машина доступна по нескольким, а сокет должен быть доступен только по одному из них.
Ключевой метод серверного сокета – accept() . Вызов этого метода блокирует исполнение до тех пор, пока не придет новый запрос от клиента. Возвращает пришедший запрос в виде экземпляра класса Socket . Чтобы сделать сервер параллельным, accept() должен вызываться в параллельных потоках.
Стандартную внутреннюю реализацию сокетов можно подменить, установив для них статическую фабрику типа SocketImplFactory , методом setSocketFactory() .
Для высокоуровневых (HTTP, FTP) запросов в стандартной библиотеке есть класс URLConnection и его наследники.
Полный пример клиент-серверного приложения доступен в туториале на сайте Oracle.
Создание многопоточного клиент-серверного приложения на Java
На этом вебинаре мы попрактикуемся в использовании сокетов и потоков. Мы напишем на Java небольшое клиент-серверное приложение на сокетах. Для этого мы создадим две разные программы, которые запускаются на разных компьютерах, но при этом работают совместно, пересылая друг другу данные.
Для связи программ друг с другом мы создадим универсальный класс Phone, и будем использовать его как на сервере, так и на клиенте в JAR файле. В конце вебинара мы добавим многопоточность в серверную часть, чтобы наш сервер мог обрабатывать несколько клиентов одновременно.
План вебинара:
1. Простейший сервер — Автоответчик.
2. Простейший клиент — Уметь читать.
3. Клиент-серверный диалог.
4. Универсальный сокет — Телефон.
5. Серверная Многопоточность.
Предварительные требования: Базовые навыки работы с Java, Intellij Idea.
Целевая аудитория: программисты, IT-студенты, инженеры
Покупай подписку с доступом ко всем курсам и сервисам
Библиотека современных IT знаний в удобном формате
Выбирай свой вариант подписки в зависимости от задач, стоящих перед тобой. Но если нужно пройти полное обучение с нуля до уровня специалиста, то лучше выбирать Базовый или Премиум. А для того чтобы изучить 2-3 новые технологии, или повторить знания, готовясь к собеседованию, подойдет Пакет Стартовый.
- Все видеокурсы на 3 месяца
- Тестирование по 10 курсам
- Проверка 5 домашних заданий
- Консультация с тренером 30 мин

Halloween
- Все видеокурсы на 1 год
- Тестирование по 24 курсам
- Проверка 20 домашних заданий
- Консультация с тренером 120 мин
- Скачивание видео уроков
- Возможность приостановки обучения
- Все видеокурсы на 6 месяцев
- Тестирование по 16 курсам
- Проверка 10 домашних заданий
- Консультация с тренером 60 мин
Клиент-сервер на Java
Это первое приложение в односторонней связи. В случае односторонней связи клиент отправляет на сервер, но сервер не отправляет обратно клиенту. При двусторонней связи клиент отправляет на сервер, а сервер отправляет обратно клиенту.
Всего в приложении TCP / IP 4 варианта.
| APPLICATION NUMBER | FUNCTIONALITY |
|---|---|
| 1st application | Client to server communication (one-way) |
| 2nd application | Server to client communication (one-way) |
| 3rd application | Server sends file contents to client (two-way, non-continuous) |
| 4th application | Chat program (two-way, continuous) |
1-е Приложение клиент-сервер
Приложение состоит из двух программ. Клиентская программа, работающая на стороне клиента, и серверная программа, работающая на стороне сервера. Клиентская программа WishesClient.java отправляет серверу наилучшие пожелания, а серверная программа WishesServer.java получает сообщение и печатает на своем терминале (мониторе).
Клиентская программа – WishesClient.java
import java.net.Socket; import java.io.OutputStream; import java.io.DataOutputStream; public class WishesClient < public static void main(String args[]) throws Exception < Socket sock = new Socket("127.0.0.1", 5000); String message1 = "Accept Best Wishes, Serverji"; OutputStream ostream = sock.getOutputStream(); DataOutputStream dos = new DataOutputStream(ostream); dos.writeBytes(message1); dos.close(); ostream.close(); sock.close(); >> Socket sock = new Socket ("127.0.0.1", 5000);
Конструктор класса Socket принимает два параметра – строку, IP-адрес сервера и целое число, номер порта на сервере, к которому клиент хотел бы подключиться. 127.0.0.1 – это адрес по умолчанию локальной системы в компьютерных сетях.
OutputStream ostream = sock.getOutputStream ();
Метод getOutputStream() класса Socket возвращает объект OutputStream, здесь объект является ostream. Это отправная точка всего общения (программы). Здесь сокет связан с потоками. Потоки способствуют передаче данных.
DataOutputStream dos = new DataOutputStream (ostream); dos.writeBytes (message1);
OutputStream является абстрактным классом; он не может быть использован напрямую. В приведенном выше коде он связан с конкретным классом DataOutputStream. Метод writeBytes() объекта DataOutputStream принимает строковое сообщение и передает его в Socket. Теперь клиентский сокет отправляется на другой сокет на сервере. Когда работа закончится, закройте потоки и сокет. Он освобождает дескрипторы (ссылки), связанные с системными ресурсами.
Ниже приведены исключения в вышеприведенной программе, создаваемые конструктором и различными методами.
- Socket(“127.0.0.1”, 5000) выдает UnknownHostException
- getOutputStream() генерирует IOException
- writeBytes (message1) выдает IOException
- Все методы close() выдают IOException
- Серверная программа – WishesServer.java
import java.net.ServerSocket; import java.net.Socket; import java.io.InputStream; import java.io.DataInputStream; public class WishesServer < public static void main(String args[]) throws Exception < ServerSocket sersock = new ServerSocket(5000); System.out.println("server is ready"); // message to know the server is running Socket sock = sersock.accept(); InputStream istream = sock.getInputStream(); DataInputStream dstream = new DataInputStream(istream); String message2 = dstream.readLine(); System.out.println(message2); dstream .close(); istream.close(); sock.close(); sersock.close(); >>
ServerSocket sersock = новый ServerSocket (5000);
У сервера есть два задания: одно, как и ожидалось, должно связываться, а другое связывает соединение с номером порта 5000. Для связи он использует Socket, а для привязки – ServerSocket.
Связывание – это не что иное, как выделение номера порта клиенту так долго, как ему хотелось бы; Между тем, если какой-либо другой клиент запрашивает номер порта 5000, он не должен выделяться сервером. Когда клиент отключается, порт освобождается и может быть предоставлен другому клиенту сервером.
Socket sock = sersock.accept ();
accept() – это метод класса ServerSocket, используемый сервером для привязки соединения по номеру порта 5000, запрошенного клиентом.
InputStream istream = sock.getInputStream();
Метод getInputStream() объекта Socket возвращает объект InputStream, и это отправная точка серверной программы. Сервер использует входной поток при получении сообщения.
DataInputStream dstream = new DataInputStream (istream);
Поскольку InputStream является абстрактным классом, его нельзя использовать напрямую. Он связан с конкретным классом DataInputStream.
String message2 = dstream.readLine();
Метод readLine() объекта DataInputStream читает строку сообщения из сокета и возвращает ее. Это сообщение печатается на консоли.
Примечание. При компиляции этой программы вы получаете предупреждение из-за метода readLine() объекта DataInutStream; но программа выполняется. Чтобы избежать этого предупреждения, в следующей программе используется BufferedReader.
Выполнение клиентских и серверных программ
В одной системе, чтобы действовать как клиент и сервер, откройте два шDOS и обработайте одно как клиент, а другой – как сервер. Из одного приглашения DOS сначала запустите серверную программу, а из другого приглашения DOS запустите клиентскую программу. Вы получаете вывод при запросе сервера DOS.
Это приложение и следующее – только односторонняя связь, отправляющая или получающая. Но второй набор (после следующего) приложений является двусторонним, когда клиент и сервер могут отправлять и получать (оба). Для тестирования на выделенных серверах, можно обратиться сюда https://www.mixtelecom.ru/arenda-serverov.html
Для лучшего понимания вопрос-ответ из пакета java.lang.
Сколько существует типов внутренних классов?
Ответ: 4 типа.
Что такое файлы JAR?
Ответ: JAR-файл – это заархивированный файл, сжатый JVM.
Как преобразовать строку в форму типа данных?
Ответ: Преобразование строки в тип данных – байтовое, короткое, целое, длинное, плавающее, двойное, символьное и логическое.
Как преобразовать объект в строку?
Ответ: Объект в строку – toString()
Как сравнить два объекта?
Ответ: Сравнение объектов – hashCode() & equals()
Средняя оценка 3.1 / 5. Количество голосов: 16
Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.
Или поделись статьей
Видим, что вы не нашли ответ на свой вопрос.
Помогите улучшить статью.
Напишите комментарий, что можно добавить к статье, какой информации не хватает.
Клиент-серверное приложение на Java
Клиент-серверное приложение на Java — это приложение, в котором клиент, то есть, компьютер пользователя, вначале запрашивают ресурсы с сервера, после чего сервер посылает обратно необходимый ответ на запрос клиента.
Введение
«Клиент-сервер» является достаточно распространенной и логичной архитектурой приложений. Главными компонентами приложения, в данном случае, выступают непосредственно клиент и сервер. Тем не менее помимо них требуется еще пакет вспомогательных классов, которые, в самом простом варианте, отвечают за обмен сообщениями между клиентом и сервером. В минимальном комплекте необходимы следующие классы:
- Класс MessageReader/MessageWriter, который предназначен для считывания и записи сообщений в поток на сокете.
- Класс MessageFactory, который содержит идентификаторы всех вероятных сообщений.
- Класс набора сообщений-запросов (Request).
- Класс набора сообщений-ответов (Response).

Статья: Клиент-серверное приложение на Java
Поможем написать реферат за 48 часов
Все они должны размещаться в пакете «core», которым должны обладать и клиент, и сервер.
Клиент-серверное приложение на Java
Классовая структура клиент-серверного приложения имеет следующий состав:
- Clíent (клиентский пакет файлов):
- Clíent.java (клиентская логика),
- ClíentLauncher.java (запуск клиента).
- Core (вспомогательные классы).
- Communícation (обмен сообщениями):
- MessageFactory.јava (место хранения всех сообщений),
- MessageReader.јava (прочтение сообщений из потока),
- MessageWríter.java (выполнение записи сообщений в поток).
- Requests:
- HandshakeRequest.јava (выполнение запроса на обмен рукопожатиями).
- Responses
- HandshakeResponse.јava (ответная реакция на обмен рукопожатиями),
- IMessage.јava (интерфейс для сообщения),
- Request.јava (абстрактный класс «запрос»,
- Response.јava (абстрактный класс «ответ»).
- Server (файлы сервера):
- ClíentSession.јava (сессия отдельного клиента, то есть, реализация обработки запросов этого клиента)
- Context.јava (контекст, то есть, общая информация сервера для всех клиентов)
- Server.јava (серверная логика)
- ServerLauncher.јava (выполнение запуска сервера)
- SessíonsManager.јava (место хранения всех текущих сессий)
«Клиент-серверное приложение на Java»
Готовые курсовые работы и рефераты
Решение задач по учебе за 24 часа
Реферат по этой теме за 48 часов
Программа клиента считается более простой, она по существу не осуществляет ничего сверх сложного. Клиент просто формирует сокет и выполняет подключение к сервер-сокету при помощи связки host:port. Программная оболочка должна создать объект класса Clíent и запустить его работу:
publíc class ClíentLauncher
publíc statíc voíd maín(Stríng[] args)
InetAddress host = InetAddress.getByName(args[0]);
ínt port = Integer.parseInt(args[1]);
Clíent clíent = new Clíent(host, port);
//Запуск логикb клиента
> catch (UnknownHostExceptíon e)
publíc class Clíent
prívate fínal InetAddress host;
prívate fínal ínt port;
publíc Clíent(InetAddress host, ínt port)
//Создание сокета, ридер райтера и запуск логики
publíc voíd start()
//Создание клиентского сокета
try (Socket socket = new Socket(thís.host, thís.port))
//Создание ридера и райтера для обмена сообщениями
MessageReader reader = new MessageReader(socket.getInputStream());
MessageWríter wríter = new MessageWríter(socket.getOutputStream());
//Отправка серверу первого сообщения «рукопожатие»
UníqueMessage msg = reader.readMessage();
//Проверка, что это ответ на рукопожатие
íf(!(msg.message ínstanceof HandshakeResponse))
//Выполнение запуска логики приложения
> catch (IOExceptíon e)
publíc voíd logícStart()
Задачей сервера является поднятие своего серверного сокета на необходимом адресе и ожидание новых подключений. Для любого подключения, которое является клиентской сессией, необходимо создать отдельный поток обработки логики работы с клиентом. Следует подчеркнуть, что в классе ClíentSession дается описание основного алгоритма работы с клиентом, обмен сообщениями, данными и прочее. В классе Context должна содержаться общая информация для всего набора клиентов сервера. Ниже приведен текст программы сервера:
publíc class ServerLauncher
publíc statíc voíd main(Stríng[] args)
Server server = new Server();
publíc class Server ímplements Runnable
prívate fínal ínt port;
príívate Context context;
thís.context = new Context();
publíc voíd run()
ServerSocket ss = new ServerSocket(thís.port);
//Цикл ожидания подключений
System.out.príntln(«Waíting connectíon on port:» + thís.port);
//Точка ухода в ожидание подключения
Socket clientSocket = ss.accept();
System.out.príntln(«New clíent connected to server»);
//Создание клиентской сессии
ClíentSession clíentSession = new ClientSessíon(clíentSocket, thís.context);
//Осуществление запуска логики работы с клиентом
> catch (IOExceptíon e)
//Данные, которые являются общими для всех клиентских сессий
publíc class Context
prívate SessíonsManager sessínonsManager;
publíc boolean stopFlag;
//Иные важные поля, которые необходимо знать всем клиентам //.
thís.sessínonsManager = new SessíonsManager();
publíc SessíonsManager getSessíonsManger()
//Базовая логика клиента
publíc class ClíentSession extends Thread
prívate fínal Socket socket;
prívate fínal MessageReader reader;
prívate fínal MessageWriter wríter;
prívate fínal Context context;
publíc ClíentSession(fínal Socket socket, fínal Context context) throws IOExceptíon
thís.reader = new MessageReader(socket.getínputStream());
thís.wríter = new MessageWríter(socket.getOutputStream());
publíc voíd run()
íf(msg.message ínstanceof HandshakeRequest)
wríter.wríteResponse(new HandshakeResponse(), msg.uníqueId);
//Обмен рукопожатиями завершен, начало работы