WebSocket es una característica importante de HTML5, implementó socket remoto basado en navegadores, que permite a los navegadores tiener comunicación full-duplex con servidores. Principales navegadores de streaming como Firefox, Google Chrome y Safari han apoyado esta característica.
Las personas a menudo usan "polarización roll" para los servicios de mensajería instantánea antes de que naciera WebSocket, lo que permitirá a los clientes enviar peticiones HTTP en cada período determinado, a continuación, el servidor devuelve los datos más recientes a los clientes. Esto requiere que los clientes para mantener el envío de una gran cantidad de solicitudes y ocupar una gran cantidad de ancho de banda.
WebSocket utiliza un tipo de cabecera especial para reducir la acción apretón de manos entre navegadores y servidores de una sola vez, y crear una conexión. Esta conexión permanecerá activa, puede utilizar JavaScript para escribir o leer datos de esta conexión, como en el uso de un socket TCP convencional. Se resuelve el problema de desarrollo web en tiempo real, y tiene las siguientes ventajas sobre HTTP tradicional:
- Sólo una conexión TCP para un cliente web de la chamusquina.
- WebSocket servidores pueden enviar datos a los clientes web.
- Más encabezado ligero para reducir la transmisión de datos.
WebSocket URL comienza con ws:// or wss://(SSL). La siguiente imagen muestra el proceso de comunicación de WebSocket, en un encabezado HTTP en particular fue enviado al servidor de apretón de manos, entonces los servidores o los clientes son capaces de enviar o recibir datos a través de JavaScript de acuerdo a algún tipo de socket, este conector puede ser utilizado por el evento manejador para recibir datos de forma asíncrona.
Figure 8.2 WebSocket principle.
Protocolo WebSocket es bastante simple, después de la aprobación del primer apretón de manos, la conexión se establece con éxito. Datos de comunicación posteriores comienzan todos con "\ x00" y termina con "\ xFF". Los clientes no verán estas dos partes porque WebSocket se romperá ambos extremos y da datos sin procesar de forma automática.
Conexión WebSocket se solicita por los navegadores y respondió por los servidores, a continuación, se establece la conexión, este proceso se conoce como "handshake",("apretón de manos").
Considere las siguientes peticiones y comentarios:
Figure 8.3 WebSocket request and response.
"Sec-WebSocket-key" se genera de forma aleatoria, como pueden suponer, esto se codificada por base64. Los servidores deben anexar esta llave a un string después de aceptado:
258EAFA5-E914-47DA-95CA-C5AB0DC85B11
Supongamos que tenemos f7cb4ezEAl6C3wRaU6JORA==
, entonces tenemos:
f7cb4ezEAl6C3wRaU6JORA==258EAFA5-E914-47DA-95CA-C5AB0DC85B11
Utilice sha1 para calcular el valor binario y utilizar base64 para codificar, entonces tenemos:
rE91AJhfC+6JdVcVXOGJEADEJdQ=
Use esto como valor de la Sec-WebSocket-Accept
para responder el encabezado.
La biblioteca estándar de go no es compatible con WebSocket, pero paquete websocket , que es el sub-conjunto de go.net es mantenido por el apoyo oficial.
Use go get
para instalar este paquete:
go get code.google.com/p/go.net/websocket
WebSocket tiene cliente y servidor , veamos un ejemplo sencillo: la información de entrada del usuario, cliente envía el contenido al servidor a través de WebSocket; servidor empuja la información una copia de seguridad del cliente.
Client code:
<html>
<head></head>
<body>
<script type="text/javascript">
var sock = null;
var wsuri = "ws://127.0.0.1:1234";
window.onload = function() {
console.log("onload");
sock = new WebSocket(wsuri);
sock.onopen = function() {
console.log("connected to " + wsuri);
}
sock.onclose = function(e) {
console.log("connection closed (" + e.code + ")");
}
sock.onmessage = function(e) {
console.log("message received: " + e.data);
}
};
function send() {
var msg = document.getElementById('message').value;
sock.send(msg);
};
</script>
<h1>WebSocket Echo Test</h1>
<form>
<p>
Message: <input id="message" type="text" value="Hello, world!">
</p>
</form>
<button onclick="send();">Send Message</button>
</body>
</html>
Como puede ver, JavaScript es muy fácil escribir en el lado del cliente, y el uso que corresponde la función de establecer una conexión. Evento onopen
activa después de apretón de manos para decirle a cliente que la conexión se ha creado con éxito. Enlaces de cliente de cuatro eventos:
- 1)onopen: activado después de que se establezca la conexión.
- 2)onmessage: activado mensaje después de recibido.
- 3)onerror: activado después de que ocurrió el error.
- 4)onclose: activado después de la conexión cerrada.
Server code:
package main
import (
"code.google.com/p/go.net/websocket"
"fmt"
"log"
"net/http"
)
func Echo(ws *websocket.Conn) {
var err error
for {
var reply string
if err = websocket.Message.Receive(ws, &reply); err != nil {
fmt.Println("Can't receive")
break
}
fmt.Println("Received back from client: " + reply)
msg := "Received: " + reply
fmt.Println("Sending to client: " + msg)
if err = websocket.Message.Send(ws, msg); err != nil {
fmt.Println("Can't send")
break
}
}
}
func main() {
http.Handle("/", websocket.Handler(Echo))
if err := http.ListenAndServe(":1234", nil); err != nil {
log.Fatal("ListenAndServe:", err)
}
}
Cuando el cliente Envia información de entrada del usuario, el servidor Receive
, y usa Send
para volver la regeneración.
Figure 8.4 WebSocket server received information.
A través del ejemplo de arriba vemos que la implementación del cliente y del servidor de WebSocket son muy convenientes. Podemos utilizar el paquete net directamente en Go. Ahora, con el rápido desarrollo de HTML5, crear WebSocket será mucho más importante en el desarrollo web, tenemos que reservar este conocimiento.