Autore Topic: attesa infinita JSON parser  (Letto 418 volte)

Offline LaLeggenda

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxyS3
  • Sistema operativo:
    win7
attesa infinita JSON parser
« il: 17 Gennaio 2018, 21:33:35 CET »
0
ciao a tutti,

sto impementando un'app che può richiedere diverse operazioni  ad un server.
Brevemente creo degli oggetti che vengono spediti al server che li conserva in una lista, successivamente chiedo la lista di oggetti creati.
Per serializzare gli oggetti ho usato json. Il problema nasce perché il server rimane in attesa dei dati (anche se sono già stati spediti) a meno che non chiuda la socket. io non voglio chiuderla perché non ho terminato le operazioni da fare, quindi ho cercato un escamotage cioè di inviare una stringa di fine comunicazione "END" ma il server continua a bloccarsi.
Qualcuno ha un'idea?

Codice: [Seleziona]
try{
            JSONParser parser = new JSONParser();
            Object obj=new Object();
            InputStreamReader ISR=new InputStreamReader(clientSocket.getInputStream());
            BufferedReader IN = new BufferedReader(ISR);
            while (true) {
                if (IN.readLine().equals(
                        "END")) break;
                obj = parser.parse(IN); // implementa un meccanismo di lettura che legge finché non è = END
            }
                JSONObject json = (JSONObject) obj;
                System.out.println("str rcvd: " + json);



            eee =new Event();
            eee.setLocation((String) json.get("Location"));
            eee.setIdea((String) json.get("Idea"));
            eee.setBudget(Integer.parseInt(json.get("Budget").toString()));
            eee.setId_img(Integer.parseInt(json.get("Id_img").toString()));
            String cmd=(String) json.get("cmd");
            System.out.println("RCVD COMMAND: "+cmd);

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 804
  • Respect: +168
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:attesa infinita JSON parser
« Risposta #1 il: 18 Gennaio 2018, 11:11:22 CET »
0
Prova con un "flush" dello stream lato server.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline LaLeggenda

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxyS3
  • Sistema operativo:
    win7
Re:attesa infinita JSON parser
« Risposta #2 il: 18 Gennaio 2018, 23:33:47 CET »
0
nada

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 804
  • Respect: +168
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:attesa infinita JSON parser
« Risposta #3 il: 19 Gennaio 2018, 08:40:23 CET »
0
Cosa succede lato client? Legge solo una parte di dati o proprio nulla?

Eventualmente prova ad inizializzare BufferedReader con una dimensione pari ad 1

Codice (Java): [Seleziona]
BufferedReader IN = new BufferedReader(ISR, 1);
E' una cosa normalmente sbagliatissima, ma potrebbe essere di aiuto per individuare il problema.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline LaLeggenda

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxyS3
  • Sistema operativo:
    win7
Re:attesa infinita JSON parser
« Risposta #4 il: 20 Gennaio 2018, 18:27:55 CET »
0
il client arriva fino a "sono qui" e poi attende

ho provato:
clientSocket.setKeepAlive(true); clientSocket.setSoTimeout(1); per non far cade la connessione quando facciuo un close ma niente
 anche a sostituire printwriter con bufferedwriter... perché un amico usa queste classe e se chiude gli stream la connessione non cade.... lui però per connettersi usa:
Codice: [Seleziona]
//URL url = new URL("http://localhost:9999");
        //HttpURLConnection client=(HttpURLConnection) url.openConnection();
        //client.setDoOutput(true);
ma niente ....

questo è il client
Codice: [Seleziona]
package com.mastrosoft.myapplication;

// EchoClient.java
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

import java.net.*;
import java.io.*;
public class EchoClient {
    public static void main(String[] args) throws IOException {

        Event messsage= new Event("08/12/2017","Bologna","Discodiscotecateca","100",2);


        BufferedReader in = null, stdIn = null;
        BufferedWriter printwriter = null;
        Socket client = new Socket("192.168.203.20", 9999);
        client.setKeepAlive(true);
        //URL url = new URL("http://localhost:9999");
        //HttpURLConnection client=(HttpURLConnection) url.openConnection();
        //client.setDoOutput(true);
        System.out.println("connesso");

        String command="AddNewEvent";

            if (command.matches("AddNewEvent")) {
                //System.out.println("AddNewEvent req");
                //json
                try {

                    printwriter = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
                    System.out.println("Creato writer");
                    JSONObject object = new JSONObject();
                    try {
                        object.put("Location", messsage.getLocation());
                        object.put("Idea", messsage.getIdea());
                        object.put("Budget", messsage.getBudget());
                        object.put("Id_img", messsage.getId_img());
                        object.put("cmd", command);
                        object.put("com", null);
                        System.out.println("Inviato evento");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    printwriter.write(object.toJSONString());
                    printwriter.newLine();
                    printwriter.flush();
                    System.out.println("chiuso stream");



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


        command="ShowEvents";

        if (command.matches("ShowEvents")) {
            System.out.println("ShowEvents req");

            try{

                printwriter = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));

                System.out.println("Creato writer");
                //json
                JSONObject object = new JSONObject();
                try {
                    object.put("Location", "NaN");
                    object.put("Idea", "NaN");
                    object.put("Budget", 0);
                    object.put("Id_img", 0);
                    object.put("cmd", command);
                    object.put("com", null);
                } catch (Exception e) {
                    e.printStackTrace();
                }
//Bufferedwriter
                printwriter.write(object.toJSONString());
                printwriter.newLine();
                printwriter.flush();
                //printwriter.close();
                System.out.println("inviato eventofittizio");



               // printwriter = new PrintWriter(client.getOutputStream(), true);

                JSONParser parser = new JSONParser();
                Object obj2=null                ;


                InputStreamReader isr = new InputStreamReader(client.getInputStream());
                BufferedReader iin = new BufferedReader(isr);
                System.out.println("sono qui");
                System.out.println("echo: " + iin.readLine());
                //printwriter.write(1);
                //printwriter.flush();
                while(obj2==null) {
                    obj2 = parser.parse(new InputStreamReader(client.getInputStream()));// la coda non viene ricevuta!!!! prova wait e notify
                }//si chiude la connessione per questo non riceve un cazzo socketisclosedexception!
                JSONObject json = (JSONObject) obj2;
                System.out.println("str rcvd: " + json);
                Event RCVDmesssagetmp=new Event();
                RCVDmesssagetmp.setLocation((String) json.get("Location"));
                RCVDmesssagetmp.setIdea((String) json.get("Idea"));
                RCVDmesssagetmp.setBudget(Integer.parseInt(json.get("Budget").toString()));
                RCVDmesssagetmp.setId_img(Integer.parseInt(json.get("Id_img").toString()));
                String cmd = (String) json.get("cmd");
                System.out.println("RCVD COMMAND: " + cmd);


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

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

        }
        printwriter.close();
        client.close();


    }

}

e questo è il server
Codice: [Seleziona]
package com.mastrosoft.myapplication;

import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

/**
 * Created by Alessandro on 11/12/2017.
 */
public class SkeletonThread extends Thread {
    private IGestore skeleton;
    private Socket clientSocket;
    private Event eee;
    private CodaEvents ccc;
    public SkeletonThread(IGestore _skeleton, Socket _socket){
        this.skeleton=_skeleton;
        this.clientSocket=_socket;

        InetAddress address = clientSocket.getInetAddress();
        String client = address.getHostName();
        int porta = clientSocket.getPort();
        System.out.println("In chiamata Client: "+ client + " porta: " + porta);
        System.out.println("Connection accepted: "+ clientSocket);
    }

    public void run(){
        try{
                JSONParser parser = new JSONParser();
                clientSocket.setKeepAlive(true);
                clientSocket.setSoTimeout(1);
            InputStreamReader ISR = new InputStreamReader(clientSocket.getInputStream());
            BufferedReader IN = new BufferedReader(ISR, 1);
            Object obj = parser.parse(IN); // implementa un meccanismo di lettura che legge finché non è = END



            JSONObject json = (JSONObject) obj;
                System.out.println("str rcvd: " + json);
                eee =new Event();
                eee.setLocation((String) json.get("Location"));
                eee.setIdea((String) json.get("Idea"));
                eee.setBudget(Integer.parseInt(json.get("Budget").toString()));
                eee.setId_img(Integer.parseInt(json.get("Id_img").toString()));
                String cmd=(String) json.get("cmd");
                System.out.println("RCVD COMMAND: " + cmd);
                String com=(String) json.get("com");
                System.out.println("RCVD COM: "+com);


            if (cmd.matches("AddNewEvent")){
                Boolean Esito=skeleton.AddNewEvent(eee);
                System.out.println("Event added...");
                OutputStreamWriter osw = new OutputStreamWriter(clientSocket.getOutputStream());
                osw.write(Esito.toString());
                System.out.println("EchoServer operation: " + Esito.toString());
                System.out.println("connessione chiusa");
            }


            if (cmd.matches("ShowEvents")) {
                System.out.println("chiamo server...");
                ccc = skeleton.ListEventAvailable();
                ccc.listcoda();
                PrintWriter printwriter = new PrintWriter(clientSocket.getOutputStream(), true);
                InputStreamReader isr = new InputStreamReader(clientSocket.getInputStream());
                BufferedReader in = new BufferedReader(isr);
                System.out.println("Sending Events...");
                //for (int i = 0; i<ccc.length ; i++) {
                    Event messsage = ccc.estrai();
                    //json
                    JSONObject object = new JSONObject();
                    try {
                        object.put("Location", messsage.getLocation());
                        object.put("Idea", messsage.getIdea());
                        object.put("Budget", messsage.getBudget());
                        object.put("Id_img", messsage.getId_img());
                        object.put("Esito", "TRUE");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    boolean Esito=false;
                    //while(in.read()!=1) {
                        printwriter.write(object.toJSONString());
                        System.out.println(object.toJSONString());
                        printwriter.flush();

                    //}
                //}
                System.out.println("Events Sent...");
//                OutputStreamWriter osw = new OutputStreamWriter(clientSocket.getOutputStream());
//                osw.write(Esito.toString());
//                System.out.println("EchoServer operation: " + Esito.toString());}



                //clientSocket.close();
                System.out.println("connessione chiusa");
            }

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



    }
}

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 804
  • Respect: +168
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:attesa infinita JSON parser
« Risposta #5 il: 22 Gennaio 2018, 09:41:11 CET »
0
Se non ho capito male il codice, il client invia un comando "AddNewEvent" seguito da un comando "ShowEvents".

Il server legge il primo comando, entra nella if (cmd.matches("AddNewEvent")){, esegue il codice poi ignora la if (cmd.matches("ShowEvents")) { perché non ha letto l'evento successivo.

Dovresti mettere il codice che legge ed interpreta i comandi in un ciclo, tipo:

Codice (Java): [Seleziona]
//Object obj = parser.parse(IN); // implementa un meccanismo di lettura che legge finché non è = END
Object obj;
while (obj = parser.parse(IN) != null) { //Legge i comandi dallo stream
  //...
  //...
}

Nota: per capire se è stata completata la lettura dello stream bisognerebbe capire come si comporta la chiamata parser.parse(IN) - io non riesco a trovare una documentazione decente della libreria che stai usando, per cui non posso esserti di aiuto

Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline LaLeggenda

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxyS3
  • Sistema operativo:
    win7
Re:attesa infinita JSON parser
« Risposta #6 il: 22 Gennaio 2018, 09:55:59 CET »
0
ciao, innanzi tutto grazie per l'aiuto.

Ho isolato il problema, è puramente dovuto alla socket, la parte json l'ho esclusa, facendola lavorare direttamente sulla stringa ricevuta.

In pratica posso avere due funzionamenti:

client =>AddNewEvent=>server :  questa parte funziona.

client =>ShowEvents=>server=>invio event=>client :questa parte si blocca, arrive a spedire gli eventi ma il client rimane allooppato sulla readline e non capisco perché anche perché ho gestito la lettura in entrambi I funzionamenti nella medesima maniera:
Codice: [Seleziona]
while ((str = client.readLine()) != null) {

  System.out.println("RCVD: "+str);}

appena torno a casa uppo client e server aggiornati.


<RISOLTO> sostituendo il while con if ((str=in.readLine())!=null) {...
« Ultima modifica: 22 Febbraio 2018, 19:59:02 CET da LaLeggenda »