entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

El caso es que estoy haciendo un miniservidor HTTP con java, Conecto el cliente(Browser) mediante sockets con el servidor. La cuestión es que tengo un formulario en el cliente y no se como obtener los datos para poder tratarlos en el servidor. Si que consigo los datos como por ejemplo Content-Type: application/x-www-form-urlencoded ,Content-Length: 21,
pero no obtengo los datos introducidos en el input¿Alguna idea? Tiene que resolverse mediante sockets.

3 Respuestas

1voto

Erion Puntos590

Muchas gracias por las respuestas, al final lo logré. Era un problema de lectura de los datos del POST, con esto se soluciona:

if(getSplit[0].equals("POST"))
            {
                j = 0;
                while (j<7) {
                    line = datos.readLine() ;
                    if(line != null)
                    {

                        if(line.contains("Content-Length"))
                        {
                            p=split(line," ");
                            tam = Integer.parseInt(p[1]);
                        }
                    }
                  j++;
                }

                final char[] usuario = new char[tam];
                datos.read(usuario);

0voto

Peter comentado

Si esta es la solución por favor seleccionala como correcta.

Saludos.

1voto

Leonardo-Tadei Puntos227320

Los sockets son conexiones que el servidor matienen con el cliente para poder enviarle datos, al revés de lo que hace el protocolo HTTP.

Vía socket, podés enviarle al cliente una mensaje del tipo "devolveme los datos", pero tendrías que tener un JavaScript en el cliente que esté esperando el pedido y te lo responda.

No pierdas de vista el mecanismo de comunicación de los sockets, respecto de quien envío y quién recibe peticiones...

Saludos!

2votos

white Puntos75880

Te llegan el cuerpo de la peticion almenos?

aca te dejo un ejemplo:

try
{
    ServerSocket serverSocket = new ServerSocket(8001);

    while (true)
    {
        Socket clientSocket = serverSocket.accept();

        BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));

        String line = in.readLine();
        boolean submit = line.startsWith("POST");

        if(submit)
        {
            System.out.println("get form data:");
            System.out.println();
            int contentLength = 0;

            while(!(line = in.readLine()).equals(""))
            {
                if(line.startsWith("Content-Length:"))
                {
                    contentLength = Integer.parseInt(line.substring("Content-Length: ".length()));
                }
            }

            StringBuilder requestBody = new StringBuilder();
            String[] params;
            HashMap<String, String> $_POST = new HashMap();

            if (submit) {
                for (int i = 0; i < contentLength; i++) {
                    requestBody.append((char) in.read());
                }

                params = requestBody.toString().split("&");

                for(int i = 0; i < params.length; i++) {
                    String[] param = params[i].split("=");
                    $_POST.put(param[0], param[1]);
                }

                for(Entry<String, String> input : $_POST.entrySet())
                {
                    System.out.printf("$_POST[%s] = '%s'\n", input.getKey(), input.getValue());
                }
            }
        }

        String htmlForm = "<html>"
            + "<head>"
            + "     <title>Entredesarrolladores form example</title>"
            + "</head>"
            + "     <body>"
            + "         <form method='POST'>"
            + "             <input type='text' name='test' value='anything'><input type='submit'>"
            + "         </form>"
            + "     </body>"
            + "</html>";

        out.write("HTTP/1.0 200 OK\r\n");
        out.write("Server: Java server\r\n");
        out.write("Content-Type: text/html\r\n");
        out.write("Content-Length: " + htmlForm.length()  + "\r\n");
        out.write("\r\n");
        out.write(htmlForm);

        out.flush();
        out.close();
        clientSocket.close();
    }
}
catch (IOException e)
{
    e.printStackTrace();
}

si la primera linea de la peticion es POST entonces tomaremos el cuerpo del mensaje que tendra algo asi:

POST ...
Host: localhost:8001
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://localhost:8001/
Connection: keep-alive
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 11

test=anything&other=other%20value

entonces, divide el cuerpo del mensaje por cada caracter & y a ese arreglo recorrelo y obten el nombre del campo y el valor.

el resultado en consola seria:

$_POST[test] = 'anything'

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta