El objeto TClientSocket
Para manejar peticiciones http usaremos un objeto TClientSocket. Este componente tienes dos propiedades importantes Host y Port, dichas propiedades las podemos cambiar durante la ejecución del programa o bien podemos asignarlas en tiempo de diseño. El Host será el nombre de nuestro servidor al estilo www.loquesea.com, mientras que el puerto sera el valor 80 (protocolo de web). También podremos usar la propiedad Address, en vez de Host, para indicar la dirección IP de nuestro servidor.
Cuando llamamos a la función Open el client socket abre una conexión y ocurren los siguientes eventos:
- Un evento OnLookup que tratará de localizar el server socket.
- Si el servidor es localizado, se genera un evento OnConnecting. Entonces el servidor aceptará la petición de datos.
- Ocurrirá un evento OnConnect cuando la conexión ya ha sido establecida.
- Cuando escribamos datos en el socket se producirá un evento OnWrite.
- Cuando recibamos datos del servidor se producirá un evento OnRead.
- Al final de la transmisión de datos se producirá un evento OnDiconnect para indicar el fin de la conexión.
Hay que tener cuidado a la hora de escribir un evento OnRead/OnWrite ya que dependiendo si estamos usando sockets bloqueantes o no podremos usar un tipo de conexión u otra.
En cualquier caso, si el socket falla se generará un evento OnError. Si esto ocurre guardará el código de error en la variable ErrorCode.
En nuestro caso los eventos mas interesantes son OnConnect que nos permitirá realizar la petición HTTP; el evento OnRead que nos dará la respuesta del servidor; OnError que nos dirá cuando ha fallado la conexión; y por último, OnDisconnect que nos indicará que la conexión terminó.
Un programa de ejemplo.
Crearemos un formulario con lo siguiente:
- Un objeto TClientSocket (en la pestaña Internet.
- Un botón cuyo Caption pondremos a "GET".
- Un Memo para recoger los datos y mostrar información (al que borraremos la primera lÃnea.)
Ahora introduciremos el nombre del servidor, por ejemplo "www.google.es" y el puerto 80. Dejaremos la propiedad ClientType al valor ctNonBlocking. Ahora ya podemos escribir los eventos.
No equivocar Port por Service, este debe quedar en blanco, si no provocará una excepción del programa.
Crearemos el evento del botón:
void __fastcall TForm1::Button1Click(TObject *Sender) { // Abrimos el socket. ClientSocket1->Open(); }
Y añadimos los eventos:
//--------------------------------------------------------------------------- void __fastcall TForm1::ClientSocket1Connect(TObject *Sender, TCustomWinSocket *Socket) { Memo1->Lines->Add("CONECTADO.. ENVIANDO PETICION.."); char Request2Send [ 256 ]; strcpy ( Request2Send, "GET / HTTP/1.0 \r\n\r\n" ); ClientSocket1 -> Socket -> SendText ( Request2Send ); } //--------------------------------------------------------------------------- void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket) { AnsiString respuesta; respuesta = ClientSocket1->Socket->ReceiveText(); Memo1->Lines->Add("RECIBIDO: "); Memo1->Lines->Add(respuesta); } //--------------------------------------------------------------------------- void __fastcall TForm1::ClientSocket1Disconnect(TObject *Sender, TCustomWinSocket *Socket) { Memo1->Lines->Add("DESCONECTADO.."); } //--------------------------------------------------------------------------- void __fastcall TForm1::ClientSocket1Error(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode) { Memo1->Lines->Add("ERROR"); } //---------------------------------------------------------------------------
Y ya podremos compilar el programa, ejecutarlo, presionar el boton "GET" y ver el resultado.
Comentarios.
Voy a explicar brevemente lo que hemos enviado. HTTP es un protocolo basado en texto, con lo cual cuando nosotros hacemos una petición:
GET / HTTP/1.0
Le estamos diciendo al servidor que nos "de" una página. En este caso la página es "/", que significa la raÃz del sitio web.
Si quisieramos pasar datos a una base de datos o interactuar con el sitio web podrÃamos pasarle parámetros de la siguiente forma:
GET /pagina.php?variable1=valor1&variable2=valor2 HTTP/1.0 \r\n \r\n
Lo malo de hacerlo de este modo es que en el navegador podremos ver los valores asociados a la variable y eso no es muy interesante. La mejor solución para eso es usar POST.
POST /ruta/pagina.php HTTP/1.1\r\n Host: localhost\r\n Content-Type: application/x-www-form-urlencoded Content-Length: longitud_datos. \r\n \r\n variable1=valor1&variable2=valor2&variableN=valorN
Ahora ya podemos crear nuestra aplicación IoT con Builder!.
No hay comentarios:
Publicar un comentario