Я хочу разработать ntrip caster на базе пристани 9.4.27. Http-клиент отправляет данные через http-POST.
процедура (протокол ntrip) должна выглядеть следующим образом:
- client: send "POST / Mount-Point HTTP / Сервер 1.1 "
- : отправьте код состояния 200 в качестве подтверждения (HTTP / 1.1 200 OK)
- клиент: дождитесь получения кода состояния 200
- клиент: начните непрерывную отправку данных
Важно: все должно выполняться в одном запросе
Шаги 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);
}
}
}