Socket.IO es una biblioteca JavaScript para aplicaciones web en tiempo real. Permite la comunicación bidireccional en tiempo real entre clientes web y servidores. Consta de dos partes: una biblioteca del lado del cliente que se ejecuta en el navegador y una biblioteca del lado del servidor para Node.js. Ambos componentes tienen una API prácticamente idéntica. Al igual que Node.js, está orientado a eventos.
0: open (Enviado desde el servidor cuando se abre un nuevo transporte (recheck))
1: close (Solicita el cierre de este transporte pero no cierra la conexión en sí.)
2: ping (Enviado por el cliente. El servidor debe responder con un paquete pong que contenga los mismos datos)
ejemplo
el cliente envía: 2probe
el servidor envía: 3probe
3: pong (enviado por el servidor en respuesta a los paquetes ping).
4: mensaje de cadena (mensaje real; el cliente y el servidor deben invocar sus callbacks con los datos.)
ejemplo:
42/chat,["join","{room:1}"]
4 es el tipo de paquete de mensaje en el protocolo engine.io
2 es el tipo EVENT en el protocolo socket.io
/chat son los datos procesados por socket.io
socket.io disparará el evento "join"
pasará datos "room: 1". Es posible omitir el namespace solo cuando es /.
5: actualización (Antes de que engine.io cambie de transporte, comprueba si el servidor y el cliente pueden comunicarse a través de ese transporte. Si la prueba es satisfactoria, el cliente envía un paquete de actualización que solicita al servidor vaciar su caché en el transporte anterior y cambiar al nuevo transporte.)
6: noop (Un paquete noop. Se utiliza principalmente para forzar un ciclo de sondeo cuando se recibe una conexión WebSocket entrante.)
API: especifica la versión de SocketIO:
ioAPI0: admite servidores socket.io 0.* (seleccionado de forma predeterminada)
ioAPI1: compatible con servidores socket.io 1.*
ioAPI2: compatible con servidores socket.io 2.*
ioAPI3: admite servidores socket.io 3.*
ioAPI4: admite servidores socket.io 4.*
Base64: si está habilitado, los mensajes binarios se reciben en base64.
HandShakeCustomURL: permite personalizar la URL para obtener la sesión de socket.io.
HandShakeTimestamp: solo habilite esta opción si desea enviar una marca de tiempo como parámetro cuando se solicita una nueva sesión (habilite esta propiedad si intenta acceder a un servidor Python gevent-socketio).
HandShakeAuthToken: si el servidor requiere un token para la autenticación, indique aquí el token de autenticación.
Namespace: permite establecer un namespace al conectarse al servidor.
Polling: al deshabilitar esta propiedad, el cliente se conectará directamente al servidor utilizando websocket como transporte.
Parameters: permite establecer los parámetros de conexión.
EncodeParameters: si está habilitado, los parámetros se codifican.
Use el método WriteData para enviar mensajes al servidor socket.io (siguiendo la sección de Tipos de Mensajes).
1. Llamar al método "add user" con un parámetro usando John como nombre de usuario.
WriteData('42["add user", "John"]');
Antes de que se establezca una nueva conexión WebSocket, el servidor socket.io requiere que el cliente abra una nueva conexión HTTP para obtener un nuevo ID de sesión. En algunos casos, el servidor socket.io requiere autenticación mediante cabeceras HTTP. Puede utilizar este evento para añadir cabeceras HTTP personalizadas, como autorización Basic o autenticación con token Bearer.
Este evento se llama después de que la conexión socket.io sea exitosa y el cliente pueda enviar mensajes al servidor. Aquí puede suscribirse a namespaces, por ejemplo.
Cuando un servidor WebSocket requiere conexiones seguras, puede obtener un mensaje de error como este cuando un cliente intenta conectarse al servidor:
Error al conectar con SSL. error:XXXXXXXX:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version
Este error significa que su cliente está intentando conectarse utilizando una versión de TLS que no es compatible con el servidor.
Para resolver este error debe gestionar OnSSLAfterCreateHandler del componente cliente WebSocket y establecer una versión TLS más reciente.
Por ejemplo: aquí estamos estableciendo TLS 1.2 como versión de protocolo.
procedure TfrmWebSocketClient.SOCKETIOHTTPConnectionSSL(Sender: TObject;
aSSLHandler: TIdSSLIOHandlerSocketBase);
begin
TIdSSLIOHandlerSocketOpenSSL(aSSLHandler).SSLOptions.Method := sslvTLSv1_2;
end;