Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di Cr4ckz!
    Registrato dal
    Aug 2003
    Messaggi
    163

    webService Java - Problema lunghezza risposta

    Salve a tutti, ho realizzato un piccolo webservice in Java (plain, senza utilizzare qualche framework in particolare....giusto per scopi didattici) e funziona correttamente su un VPS che mi ha prestato un amico.

    Il webService riceve e restituisce richieste/risposte (in POST) in formato JSON.

    Ora ho acquistato un VPS (di un diverso hoster, in questo caso NetSons) e sto avendo problemi quando la risposta è di una certa lunghezza; non ho ancora identificato quanto esattamente ma sono sicuro che se è più di 2000 caratteri si verifica il problema.

    La JVM (e il sistema operativo) è la stessa su entrambi i VPS:

    java version "1.6.0_26"
    Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
    Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
    Provando a inviare una richiesta con curl questo è il risultato:

    VPS del mio amico
    codice:
    curl http://VPS-AMICO:8081/myService/getAreas -d "{\"radius\":1000, \"longitude\": 9.214504, \"latitude\": 45.454261}"
    {"areas":[....
    .....
    .....
    Mio VPS
    codice:
    curl http://MIO-VPS:8081/myService/getAreas -d "{\"radius\":1000, \"longitude\": 9.214504, \"latitude\": 45.454261}"
    curl: (18) transfer closed with 2492 bytes remaining to read
    Credo che per qualche motivo si "rovini" l'header della risposta ma non ho la minima idea di cosa possa causarlo.
    Oppure il mio VPS è "limitato" per quanto riguarda la lunghezza effettiva della risposta quindi in questo caso nell'header è segnato che il payload è lungo 2492 bytes ma poi effettivamente viene troncato ad un certo punto e quindi viene fuori l'errore....

    C'è per caso qualche cosa (a livello di sistema) che mi sono dimenticato di configurare? Oppure è una configurazione del VPS e quindi meglio se chiedo assistenza a NetSons?


    Grazie in anticipo per i suggerimenti.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    Sposto nel forum Java.
    Credo, comunque, che dovresti postare la parte di codice rilevante nel problema.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di Cr4ckz!
    Registrato dal
    Aug 2003
    Messaggi
    163
    Mi sono accorto dopo di aver postato nella sezione sbagliata, scusate :P

    Non credo che sia un problema di codice dal momento che su un VPS funziona e sull'altro no ma non si sa mai

    codice:
    public void handle(HttpExchange httpEx) throws IOException {
    //read input
    String command = httpEx.getRequestURI().toString().substring(basePath.length()+1);
    		
    //check the command
    if (!isValidCommand(command)) {
    sendException(httpEx, new InvalidRequestException("Unknown command: " + command));
    return;
    }
    		
    //read the parameters
    String input = readInput(httpEx);	
    
    String result = null;
    try {
    //Verifico di quela richiesta si tratta, la gestisco e in result inserisco la risposta JSON
    } catch (InvalidRequestException ire) {
    sendException(httpEx, ire);
    return;
    } catch (Exception e) {
    	e.printStackTrace();
    }
    			
    if (result == null) {
    	sendResult(httpEx, 500, "Internal Server Error");
    	return;
    }
    
    sendResult(httpEx, 200, result);
    }

    Creazione e invio della risposta:
    codice:
    private static void sendResult(HttpExchange httpEx, int code, String text) throws IOException {
      System.out.println("LEN: "+text.length());
      httpEx.sendResponseHeaders(code, text.length());
      OutputStream os = httpEx.getResponseBody();
      os.write(text.getBytes());
      os.close();
    }


    NOTE: ho chiesto all'assistenza di NetSons e mi hanno risposto che loro non impostano nessun limite di sorta per quanto riguarda la lunghezza del payload. Il VPS è "libero" quindi sarà qualche configurazione che devo settare io.....ma dove??

  4. #4
    Utente di HTML.it L'avatar di Cr4ckz!
    Registrato dal
    Aug 2003
    Messaggi
    163
    Mettendo un try-catch al corpo del metodo sendResponse:
    codice:
    private static void sendResult(HttpExchange httpEx, int code, String text) {
     try {
    	httpEx.sendResponseHeaders(code, text.length());
            OutputStream os = httpEx.getResponseBody();
    	os.write(text.getBytes());
    	os.close();
    
    } catch (IOException e) {
    	e.printStackTrace();
    }
    
    }
    ecco che ricevo la seguente eccezzione:

    java.io.IOException: too many bytes to write to stream
    at sun.net.httpserver.FixedLengthOutputStream.write(F ixedLengthOutputStream.java:58)
    at java.io.FilterOutputStream.write(FilterOutputStrea m.java:80)
    at sun.net.httpserver.PlaceholderOutputStream.write(E xchangeImpl.java:370)
    at it.nikotia.woof.controller.RequestHandler.sendResu lt(RequestHandler.java:528)
    at it.nikotia.woof.controller.RequestHandler.handle(R equestHandler.java:114)
    at com.sun.net.httpserver.Filter$Chain.doFilter(Filte r.java:65)
    at sun.net.httpserver.AuthFilter.doFilter(AuthFilter. java:65)
    at com.sun.net.httpserver.Filter$Chain.doFilter(Filte r.java:68)
    at sun.net.httpserver.ServerImpl$Exchange$LinkHandler .handle(ServerImpl.java:555)
    at com.sun.net.httpserver.Filter$Chain.doFilter(Filte r.java:65)
    at sun.net.httpserver.ServerImpl$Exchange.run(ServerI mpl.java:527)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run Task(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
    Il problema però è sempre quello: l'eccezione me la solleva solo sul mio VPS....sull'altro niente, funziona tutto correttamente -.-'


    Ho risolto in questo modo:
    codice:
    httpEx.sendResponseHeaders(code, text.getBytes().length);
    Mi rimane comunque oscuro il motivo per cui su un VPS funzionava e nell'altro no!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.