Пристань: входные потоки в обработчике всегда пустые. как получить входной поток от клиента - PullRequest
0 голосов
/ 29 марта 2020

Я хочу разработать ntrip caster на базе пристани 9.4.27. Http-клиент отправляет данные через http-POST.

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

  1. client: send "POST / Mount-Point HTTP / Сервер 1.1 "
  2. : отправьте код состояния 200 в качестве подтверждения (HTTP / 1.1 200 OK)
  3. клиент: дождитесь получения кода состояния 200
  4. клиент: начните непрерывную отправку данных

Важно: все должно выполняться в одном запросе

Шаги 1 и 2 работают: вызов обработчика Jetty работает правильно. клиент получает код состояния 200 и начинает передачу данных. хотя клиент выполняет запись в выходной поток, данные не поступают на сервер.

baseRequest.getReader () и request.getReader () всегда «пустые».

Что не так с мой код? Серверная реализация с простыми сокетами прекрасно работает с этой клиентской программой. Возможно ли подобное с Jetty?

Клиент реализован с помощью простого сокета. упрощенный код выглядит следующим образом ...

// create Socket to connect jetty server
InetAddress addr = InetAddress.getByName(host);
socket = new Socket(addr, port);
...
bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8"));
bufferedWriter.write(createHttpPost())  // Send POST /Mount-Point HTTP/1.1 ...
...
if (checkResponseCode200(response.toString())){
   // Status Code 200 received. send data continuously
   while(true){
      socket.getOutputStream().write(Utils.convertByteToByteArray(msg));
      socket.getOutputStream().flush();
   }
}       
/*
*  Jetty Programmcode
*/
package ch.dca.caster;

import org.apache.http.util.ByteArrayBuffer;
import org.eclipse.jetty.server.*;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.util.thread.QueuedThreadPool;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;

public class JettyServer {
    private Server server;

    public void start() throws Exception {
        server = new Server(new QueuedThreadPool(128, 8));
        ServerConnector connector = new ServerConnector(server);
        connector.setPort(1083);
        server.setConnectors(new Connector[]{connector});
        server.setHandler(new InitialHandler());
        server.start();
    }

   public class InitialHandler extends AbstractHandler {
        @Override
        public void handle(String target,
                           Request baseRequest,
                           HttpServletRequest request,
                           HttpServletResponse response) throws IOException,ServletException

        {
           // printout Request-Header

           System.out.println("**** Before request.getReader() :  baseRequest = " + baseRequest);
           System.out.println("**** Header");
           Enumeration<String> headerValues = baseRequest.getHeaderNames();
           List<String> headerValuesList= Collections.list(headerValues);

           for(String s:headerValuesList){
                System.out.println(s + ": " + baseRequest.getHeader(s));
           }
           /* Result ....
               **** Before request.getReader() :  baseRequest = Request(POST //192.168.1.112/CHE8304A)@7698d57b
               **** Header
               Host: 192.168.1.112
               Authorization: Basic ZGNhcnRjbTpZaUpiYks4Ug==
               Ntrip-Version: Ntrip/2.0
               Content-Type: gnss/data
               User-Agent: NTRIP dca.telemetry.server
               Connection: close
           */

            //
            // Step 1: 
            // compliant to ntrip protocol:  first of all send status code 200 to the client
            //
            response.setContentType("text/plain; charset=utf-8");
            response.setStatus(HttpServletResponse.SC_OK);
            PrintWriter out = response.getWriter();
            out.println("OK");
            out.flush();

            //
            // Step 2: 
            // Client starts streaming the data as soon as code 200 is received
            // client: --> socket.getOutputStream().write(Utils.convertByteToByteArray(msg));
            //

            BufferedReader is = request.getReader(); // <----- not working: allways Empty !!!
            boolean doRead = true;
            while (doRead){
                int c = is.read();
                while (c > -1) {
                    System.out.print(int2Byte(c));
                    c = is.read();
                }

            }
            baseRequest.setHandled(true);
        }
    }
}

1 Ответ

0 голосов
/ 09 апреля 2020

Заголовки запроса, которые вы указали:

Host: 192.168.1.112
Authorization: Basic ZGNhcnRjbTpZaUpiYks4Ug==
Ntrip-Version: Ntrip/2.0
Content-Type: gnss/data
User-Agent: NTRIP dca.telemetry.server
Connection: close

Нет никакого содержимого тела, которое было бы очевидно с этим набором заголовков.

Как правило, существует 3 способа отправки содержимого тела по HTTP-запросу. ...

  1. С заголовком Content-Length, указывающим длину тела. (поддерживается в HTTP / 1.0, HTTP / 1.1 и даже HTTP / 2)
  2. С заголовком Transfer-Encoding: chunked, указывающим неопределенную длину содержимого тела (поддерживается только в HTTP / 1.1 и требует указания * 1023) * Формат кодирования для работы. RFC7230: Раздел 4.1 )
  3. Необработанное содержимое тела, пока соединение не будет закрыто. (техника старой школы HTTP / 1.0)

Я бы рекомендовал использовать метод № 1 или № 2 для максимальной совместимости со спецификациями и уменьшения сложности с HTTP-посредниками (прокси, балансировщики нагрузки, серверы кэширования и т. д.) 1024 *)

Еще одна вещь, на которую следует обратить внимание - это метод HTTP (GET, POST, PUT и т. Д. c ..). Не все методы поддерживают содержание тела. (поэтому придерживайтесь указанного вами POST, чтобы устранить это осложнение)

...