Java HTTP client IOException: fixed content-length - bytes r

Biwitie - 19 déc. 2023 à 10:52
 Biwitie - 21 déc. 2023 à 06:59

Je travaille sur un projet Java visant à créer une API pour un jeu de bataille navale. J'ai rencontré un problème avec le client HTTP, provoquant l'erreur java.io.IOException: fixed content-length: 118, bytes received: 0. Le problème survient lorsque j'essaie d'envoyer une requête POST vers une endpoint spécifique. Voici le code pertinent :

Launcher Class:

import fr.lernejo.navy_battle.misc.ConnectHunter;
import fr.lernejo.navy_battle.misc.IdCreatorHunter;
import fr.lernejo.navy_battle.misc.game.board.*;

import java.util.concurrent.atomic.AtomicInteger;

public class Launcher {
    private static final AtomicInteger port = new AtomicInteger();
    public static void main(String[] args) {
        if (args.length < 1){ System.err.println("Port not specified"); System.exit(1); }
        var board = new BoardReadyToFight().createFinalBoard();
        try { port.set(Integer.parseInt(args[0]));} catch (Exception e){ System.err.println("Enter a valid port"); System.exit(1); }
        System.out.println("Server is ready to fight on port: " + port);
        try { new StartServerHunter().startServer(port.get());
            if (args.length == 2){
                String id = new IdCreatorHunter().createId();
                String message = "Hell yeah! I'm ready for a fight!";
                new ConnectHunter(Integer.toString(port.get()), args[1], id, message);
            }
        } catch (Exception e) { throw new RuntimeException(e); }
    }

    public static int getPort() { return port.get(); }
}

The class that create all the server needs

package fr.lernejo.navy_battle;

import com.sun.net.httpserver.HttpServer;
import fr.lernejo.navy_battle.handler.PingHandlerHunter;
import fr.lernejo.navy_battle.handler.VerbHandlerHunter;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class StartServerHunter {

    public final void startServer(int port) throws IOException {
        final HttpServer server = com.sun.net.httpserver.HttpServer.create(new InetSocketAddress(port), 0);
        final String path_ping = "/ping";
        final String path_game = "/api/game/start";
        final String path_shoot = "/api/game/fire";
        ExecutorService threadPool = Executors.newFixedThreadPool(1);
        server.setExecutor(threadPool);
        server.createContext(path_ping, new PingHandlerHunter());
        server.createContext(path_game, new VerbHandlerHunter());
        server.createContext(path_shoot, new VerbHandlerHunter());
        server.start();

    }
}

And here the class that causing probleme

package fr.lernejo.navy_battle.misc;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class ConnectHunter {

    public ConnectHunter(String args, String url, String id, String message) throws IOException, InterruptedException {
        HttpClient client = HttpClient.newHttpClient();

        String requestBody = String.format("{\"id\": \"%s\", \"url\": \"", \"message\": \"%s\"}", id, args, message);

        HttpRequest requestPost = HttpRequest.newBuilder()
            .uri(URI.create(url + "/api/game/start"))
            .setHeader("Accept", "application/json")
            .POST(HttpRequest.BodyPublishers.ofString(requestBody))
            .build();
        System.out.println(requestPost);
        client.send(requestPost, HttpResponse.BodyHandlers.ofString());
    }
}

Here the exception

Server is ready to fight on port: 4321
http://localhost:1234/api/game/start POST
Exception in thread "main" java.lang.RuntimeException: java.io.IOException: fixed content-length: 118, bytes received: 0
    at fr.lernejo.navy_battle.Launcher.main(Launcher.java:22)
Caused by: java.io.IOException: fixed content-length: 118, bytes received: 0
    at java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:964)
    at java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:133)
    at fr.lernejo.navy_battle.misc.ConnectHunter.<init>(ConnectHunter.java:23)
    at fr.lernejo.navy_battle.Launcher.main(Launcher.java:20)

Informations supplémentaires :

  • Le serveur est configuré en utilisant la classe StartServerHunter.
  • Le problème survient lors de l'envoi d'une requête POST depuis la classe ConnectHunter.
  • J'ai essayé avec des valeurs statiques et avec AsyncSend. Dans tous les cas, le message est envoyé, mais l'application plante juste après.

Exemple du message reçu par la première instance :

{"id": "ACQAETJB-HLYW-ESWV-EDYN-NDMPBKHWLVWA", "url": "http://localhost:1234", "message": "May the force be with you"}
A voir également:

1 réponse

En fait j’ai oublié d’envoyer le message. Je disais tiens tu vas recevoir un message de 118, mais j’envoie rien

0