2016-07-21 32 views
0

Ich habe einen Code für einen HTTP-Server geschrieben, der eine Antwort an den Client basierend auf der Clienteingabe senden soll.Nicht in der Lage, Eingabestreamdaten von httpExchange abzurufen

Ich habe den gleichen Code zweimal geschrieben, einmal mit einfachen Socket-Verbindung und der zweite mit com.sun.net.httpserver.

Der Code basiert auf der einfachen Steckdose funktioniert gut und ich bin in der Lage die Anforderungen kommen vom Client zu lesen mit:

DataInputStream in = new DataInputStream (threadSocket.getInputStream()); 
int ln = in.available(); 
byte [] bytes = new byte [ln]; 
in.read(bytes); 
String msg = new String(bytes); 

Allerdings, wenn ich die Http zu verwenden, versuche ich kann nicht jede Eingabe erhalten vom Kunden.

Dies ist der Code für den HTTP-Server Hendler:

static class ntripHandler implements HttpHandler { 
    public void handle(HttpExchange t){ 
     try { 
      int ln = t.getRequestBody().available(); 
      byte [] bt = new byte [ln]; 
      t.getRequestBody().read(bt); 
      String msg = new String(bt); 
      System.out.println(msg); 
     } 
     catch (IOException ex) {System.out.println(ex);} 

     //// some operations sholuld be made here ....... 

    } 
} 

Derzeit Ich versuche, den Eingangsstrom aus dem HttpExchange.getRequestBody() zu verwenden, aber es ist immer null. Ich habe auch versucht, die httpExchange.getRequestURI().getQuery(), aber es ist auch immer Null.

Die Eingabe vom Client sieht wie folgt aus: GET/HTTP/1.0 User-Agent: NTRIP GnssSurferV1.10 Authorization: Basic

Was mache ich falsch und wie kann ich es beheben? Jede Hilfe wäre willkommen.

Antwort

0

Sie sollten die HttpExchange schließen.

Beachten Sie auch, dass die Art, wie Sie available() verwenden, schwierig ist. Es gibt

eine Schätzung der Anzahl von Bytes, die gelesen werden können ...

und:

Beachten Sie, dass während einige Implementierungen von {@code Input} kehrt die Gesamtzahl der Bytes im Stream, viele nicht. Es ist nie richtig, den Rückgabewert dieser Methode zu verwenden, um einen Puffer zuzuweisen, der alle Daten in diesem Stream enthalten soll.

Komplettes Beispiel (nicht exectly Sie Fall verwenden, aber es beantwortet Ihre Frage):

/** 
* To test: 
* 
* ```` bash 
* $ curl -v -H "Content-Type: application/json" \ 
* -d '{"name":"Testing!"}' http://localhost:8000 
* ```` 
*/ 
public static void main(String[] args) throws IOException { 
    // Creates a basic HTTP server, with default Executor and system default socket 
    // backlog (second parameter in create method, 0) 
    final HttpServer server = HttpServer.create(
     new InetSocketAddress("localhost", 8000), 0); 
    // context MUST start with "/". Root context is just "/" 
    // HttpHandler implemented as lambda, note that HttpHandler#handle() throws an 
    // IOException, so no need to catch it 
    server.createContext("/", (he) -> { 
     try { 
      System.out.println(he.getRequestURI()); 
      final InputStream in = he.getRequestBody(); 
      final OutputStream out = he.getResponseBody(); 

      // first send header, than response body, if any 
      // use default buffer size suited for your use case 
      final byte[] buffer = new byte[in.available() == 0 ? 1024 : in.available()]; 
      System.out.println("buffer size=" + buffer.length);  

      // preferrable, specify *exact* size of response body. If not known, use 0 
      // < HTTP/1.1 200 OK 
      // < Date: Thu, 21 Jul 2016 08:14:25 GMT 
      // < Transfer-encoding: chunked 
//   he.sendResponseHeaders(200, 0); 
//   int length; 
//   while ((length = in.read(buffer, 0, buffer.length)) >= 0) { 
//    out.write(buffer, 0, length); 
//   } 

      // better way of doing it: buffer response body and set content length 
      // < HTTP/1.1 200 OK 
      // < Date: Thu, 21 Jul 2016 08:11:40 GMT 
      // < Content-length: 19 
      final ByteArrayOutputStream baos = new ByteArrayOutputStream(buffer.length); 
      int length; 
      while ((length = in.read(buffer, 0, buffer.length)) >= 0) { 
       baos.write(buffer, 0, length); 
      } 
      he.sendResponseHeaders(200, baos.size()); 
      baos.writeTo(out); // no need to close() of flush() ByteArrayOutputStream 

     } finally { 
      // Essential: HttpExchange must be closed 
      he.close(); 
     } 
    }); 
    server.start(); 
} 
+0

was meinst du? schließe es wann? –

+0

Was meinen Sie mit dem Schließen des 'HttpExchange'? Wann sollte es geschlossen werden? –

+0

sehe meine aktualisierte Antwort. Sollte jetzt klar sein :) – rmuller