简体   繁体   中英

java, how to increase method using HttpURLConnection performance inside an applet

I am not java expert.

I have a code for requesting response for a local web server. I've done in a java app / jar . This works very well, at least on my machine :) with 0 errors on replies from local server.

But my client used my code in an Applet : Recompiled, signed and deployed on Java Tomcat.

And there is 1 error every 10 calls from client side.

Any suggestions to increase the performance inside on an Applet?

/*
   "ruta" opcion a pedirle al servidor python para que ejecute.
   jTextArea_respuesta: El Objeto Swing de la ventana donde escribir la respuesta
   enDebug:  muestra informes en consola de java, true o false.
 */
public boolean enviaPeticion(javax.swing.JTextArea Jtextarea_respuesta, boolean enDebug, String mi_opcion) {

    long startTime=0;
    long endTime=0;

    if(enDebug==true)
    {
        startTime = System.currentTimeMillis();
    }

    boolean todo_funciono = false;

    //la direccion local del servidor python
    String url = "http://localhost:8080/?opcion=" + mi_opcion;

    //codigo de respuesta http
    int responseCode = 0;

    URL obj;
    try {

        //crea objeto de url            
        obj = new URL(url);

        HttpURLConnection con;
        try {

            //abre conexion                
            con = (HttpURLConnection) obj.openConnection();

            // solo interesa el metodo GET
            con.setRequestMethod("GET");

            //no es necesario indicar el agente
            //con.setRequestProperty("User-Agent", USER_AGENT);
            responseCode = -1;

            try {

                //se obtiene el código de respuesta http
                responseCode = con.getResponseCode();

            } catch (java.net.ConnectException ex) {

                if (enDebug) {
                    Logger.getLogger(Frame.class.getName()).log(Level.WARNING, null, ex);
                }

                //si esto falla lo más problable es que no este activo el programa servidor
                if (Jtextarea_respuesta != null) {
                    Jtextarea_respuesta.setText("servidor caido");
                }

                return false;
            }

            //se procesa la respuesta del servidor web
            BufferedReader in = null;
            try {
                in = new BufferedReader(
                        new InputStreamReader(con.getInputStream()));
            } catch (IOException ex) {
                if (enDebug) {
                    Logger.getLogger(Frame.class.getName()).log(Level.WARNING, null, ex);
                }

                return false;
            }

            String inputLine;
            StringBuffer response = new StringBuffer();

            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }

            in.close();

            // System.out.println(response.toString());   
            //System.out.println("Response Code : " + responseCode);  
            // si el código de respuesta del servidor es 200
            // es porque el servidor esta activo y la opción ingresada es válida
            if (responseCode == 200) {

                //se procesara un par opcion-valor con los datos xml recibidos
                HashMap<String, String> values = new HashMap<String, String>();
                String xmlString = response.toString();
                Document xml = convertStringToDocument(xmlString);
                Node user = xml.getFirstChild();
                NodeList childs = user.getChildNodes();
                Node child;
                for (int i = 0; i < childs.getLength(); i++) {
                    child = childs.item(i);
                    //System.out.println(child.getNodeName()+"  "+child.getTextContent());

                    //obtiene un par llave-valor
                    values.put(child.getNodeName(), child.getTextContent());
                }

                        if(enDebug==true)
                        {
                            endTime = System.currentTimeMillis();
                        }


                if (mi_opcion.equals("entrada")) {
                    //System.out.println(values.get("positivo"));

                    // esta es la respuesta positiva esperada
                    try {
                        if (values.get("positivo").equals("True")) {
                            //    
                            // **** fue procesada la entrada en el hardware
                            //     
                            if (Jtextarea_respuesta != null) {

                                String duracion="";


                            if(enDebug==true)
                            {
                                // calcula cuanto se tardó en responder el servidor python 
                                duracion = "\n"+"peticion tardó "+ Long.toString(endTime - startTime) + " milisegundos";
                            }

                                Jtextarea_respuesta.setText("enviada entrada "+ duracion);
                            }

                            //podemos reportar que funciono la operacion
                            todo_funciono = true;
                        }
                    } catch (Exception e) {
                        if (enDebug) {
                            //la respuesta xml no contiene <positivo>
                            Logger.getLogger(Frame.class.getName()).log(Level.FINE, null, e);
                        }
                    }

                    try {

                        // en esta situacion hay un error como el dispositivo desconectado
                        String error = values.get("error");

                        if (!error.isEmpty()) {
                            //    
                            // **** ocurrio algun error al solicitar la entrada
                            //  
                            if (Jtextarea_respuesta != null) {
                                Jtextarea_respuesta.setText(error);
                            }

                            return false;
                        }
                    } catch (Exception e) {
                        if (enDebug) {
                            // la respuesta xml no contiene <error>
                            Logger.getLogger(Frame.class.getName()).log(Level.FINE, null, e);
                        }

                    }
                }

            } else {
                if (Jtextarea_respuesta != null) {

                    // alguna otra situación por la cual falle el proceso
                    //  mi_opcion no es válida
                    Jtextarea_respuesta.setText("opcion invalida o error interno");
                    return false;
                }
            }

        } catch (IOException ex) {

            //no se pudo abrir la conexion por permisos de Java o el applet.
            if (enDebug) {
                Logger.getLogger(Frame.class.getName()).log(Level.SEVERE, null, ex);
            }

        }

    } catch (MalformedURLException ex) {

        // en caso que la url haya sido mal escrita.
        // caso improblable.
        if (enDebug) {
            Logger.getLogger(Frame.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    //Jtextarea_respuesta.setText("Enviando peticion a " + url);
    return todo_funciono;

}

You can increase the performance by removing the StringBuilder and parsing the XML straight out of the connection's input stream. This will save both time and space.

You can't reduce the incidence of server failure by code changes in the client.

You should be using XPath for some of this.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM