Как сделать сервер на java

Обновлено: 07.07.2024

Просто чтобы быть ясным, проблема, с которой я сталкиваюсь со многими примерами ServerSocket, которые я видел в Интернете, заключается в том, что они выполняют свои собственные синтаксический анализ / форматирование запросов и обработку ошибок, что утомительно, подвержено ошибкам и вряд ли будет всеобъемлющим, и я пытаюсь избежать этого по этим причинам.

Я знаю, что это не в духе SO, но я призываю вас пересмотреть свое отвращение к API Java EE. Как уже упоминалось в некоторых ответах, есть несколько очень простых реализаций, таких как Jetty, которые позволяют встроить веб-сервер в ваше автономное приложение, при этом все еще используя API сервлетов. Если по какой-то причине вы абсолютно не можете использовать API Java EE, не обращайте внимания на мой комментарий :-)

Вот начальный пример, скопированный из их документов (тем не менее, для всех, кто пытается его редактировать, потому что это уродливый кусок кода, пожалуйста, не копируйте, а не мой, более того, вы никогда не должны редактировать цитаты, если они не изменились. в первоисточнике). Вы можете просто скопировать и запустить его на Java 6+.

Следует отметить, что response.length() роль в их примере плохая, так и должно быть response.getBytes().length . Даже в этом случае getBytes() метод должен явно указывать кодировку, которую вы затем указываете в заголовке ответа. Увы, хотя и вводящий в заблуждение начинающих, в конце концов, это всего лишь базовый пример.

Классы, упомянутые здесь, помечены @jdk.Exported в исходном коде OpenJDK, что означает, что API считается общедоступным и будет доступен в Java 9 (некоторые другие com.sun.* пакеты станут недоступными из-за Project Jigsaw).

Кажется, это исправлено. Текущая версия генерирует 403 if (uri.startsWith ("..") || uri.endsWith ("..") || uri.indexOf ("../")> = 0).

РЕДАКТИРОВАТЬ: это на самом деле работает! Приведенный выше код выглядит как Groovy или что-то в этом роде. Вот перевод на Java, который я тестировал:

Я думаю, что вы могли бы сделать класс Server реализует Provider < . и затем указать Content-Type в методе getContentType () DataSource. Кроме того, вы также можете ввести WebServiceContext: @Resource WebServiceContext ctx; , чтобы установить другие заголовки и прочитать параметры запроса. К сожалению, установка типа контента через WebServiceContext не работает.

Нет, я так не думаю. Он не будет работать на Java-реализации IBM и, возможно, на других. И даже если это работает сейчас, внутренние API могут изменяться. Почему бы просто не использовать официальный API?

Мне нравится этот вопрос, потому что это область, где постоянно происходят инновации, и всегда необходимо иметь легкий сервер, особенно когда речь идет о встроенных серверах в небольших (э) устройствах. Я думаю, что ответы делятся на две большие группы.

Варианты тонкого сервера

    . Хорошие вещи возможны с множеством вспомогательных конструкций, таких как Filters, Templates и т. Д. . стремится быть бонсай и вполне может быть таким ;-)

Это первое приложение в односторонней связи. В случае односторонней связи клиент отправляет на сервер, но сервер не отправляет обратно клиенту. При двусторонней связи клиент отправляет на сервер, а сервер отправляет обратно клиенту.

Всего в приложении TCP / IP 4 варианта.

APPLICATION NUMBERFUNCTIONALITY
1st applicationClient to server communication (one-way)
2nd applicationServer to client communication (one-way)
3rd applicationServer sends file contents to client (two-way, non-continuous)
4th applicationChat program (two-way, continuous)

1-е Приложение клиент-сервер

Клиентская программа – WishesClient.java

Конструктор класса Socket принимает два параметра – строку, IP-адрес сервера и целое число, номер порта на сервере, к которому клиент хотел бы подключиться. 127.0.0.1 – это адрес по умолчанию локальной системы в компьютерных сетях.

OutputStream ostream = sock.getOutputStream ();

Метод getOutputStream() класса Socket возвращает объект OutputStream, здесь объект является ostream. Это отправная точка всего общения (программы). Здесь сокет связан с потоками. Потоки способствуют передаче данных.

