HTML5 WebSocket
WebSocket es un protocolo proporcionado por HTML5 que permite comunicación full-duplex sobre una única conexión TCP.
WebSocket hace que el intercambio de datos entre el cliente y el servidor sea más simple, permitiendo que el servidor empuje datos activamente al cliente. En la API de WebSocket, el navegador y el servidor solo necesitan completar un apretón de manos (handshake), y entre ellos se puede crear directamente una conexión persistente y realizar transmisión de datos bidireccional.
En la API de WebSocket, el navegador y el servidor solo necesitan realizar un apretón de manos, y luego se forma un canal rápido entre el navegador y el servidor. Ambos pueden transmitir datos directamente entre sí.
Actualmente, muchos sitios web utilizan la técnica de polling de Ajax para implementar la tecnología de empuje (push). El polling consiste en que, en intervalos de tiempo específicos (por ejemplo, cada 1 segundo), el navegador envía una solicitud HTTP al servidor, y luego el servidor devuelve los datos más recientes al navegador del cliente. Este modelo tradicional tiene desventajas obvias: el navegador necesita enviar solicitudes constantemente al servidor; sin embargo, las solicitudes HTTP pueden contener cabeceras largas, donde los datos realmente útiles pueden ser solo una pequeña parte, lo que evidentemente desperdicia mucho ancho de banda y otros recursos.
El protocolo WebSocket definido por HTML5 puede ahorrar mejor los recursos del servidor y el ancho de banda, y permite una comunicación más en tiempo real.

El navegador envía una solicitud al servidor a través de JavaScript para establecer una conexión WebSocket. Una vez establecida la conexión, el cliente y el servidor pueden intercambiar datos directamente a través de la conexión TCP.
Cuando obtengas la conexión WebSocket, puedes usar elsend()método para enviar datos al servidor, y a través delonmessageevento para recibir los datos devueltos por el servidor.
La siguiente API se utiliza para crear un objeto WebSocket.
var Socket = new WebSocket(url, [protocol] );
El primer parámetro url en el código anterior especifica la URL de la conexión. El segundo parámetro protocol es opcional y especifica los subprotocolos aceptados.
Propiedades de WebSocket
Las siguientes son las propiedades del objeto WebSocket. Supongamos que hemos usado el código anterior para crear un objeto Socket:
| Propiedad | Descripción |
|---|---|
| Socket.readyState | Propiedad de solo lecturareadyStateIndica el estado de la conexión, puede ser uno de los siguientes valores:
|
| Socket.bufferedAmount | Propiedad de solo lecturabufferedAmountEl número de bytes de texto UTF-8 que han sido puestos por send() en la cola de espera para transmisión, pero que aún no se han enviado. |
Eventos de WebSocket
Los siguientes son los eventos relacionados con el objeto WebSocket. Supongamos que hemos usado el código anterior para crear un objeto Socket:
| Evento | Manejador de eventos | Descripción |
|---|---|---|
| open | Socket.onopen | Se dispara cuando se establece la conexión |
| message | Socket.onmessage | Se dispara cuando el cliente recibe datos del servidor |
| error | Socket.onerror | Se dispara cuando ocurre un error de comunicación |
| close | Socket.onclose | Se dispara cuando se cierra la conexión |
Métodos de WebSocket
Los siguientes son los métodos relacionados con el objeto WebSocket. Supongamos que hemos usado el código anterior para crear un objeto Socket:
| Método | Descripción |
|---|---|
| Socket.send() | Envía datos utilizando la conexión |
| Socket.close() | Cierra la conexión |
Ejemplo de WebSocket
El protocolo WebSocket es esencialmente un protocolo basado en TCP.
Para establecer una conexión WebSocket, el navegador del cliente primero debe enviar una solicitud HTTP al servidor. Esta solicitud es diferente de las solicitudes HTTP normales, ya que contiene información de cabecera adicional. El campo de cabecera adicional 'Upgrade: WebSocket' indica que se trata de una solicitud HTTP para solicitar una actualización de protocolo. El servidor analiza esta información de cabecera adicional y genera una respuesta que devuelve al cliente. Así se establece la conexión WebSocket entre el cliente y el servidor, y ambas partes pueden intercambiar información libremente a través de este canal de conexión. Además, esta conexión persistirá hasta que el cliente o el servidor cierre activamente la conexión.
HTML y JavaScript del cliente
Actualmente la mayoría de los navegadores admiten la interfaz WebSocket(). Puedes probar el ejemplo en los siguientes navegadores: Chrome, Mozilla, Opera y Safari.
Contenido del archivo ejemplo_websocket.html
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Ejemplo(example.com)</title>
<script type="text/javascript">
function WebSocketTest()
{
if ("WebSocket" in window)
{
alert("您的浏览器支持 WebSocket!");
// 打开一个 web socket
var ws = new WebSocket("ws://localhost:9998/echo");
ws.onopen = function()
{
// Web Socket 已连接上,使用 send() 方法发送数据
ws.send("发送数据");
alert("数据发送中...");
};
ws.onmessage = function (evt)
{
var received_msg = evt.data;
alert("数据已接收...");
};
ws.onclose = function()
{
// 关闭 websocket
alert("连接已关闭...");
};
}
else
{
// 浏览器不支持 WebSocket
alert("您的浏览器不支持 WebSocket!");
}
}
</script>
</head>
<body>
<div id="sse">
<a href="WebSocketTest().html">运行 WebSocket</a>
</div>
</body>
</html>
Instalar pywebsocket
Antes de ejecutar el programa anterior, necesitamos crear un servicio que soporte WebSocket.pywebsocketDescarga mod_pywebsocket, o utiliza el comando git para descargarlo:
git clone https://github.com/googlearchive/pywebsocket <p> mod_pywebsocket 需要 python 环境支持</p> mod_pywebsocket 是一个 Apache HTTP 的 Web Socket扩展,安装步骤如下:</p> <ul> <li><p>解压下载的文件。</p></li> <li><p>进入 <b>pywebsocket</b> 目录。</p></li> <li><p>执行命令:</p> <pre>$ python setup.py build $ sudo python setup.py install
Consulta la documentación:
$ pydoc mod_pywebsocket
Iniciar el servicio
Enpywebsocket/mod_pywebsocketEjecuta el siguiente comando en el directorio:
$ sudo python standalone.py -p 9998 -w ../example/
El comando anterior iniciará un servicio con el número de puerto 9998, usando -w para establecer el directorio donde se encuentra el manejador echo_wsh.py.
Ahora podemos abrir el archivo ejemplo_websocket.html creado anteriormente en el navegador Chrome. Si tu navegador admite WebSocket(), haz clic en 'Ejecutar WebSocket', y podrás ver las ventanas emergentes de cada paso de todo el proceso. Demostración del proceso en GIF:
Después de detener el servicio, aparecerá 'Conexión cerrada...'.
Otras extensiones