Cómo programar el backend de websocket
La aparición de WebSocket se basa en las necesidades en tiempo real de las aplicaciones web. Este tipo de aplicación web en tiempo real debería ser familiar para todos y debería haberse utilizado en la vida, como comentarios de Sina Weibo, notificaciones de mensajes privados, WebQQ de Tencent, etc. Repasemos el dilema de las aplicaciones web en tiempo real.
Antes de la aparición de WebSocket, el uso de la Web en tiempo real generalmente se implementaba de dos maneras: mecanismo de sondeo y tecnología de transmisión, entre ellos, existen diferentes tipos de sondeo, y también hay sondeos prolongados; llamado cometa.
Encuesta: Esta es la primera solución para implementar aplicaciones web en tiempo real. El cliente envía solicitudes al servidor a ciertos intervalos y mantiene la sincronización entre el cliente y el servidor a través de solicitudes frecuentes. La desventaja de esta solución de sincronización es que cuando el cliente inicia una solicitud al servidor con una frecuencia fija, es posible que los datos en el servidor no se actualicen, lo que provocará muchas transmisiones de red innecesarias, por lo que esta es una solución real muy ineficiente. solución de tiempo.
Encuesta larga: Es una mejora y potenciación del sondeo programado, con el propósito de reducir la transmisión no válida de la red. Cuando no hay actualización de datos en el lado del servidor, la conexión se mantendrá durante un período de tiempo hasta que los datos o el estado cambien o expire el tiempo. Este mecanismo reduce las interacciones no válidas entre el cliente y el servidor. Por supuesto, si los datos en el servidor cambian con mucha frecuencia, este mecanismo no mejorará sustancialmente el rendimiento en comparación con el sondeo programado.
Stream: Suele utilizar una ventana oculta en la página del cliente para enviar una solicitud de conexión larga al servidor. El servidor responde después de recibir esta solicitud y actualiza continuamente el estado de la conexión para garantizar que la conexión entre el cliente y el servidor no caduque. A través de este mecanismo, la información del lado del servidor se puede enviar continuamente al cliente. Este mecanismo tiene algunos problemas con la experiencia del usuario. Es necesario diseñar diferentes soluciones para diferentes navegadores para mejorar la experiencia del usuario. Al mismo tiempo, este mecanismo es una gran prueba para los recursos del lado del servidor cuando la concurrencia es relativamente grande.
El método anterior en realidad no es una tecnología real en tiempo real, sino una tecnología simulada en tiempo real que se utiliza para lograrlo. Cada interacción entre el cliente y el servidor es un proceso de solicitud y respuesta HTTP, y cada solicitud y respuesta HTTP lleva información completa del encabezado HTTP, lo que aumenta la cantidad de datos transmitidos cada vez. Pero lo más doloroso de estos métodos son los desarrolladores, porque la implementación tanto del cliente como del servidor es muy complicada. Para simular un efecto en tiempo real más realista, los desarrolladores a menudo necesitan construir dos conexiones HTTP para simular las dos. comunicación bidireccional entre el cliente y el servidor, una conexión se utiliza para manejar la transmisión de datos del cliente al servidor y una conexión se utiliza para manejar la transmisión de datos del servidor al cliente. Esto inevitablemente aumenta la complejidad de la implementación de la programación y aumenta la carga. en el servidor y restringe la escalabilidad del sistema de aplicaciones.
Basado en las deficiencias anteriores, ha surgido la tecnología para realizar aplicaciones web en tiempo real. WebSocket realmente implementa capacidades de comunicación en tiempo real como sistemas de escritorio bajo arquitectura C/S a través de la API proporcionada por el navegador. El principio es utilizar JavaScript para llamar a la API del navegador y enviar una solicitud WebSocket al servidor. Después de un protocolo de enlace, se establece la comunicación TCP con el servidor. Debido a que es esencialmente una conexión TCP, la transmisión de datos es altamente estable y la transmisión de datos. el volumen es relativamente pequeño.
Protocolo WebSocket
El protocolo WebSocket es esencialmente un protocolo basado en TCP.
Para establecer una conexión WebSocket, el navegador del cliente primero debe iniciar una solicitud HTTP al servidor. Esta solicitud es diferente de una solicitud HTTP normal y contiene información de encabezado adicional. La información de encabezado adicional "Actualización: WebSocket" indica que esto es. un protocolo de solicitud para solicitudes HTTP actualizadas, el servidor analiza esta información de encabezado adicional y luego genera información de respuesta y la devuelve al cliente. Se establece la conexión WebSocket entre el cliente y el servidor. Ambas partes pueden transferir información libremente a través de este canal de conexión. , y esta conexión continuará existiendo hasta que el cliente o el servidor cierren activamente la conexión.
Presentamos el protocolo WebSocket en detalle. Dado que este protocolo aún se encuentra en la etapa de borrador y la versión cambia rápidamente, elegimos la última versión borrador-ietf-hybi-thewebsocketprotocol-17 para describir el protocolo WebSocket. . Porque esta versión actualmente es compatible con algunos de los navegadores principales, como Chrome, Firefox y Opera. Puedes ver el protocolo de protocolo de enlace a través de la descripción
Lo que el cliente envía al servidor:
El código es el siguiente Copia el código
GET /chat HTTP /1.1
Host: server.example.com
Actualización: websocket
Conexión: Actualización
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ ==
Origen:
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Contenido de servidor a cliente:
Copia el código de la siguiente manera
HTTP/1.1 101 protocolos de conmutación
Actualización: websocket
Conexión: Actualización
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK xOo=
Sec-WebSocket-Protocol: chat
Estas solicitudes son muy similares a las solicitudes HTTP normales, pero algunas de ellas están estrechamente relacionados con el protocolo WebSocket de. Necesitamos presentar brevemente esta información de solicitud y respuesta. "Actualización: WebSocket" significa que se trata de una solicitud HTTP especial. El propósito de la solicitud es actualizar el protocolo de comunicación entre el cliente y el servidor del protocolo HTTP al protocolo WebSocket. . Entre ellos, el Sec-WebSocket-Key del cliente y el Sec-WebSocket-Accept del servidor son información importante de autenticación de protocolo de enlace. Estos contenidos se explicarán en la publicación del blog sobre la implementación del lado del servidor.
Creo que a través de la explicación anterior debería tener una comprensión preliminar de WebSocket. Si tiene alguna pregunta, no dude en comunicarse.
Cliente
Por ejemplo, en el protocolo de protocolo de enlace presentado en el capítulo conceptual, el navegador proporciona al cliente una API, por lo que se puede llamar simplemente usando JavaScript, mientras que el El servidor necesita Si lo implementa usted mismo, el lado del servidor se discutirá en la próxima publicación del blog.
Copia el código de la siguiente manera
Definición de interfaz JavaScript de WebSocket:
[Constructor(en la URL de DOMString, opcional en el protocolo DOMString)]
interfaz WebSocket {
atributo de solo lectura DOMString URL;
// estado listo
const unsigned short CONNECTING = 0;
const unsigned short OPEN = 1;
const unsigned short CLOSED = 2
atributo de solo lectura unsigned short readyState
atributo de solo lectura unsigned long bufferedAmount; p >// networking
Función de atributo onopen;
Función de atributo onmessage;
Función de atributo onclose;
envío booleano (en DOMString data );
void close();
};
WebSocket implementa EventTarget
Comprenda brevemente los métodos y propiedades de la interfaz:
readyState indica que la conexión tiene cuatro estados:
CONNECTING (0): indica que la conexión aún no se ha establecido;
OPEN (1): la conexión se ha establecido y se puede realizar la comunicación;
CIERRE (2): La conexión se cierra al cerrar el protocolo de enlace;
CERRADO (3): La conexión se ha establecido cerrado o no se puede abrir;
url es Representa la dirección de red del servidor WebSocket. El protocolo suele ser "ws" o "wss (comunicación cifrada)".
El método de cierre es cerrar la conexión;
Al establecer la conexión abierta, es decir, un evento desencadenado por un apretón de manos exitoso;
Un evento desencadenado cuando onmessage recibe un mensaje del servidor;
Un evento desencadenado por una excepción onerror;
onclose Eventos desencadenados al cerrar la conexión;
El ejemplo de JavaScript llamando a la interfaz del navegador es el siguiente:
Copia el código de la siguiente manera
var wsServer = 'ws://localhost:8888 /Demo'; //Dirección del servidor
var websocket = new WebSocket(wsServer); //Crear un objeto WebSocket
websocket.send("hello"); //Enviar al servidor Mensaje
alert(websocket.readyState) ; //Ver el estado actual de websocket
websocket.onopen = function (evt) {
//La conexión se ha establecido
}; p>
websocket.o
nclose = function (evt) {
//La conexión se ha cerrado
};
websocket.onmessage = function (evt) {
//Recibir mensaje del servidor, usar evt.data para extraer
};
websocket.onerror = function (evt) {
//Generar excepción
};