Assim como o XmlHttpRequest, webSocket eh um componente acessível por Javascript disponível em todo browser que implementa HTML 5. Já existe no Google Chrome 4.x, no Safari/WebKit e no Firefox 3.7.
Com o WebSocket é possível abrir uma conexão HTTP, mantê-la aberta, ?escutar? seu stream por novas mensagens e reagir a elas via javascript e inclusive enviar novos dados (como uma nova mensagem), tudo na mesma conexão, sem precisar passar pelo peso da rotina de abrir conexão, enviar/receber dados, fechar conexão e repetir daqui a alguns segundos. Ou seja, a vantagem é diminuir a quantidade enorme de conexões batendo no servidor para uma ordem de grandeza menos.
Obviamente vai demorar um bom tempo para aparecer no IE, mas relaxa, existe uma alternativa muito interessante chamada Web-Socket.js. Ela simula a mesma API do WebSocket padrão (e no Chrome ela nem se ativa), mas usa um pequeno Flash como ponte para criar a conexão HTTP permanente, com os mesmos eventos.
Interessante neh, ficou curioso? Entaum vambora!
O construtor: WebSocket
O WebSocket (url, protocolo) construtor leva um ou dois argumentos. O primeiro argumento, URL, especifica a URL para o qual deseja se conectar. A, segundo o protocolo, se presente, especifica um sub-protocolo que o servidor deve oferecer suporte para a conexão seja bem sucedida.
Quando o WebSocket() é invocado, executa as seguintes etapas:
Retorna uma nova WebSocket objeto, e prosseguir com estas etapas em segundo plano (sem bloquear scripts).
Estabelecer uma conexão Socket Web para um host host, na porta da porta (se foi especificado), de origem, com a bandeira seguro, com o nome do recurso como o nome do recurso, e com o protocolo como o protocolo (se houver).
bufferedAmount:
O atributo bufferedAmount deve retornar o número de bytes que foram enfileiradas, mas ainda não foi enviada.
readyState:
O atributo readyState representa o estado da conexão. Pode ter os seguintes valores:
CONNECTING (valor numérico 0)
A conexão ainda não foi estabelecida.
OPEN (valor numérico 1)
A Web Socket conexão é estabelecida e comunicação é possível.
CLOSED (valor numérico 2)
A conexão foi fechada ou não pôde ser aberto.
Quando o objeto é criado a sua readyState deve ser definida para (0)
send:
O metodo send(dados) transmite dados usando a conexão. Se o readyState atributo é CONNECTING, deve lancar um INVALID_STATE_ERR.
O método deve retornar true se a conexão ainda está estabelecida (e os dados foram enviados com sucesso ou em fila), ou falso se a conexão é fechada.
close:
O metodo close() deve fechar a conexão WebSocket, se houver, e mudar o readyState do valor do atributo para CLOSED(2). Se a conexão já está fechada, ele deve fazer nada.
Manipuladores de evento:
onopen:
Quando a conexao eh estabelecida, nesse momento o agente altera o readyState para OPEN(1)
onmessage:
QUando uma mensagem eh recebida, o agente usa a interface MessageEvent. Verifica se a conexao esta ativa e encaminha os dados.
onerror:
Quando uma conexao WebSocket eh detectada um erro.
onclose:
QUando o socket eh fechada. O agente altera o readyState para CLOSED(2), e em seguida lanca para o evento.
//*******************************************
INTERFACE:
[Constructor(in DOMString url, in optional DOMString protocols)]
[Constructor(in DOMString url, in optional DOMString[] protocols)]
interface WebSocket {
readonly attribute DOMString url;
// ready state
const unsigned short CONNECTING = 0;
const unsigned short OPEN = 1;
const unsigned short CLOSING = 2;
const unsigned short CLOSED = 3;
readonly attribute unsigned short readyState;
readonly attribute unsigned long bufferedAmount;
// networking
attribute Function onopen;
attribute Function onmessage;
attribute Function onerror;
attribute Function onclose;
readonly attribute DOMString protocol;
void send(in DOMString data);
void close();
};
WebSocket implements EventTarget
//*******************************************
Vamos ao exemplo:
Javascript bem simples
var sock;
function connectToServer() {
try {
sock = new WebSocket("ws://localhost:8181/websock");
sock.onopen = sockOpen;
sock.onerror = sockError;
sock.onclose = sockClosed;
sock.onmessage = sockMessage;
} catch (e) {
log("error:" + e);
}
}
function sockOpen() {
log("connected");
}
function sockError(error, p2) {
log("socket error!");
}
function sockClosed() {
log("socket closed");
}
function sockMessage(event) {
log("Received message: " + event.data);
}
function log(msg) {
var txtLog = document.getElementById("log");
txtLog.value += "\r\n" + msg;
}
Coloquei um video de demonstrando a aplicacao rodando na minha maquina. Eh isso galera, bons estudos!!!