Comment les réponses reçues dans chunked HTTP / 1.1 lors de l'envoi des données en même temps au serveur en Java / Android

JLT:

Nous construisons et l'application sur laquelle il enregistre la voix de l'utilisateur en temps réel et envoie les données enregistrées au serveur via une requête HTTP. Bien que le serveur traite les données en temps réel, il envoie aussi des réponses de retour dans chunked. Pour faire simple, l'application envoie pièce de données par pièce au serveur, et en même temps, il reçoit également des réponses pièce par pièce à partir du serveur.

S'il vous plaît ne me dites pas cela est impossible parce que j'ai un exemple de travail dans iOS qui utilise le URLSessionavec l' uploadTaskaide d' une paire de flux pour envoyer les données en temps réel au serveur, puis recevoir morceau réponses par morceau de ce rappel urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data).

Voici mon code en Java. Je suis le travail d'envoi, mais la réponse est reçue que lorsque l'envoi est fait.

RequestBody body = new RequestBody() 
{
    @Override 
    public MediaType contentType() 
    {
        return MediaType.get("application/octet-stream");
    }

    @Override 
    public void writeTo(BufferedSink sink) throws IOException 
    {
        String filename = "/path/spoken.pcm";

        try 
        {
            InputStream inputStream = new DataInputStream(new FileInputStream(new File(filename)));

            byte[] cacheBytes = new byte[320];

            int length;

            while((length = inputStream.read(cacheBytes, 0, cacheBytes.length)) != -1) 
            {
                System.out.println("write thread name: " + Thread.currentThread());

                sink.write(cacheBytes, 0, length);

                Thread.sleep(10);
            }

            inputStream.close();
        } 

        catch(IOException | InterruptedException e) 
        {
            e.printStackTrace();
        }
    }
};

Request request = new Request.Builder()
            .url("www.server.com")
            .post(body)
            .build();

Interceptor interceptor = new Interceptor()
{
    @Override
    public Response intercept(Chain chain) throws IOException 
    {
        System.out.println("intercept!!!");

        CountDownLatch latch = new CountDownLatch(1);

        Response response = chain.proceed(chain.request());
        BufferedSource source = response.body().source();

        System.out.println("got response body !!!!");

        new Thread(new Runnable()
        {
            @Override
            public void run() 
            {
                byte[] cachedBytes = new byte[512];

                try 
                {
                    while(!source.exhausted())
                    {
                        int length = source.read(cachedBytes);
                        byte[] partialBytes = new byte[length];

                        System.arraycopy(cachedBytes, 0, partialBytes, 0, length);

                        System.out.println("partial response received: " + getHexString(partialBytes));
                    }
                } 

                catch (IOException e) 
                {
                    e.printStackTrace();
                }

                latch.countDown();
            }
        }).start();

        try 
        {
            latch.await();
        } 

        catch (InterruptedException e) 
        {
            e.printStackTrace();
        }

        return response;
    }
};

httpClient = new OkHttpClient.Builder()
            .addInterceptor(interceptor)
            .build();

httpClient.newCall(request).enqueue(new Callback() 
{
    @Override
    public void onFailure(Call call, IOException e) 
    {
        e.printStackTrace();
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException 
    {
        try(ResponseBody responseBody = response.body()) 
        {
            if(!response.isSuccessful()) throw new IOException("Unexpected code " + response);

            System.out.println("all responses received!");
        }
    }
});

Ce journal: System.out.println("got response body !!!!");apparaît seulement quand je suis fait toutes les données envoie au serveur. Ce qui signifie, quand le writeTo(BufferedSink sink)rendement, je reçois la réponse dans le rappel des intercepteurs en morceaux, puis le rappel onResponse(Call call, Response response)est appelé.

Ce que j'ai besoin est, quand je vous envoie des données, je veux être en mesure d'obtenir les réponses chunked en même temps.

JLT:

OK, en regardant partout, cette mise en œuvre n'est pas la manière standard comme d'autres disent que pour HTTP. Bien que HTTP ne vous limite pas de faire une émission et de réception simultanément dans une seule demande, comme je l'ai déjà réalisé cela en utilisant une application iOS en tant que client avec Java HTTP Servlet, le problème est, la plupart des bibliothèques ne prennent pas en charge ce comportement. Vous pouvez écrire votre propre SDK pour ce côté client, mais vous devez aussi tenir compte du risque à l'avenir si vous prévoyez d'utiliser équilibreurs de charge et arrière proxies pour votre serveur, et ils pourraient ne pas soutenir ce comportement soit.

Donc, ma solution la plus rapide pour obtenir le même effet utilise HTTP pour l'envoi de la demande, mais la réponse sera envoyée au client par MQTT.

Je suppose que tu aimes

Origine http://10.200.1.11:23101/article/api/json?id=478514&siteId=1
conseillé
Classement