Как сделать сервер на java
Просто чтобы быть ясным, проблема, с которой я сталкиваюсь со многими примерами 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 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
Конструктор класса 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)
Читайте также: