powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Клиент игрового веб-сервера
16 сообщений из 16, страница 1 из 1
Клиент игрового веб-сервера
    #38691337
aleapv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, уважаемые форумчане.

Есть следующий браузерный клиент:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
package org.eclipse.jetty.embedded;
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;
 
public class HelloHandler extends AbstractHandler implements Runnable
{
    void run() {
       System.out.println("Hello")
    }

     public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
    {
        response.setContentType("text/html;charset=utf-8");
        response.setStatus(HttpServletResponse.SC_OK);
        baseRequest.setHandled(true);
 
        response.getWriter().println("<h1>Hello!</h1>");

    }
}



Метод main выглядит так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
package org.eclipse.jetty.embedded;
 
import org.eclipse.jetty.server.Server;
 
public class OneHandler
{
    public static void main(String[] args) throws Exception
    {
        Server server = new Server(8080);
        server.setHandler(new HelloHandler());
 
        server.start();
        server.join();
    }
}



Подскажите, как оптимизировать следующую строку:
Код: java
1.
response.getWriter().println("<h1>Hello!</h1>");


Неудобно Html код писать так.
Основное условие - клиент должен запускаться в отдельном потоке в методе main.
Вопрос возникает потому что HttpServlet и WebSocketServlet(который тоже хотелось бы использовать) нельзя имлементить от Runnable.
...
Рейтинг: 0 / 0
Клиент игрового веб-сервера
    #38691346
aleapv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
A, еще конечно в методе main строчка:
Код: java
1.
new Thread(new HelloHandler ()).run;
...
Рейтинг: 0 / 0
Клиент игрового веб-сервера
    #38691347
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно узнать, почему в "типа клиенте" вы создаёте http-сервер?
Почему "браузерный клиент" вообще содержит метод main?
Может, всё-таки, вы делаете игровой сервер?
...
Рейтинг: 0 / 0
Клиент игрового веб-сервера
    #38691356
aleapv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov,

1. Вот тут я не могу архитектуру до конца продумать. Можно было и в методе run() ведь создать.
2,3. Да это игровой сервер и метод main его.
Остальная часть кода не приведена, потому что проблема именно с клиентом.
...
Рейтинг: 0 / 0
Клиент игрового веб-сервера
    #38691368
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Не важно, как запущен игровой сервер - стандартным механизмом развёртывания или через встраивание.
Корректно настроенный сервер создаёт один или несколько коннекторов, принимающих входящие подключения, пул потоков исполнения и самостоятельно дёргает (нужные) методы вашего приложения.
И вообще - делает массу вещей, о которых вам уже не надо думать.
В общем, читайте документацию и руководства по Servlet API - там всё расписано.

2. Если обработка принимаемых вами запросов требует работы с HTML, то, как вы уже заметили, работать через сервлеты не очень удобно. По логике, на этом шаге вы должны узнать о CSS, т.к. он позволяет несколько унифицировать генерацию HTML.
Вы, опять-таки, можете самостоятельно изобрести полезный велосипед или воспользоваться, например, JSP.

3. При работе с JSP вы (опять) обнаружите, что "не очень удобно" и, вероятно, найдёте JSTL и прочие "библиотеки тэгов".
Очень вероятно, что рано или поздно вы узнаете, что "браузер умеет много гитик" и (более-менее) плавно добавите в арсенал своих средств JavaScript и основанные на нём библиотеки.

Поэтому вопрос: что делает HTML в вашем игровом сервере?
...
Рейтинг: 0 / 0
Клиент игрового веб-сервера
    #38691388
aleapv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov,
Html моя фронтендная часть.
Получается так:

Здесь класс HelloHandler это фронтенд.
Сразу прошу извинить - я конечно недостаточно хорошо изучил jetty , но все-таки:

Этот фронтенд запущен в отдельном потоке и помимо отрисовки Html
должен еще и в методе run взаимодействовать с другими частями сервера.

А так как он extends AbstractHandler, то может отрисовывать html только так:
Код: java
1.
response.getWriter().println("<h1>Hello!</h1>");



А я хотел бы что бы он работал как контроллер, то есть принимал запросы с jsp
и на основании этого посылал всякие сообщения в методе run.

Только вот единственно, контроллер это сервлет а, сервлет нельзя имплементить от Runnable.
...
Рейтинг: 0 / 0
Клиент игрового веб-сервера
    #38691400
aleapv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Внесу еще чуточку ясности.
В идеале я хотел бы что бы этот сервлет был WebSocketServlet и обменивался сообщения с jsp страничкой
с помощью javascript(что бы не перезагружать страничку).
...
Рейтинг: 0 / 0
Клиент игрового веб-сервера
    #38691557
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё раз: читайте Servlet API.
Сервлет не должен "имплементировать Runnable" по той простой причине, что вы не управляете созданием и исполнением потоков. Вообще и никак.
Хотите управлять - отложите Jetty и делайте собственный servlet-/jsp-контейнер.
Хотя бы - выбросьте встраиваемый Jetty.
Просто для того, чтобы не мешать в одну кучу развёртывание сервера с приложениями и работу (уже развёрнутого) приложения.