Ниже приведены исключения в вышеприведенной программе, создаваемые конструктором и различными методами.

  • Socket(“127.0.0.1”, 5000) выдает UnknownHostException
  • getOutputStream() генерирует IOException
  • writeBytes (message1) выдает IOException
  • Все методы close() выдают IOException
  • Серверная программа – WishesServer.java


ServerSocket sersock = новый ServerSocket (5000);

У сервера есть два задания: одно, как и ожидалось, должно связываться, а другое связывает соединение с номером порта 5000. Для связи он использует Socket, а для привязки – ServerSocket.

Связывание – это не что иное, как выделение номера порта клиенту так долго, как ему хотелось бы; Между тем, если какой-либо другой клиент запрашивает номер порта 5000, он не должен выделяться сервером. Когда клиент отключается, порт освобождается и может быть предоставлен другому клиенту сервером.

Socket sock = sersock.accept ();

accept() – это метод класса ServerSocket, используемый сервером для привязки соединения по номеру порта 5000, запрошенного клиентом.

InputStream istream = sock.getInputStream();

DataInputStream dstream = new DataInputStream (istream);

Поскольку InputStream является абстрактным классом, его нельзя использовать напрямую. Он связан с конкретным классом DataInputStream.

String message2 = dstream.readLine();

Примечание. При компиляции этой программы вы получаете предупреждение из-за метода readLine() объекта DataInutStream; но программа выполняется. Чтобы избежать этого предупреждения, в следующей программе используется BufferedReader.

Выполнение клиентских и серверных программ

В одной системе, чтобы действовать как клиент и сервер, откройте два шDOS и обработайте одно как клиент, а другой – как сервер. Из одного приглашения DOS сначала запустите серверную программу, а из другого приглашения DOS запустите клиентскую программу. Вы получаете вывод при запросе сервера DOS.

Для лучшего понимания вопрос-ответ из пакета java.lang.

Сколько существует типов внутренних классов?
Ответ: 4 типа.

Что такое файлы JAR?
Ответ: JAR-файл – это заархивированный файл, сжатый JVM.

Как преобразовать строку в форму типа данных?
Ответ: Преобразование строки в тип данных – байтовое, короткое, целое, длинное, плавающее, двойное, символьное и логическое.

Как преобразовать объект в строку?
Ответ: Объект в строку – toString()

Как сравнить два объекта?
Ответ: Сравнение объектов – hashCode() & equals()

Средняя оценка / 5. Количество голосов:

Спасибо, помогите другим - напишите комментарий, добавьте информации к статье.

В интернете есть миллион статей на тему - какой веб-сервер использовать для java-приложений. Обычно все сводится к серверам приложений типа JBoss или WebSphere, либо к веб-серверам с servlet-контейнерами типа Tomcat или Jetty.

План на сегодня такой:

Запуск сервера на Java выглядит таким образом:

Для запуска сервера используется метод start. Кроме того, у класса есть еще метод stop, который принимает в качестве параметра int значение - время в секундах, через которое будет закрыт сокет, слушающий TCP соединения.

Добавляем аутентификатор

Пример простого аутентификатора:

  • Success - аутентификация успешна с информацией о пользователе;
  • Failure - ошибка аутентификации с указанием кода ошибки;
  • Retry - необходимо повторить попытку аутентификации.

Пример Echo сервера

А вот и полный код примера простого echo веб-сервера:

Заключение

Есть мнение, что классы из пакетов com.sun.* использовать нельзя. Что это набор классов, которые в будущем могут быть в корне изменены или вообще удалены.

[an error occurred while processing this directive]

[an error occurred while processing this directive](none) [an error occurred while processing this directive](none)[an error occurred while processing this directive] ::
[an error occurred while processing this directive] (none)
[an error occurred while processing this directive] ([an error occurred while processing this directive] Константин Андрухин [an error occurred while processing this directive])

[an error occurred while processing this directive](none)

В Java для этого существует специальный пакет "java.net", содержащий класс java.net.Socket. Socket в переводе означает "гнездо", название это было дано по аналогии с гнёздами на аппаратуре, теми самыми, куда подключают штепсели. Соответственно этой аналогии, можно связать два "гнезда", и передавать между ними данные. Каждое гнездо принадлежит определённому хосту (Host — хозяин, держатель). Каждый хост имеет уникальный IP (Internet Packet) адрес. На данный момент интернет работает по протоколу IPv4, где IP адрес записывается 4 числами от 0 до 255 — например, 127.0.0.1 (подробнее о распределении IP адресов тут — RFC 790, RFC 1918, RFC 2365, о версии IPv6 читайте тут — RFC 2373)

Гнёзда монтируются на порт хоста (port). Порт обозначается числом от 0 до 65535 и логически обозначает место, куда можно пристыковать (bind) сокет. Если порт на этом хосте уже занят каким-то сокетом, то ещё один сокет туда пристыковать уже не получится. Таким образом, после того, как сокет установлен, он имеет вполне определённый адрес, символически записывающийся так [host]:[port], к примеру — 127.0.0.1:8888 (означает, что сокет занимает порт 8888 на хосте 127.0.0.1)

Для того, чтобы облегчить жизнь, чтобы не использовать неудобозапоминаемый IP адрес, была придумана система DNS (DNS — Domain Name Service). Цель этой системы — сопоставлять IP адресам символьные имена. К примеру, адресу "127.0.0.1" в большинстве компьютеров сопоставленно имя "localhost" (в просторечье — "локалхост").

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

Клиентский сокет

В строковой константе host можно указать как IP адрес сервера, так и его DNS имя. При этом программа автоматически выберет свободный порт на локальном компьютере и "привинтит" туда ваш сокет, после чего будет предпринята попытка связаться с другим сокетом, адрес которого указан в параметрах инициализации. При этом могут возникнуть несколько два вида исключений: неизвестный адрес хоста — когда в сети нет компьютера с таким именем или ошибка отсутствия связи с этим сокетом.

Так же полезно знать функцию

Эта функция устанавливает время ожидания (timeout) для работы с сокетом. Если в течение этого времени никаких действий с сокетом не произведено (имеется ввиду получение и отправка данных), то он самоликвидируется. Время задаётся в секундах, при установке timeout равным 0 сокет становится "вечным".

Для некоторых сетей изменение timeout невозможно или установлено в определённых интервалах (к примеру от 20 до 100 секунд). При попытке установить недопустимый timeout, будет выдано соответственное исключение.

Программа, которая открывает сокет этого типа, будет считаться клиентом, а программа-владелец сокета, к которому вы пытаетесь подключиться, далее будет называться сервером. Фактически, по аналогии гнездо-штепсель, программа-сервер — это и будет гнездо, а клиент как раз является тем самым штепселем.

Сокет сервера

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

После установки сокета, вызывается функция

Эта функция погружает программу в ожидание того момента, когда клиент будет присоединяться к сокету сервера. Как только соединение установлено, функция возвратит объект класса Socket для общения с клиентом.

Клиент-сервер через сокеты. Пример

Как пример — простейшая программа, реализующая работу с сокетами.

Со стороны клиента программа работает следующим образом: клиент подсоединяется к серверу, отправляет данные, после чего получает данные от сервера и выводит их.

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

Программа простого TCP/IP клиента(SampleClient.java)

Программа простого TCP/IP сервера (SampleServer.java)

После компиляции, получаем файлы SampleServer.class и SampleClient.class (все программы здесь и далее откомпилированы с помощью JDK v1.4) и запускаем вначале сервер:

а потом, дождавшись надписи "server is started", и любое количество клиентов:

Если во время запуска программы-сервера, вместо строки "server is started" выдало строку типа

то это будет обозначать, что порт 3128 на вашем компьютере уже занят какой-либо программой или запрещён к применению политикой безопасности.

Заметки

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

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

Стоит упомянуть, что абстракцию Socket — ServerSocket и работу с потоками данных используют C/C++, Perl, Python, многие другие языки программирования и API операционных систем, так что многое из сказанного подходит к применению не только для платформы Java.

[an error occurred while processing this directive]
[an error occurred while processing this directive] (none)

Читайте также: