简体   繁体   English

java,如何在小程序内部使用HttpURLConnection性能增加方法

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

I am not java expert. 我不是java专家。

I have a code for requesting response for a local web server. 我有一个代码,用于请求本地Web服务器的响应。 I've done in a java app / jar . 我已经在Java应用程序/ jar中完成了。 This works very well, at least on my machine :) with 0 errors on replies from local server. 至少在我的机器上 ,这非常有效:)在来自本地服务器的回复中出现0错误。

But my client used my code in an Applet : Recompiled, signed and deployed on Java Tomcat. 但是我的客户在Applet中使用了我的代码 :在Java Tomcat上重新编译,签名并部署。

And there is 1 error every 10 calls from client side. 并且从客户端每10个呼叫就有1个错误。

Any suggestions to increase the performance inside on an Applet? 有什么建议可以提高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. 您可以通过删除StringBuilder并直接从连接的输入流中解析XML来提高性能 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. 您应该为此使用XPath。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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