Непонятно зачем вы вообще полезли в обработчики контекстов, если по смыслу это уже веб-приложение или его часть.

Вообще, с моей кочки зрения, выходить за пределы Servlet API надо тогда и только тогда, когда вы уже точно определись с целевым контейнером. И его преимущества настолько весомы, что допускают жёсткую привязку к (именно) его API.
Нужны вебсокеты - изучаете их API.

P.S. Не понимаю, как можно лезть что-то делать вообще не представляя как это устроено.
...
Рейтинг: 0 / 0
Клиент игрового веб-сервера
    #38691571
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вам требуется где-то запускать "другие части" можно:
1. Просто развернуть несколько приложений или несколько сервлетов в рамках одного приложения;
2. Создать произвольные классы, реализующие интерфейс Runnable и самостоятельно их стартовать там, где и положено - в методе init();
3. Сделать обычное приложение-загрузчик, которое будет стартовать и веб-сервер и "другие части".
Можно, наверное и как-нибудь ещё извратиться, но эти три варианта - самое простое, что можно придумать и упорядочены они по возрастанию сложности.
...
Рейтинг: 0 / 0
Клиент игрового веб-сервера
    #38691613
aleapv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообще, с моей кочки зрения, выходить за пределы Servlet API надо тогда и только тогда, когда вы уже точно определись с целевым контейнером. И его преимущества настолько весомы, что допускают жёсткую привязку к (именно) его API.
Нужны вебсокеты - изучаете их API.
Здесь полностью согласен.

Просто развернуть несколько приложений или несколько сервлетов в рамках одного приложения - вот этот вариант подойдет, правда еще надо продумать как они будут "общаться".

Спасибо за помощь.
...
Рейтинг: 0 / 0
Клиент игрового веб-сервера
    #38691641
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.к. мы работаем в рамках одной JVM, можно просто дергать в сервлете нужные (целевые) методы нужных классов.
Исполнение будет делаться "в потоке" самого сервлета. А эти потоки сервлет-контейнер создаёт "по мере надобности в рамках ограничений".
Это если не нужна асинхронность или "многоходовки".
...
Рейтинг: 0 / 0
Клиент игрового веб-сервера
    #38691680
aleapv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А так можно делать если нужный класс имплементит Runnable?
...
Рейтинг: 0 / 0
Клиент игрового веб-сервера
    #38691742
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дался вам этот Runnable ...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
/* В иерархии классов приложения SomeServer есть (публичный) метод byte[] process( byte[] ) */
class Loader implements Runnable {
  SomeServer srv = new SomeServer();
  public void run() { srv.doStart( someArgs ); }
}
class test extends HttpServlet {
  public void init() {
    Thread thread = new Thread( Loader );
    thread.start();
  }
  protected void service( HttpServletRequest rq, HttpServletResponse rsp ) throws ServletException {
    try {
      byte[] buffer = new byte[rq.getContentLength()];
      InputStream in = rq.getInputStream();
      in.read( buffer);
      in.close();
      byte[] result = process( buffer );
      OutputStream out = rsp.getOutputStream()
      out.write( result );
      out.flush();
    }
    catch ( IOException e ) { throw new ServletException( e.getMessage ); }
  }
}

Я просто вызываю любой публичный метод, который мне нужен. Если нет особых причин - метод сделает всё, что нужно.
При этом выкрутас в init() требуется только потому, что SomeServer со всеми своими причиндалами - совершенно отдельное приложение, которое, естественно, нигде и ничего не наследует от Servlet, а значит сервлет-контейнер просто "не умеет" его загружать.
При этом сервлет-контейнер гарантирует, что метод init() будет обязательно вызван, что это произойдёт один раз и будет сделано до того, как потребуется вызвать метод service().
Если вы делаете несколько сервлетов, то обязательные части их интерфейса вы дополняете любыми методами, которые вам нужны.
При этом вам не требуется заботится о потоках, т.к. поток исполнения будет "предоставлен" тем, кто вызовет метод. А у вызывающего такой поток, естественно, есть. Даже если не он сам его создавал.
...
Рейтинг: 0 / 0
Клиент игрового веб-сервера
    #38691769
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, "будьте проще и люди к вам потянутся"
Если ваши дополнительные методы не требуют специальной инициализации, их не надо оформлять ни в какие сервлеты.
Просто вызывайте
...
Рейтинг: 0 / 0
Клиент игрового веб-сервера
    #38691806
aleapv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот спасибочки!

Понадобилось время чтобы осознать код.

Вы мне очень помогли.
...
Рейтинг: 0 / 0
Клиент игрового веб-сервера
    #38692115
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleapv,

поставь tomcat7(8) там есть пример как использовать websockets
можешь использовать https://github.com/TooTallNate/Java-WebSocket
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Клиент игрового веб-сервера
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]