Arild Tvergrov & Mikkel Steine
Rask, direkte kommunikasjon mellom klient (nettleser) og server.
Broadcast/push fra server til en eller flere klienter.
Kobling blir holdt åpen i klientens levetid.
RFC 6455: Full-duplex-kommunikasjon over én TCP-tilkobling.
Designet for web-server/nettleser, men kan brukes i enhver klient/server-konfigurasjon.
Startes med en handshake via et Upgrade-kall i HTTP-protokollen.
Meldinger sendes over TCP-port 80, evt. HTTPS port 443.
Støttes av alle moderne nettlesere.(FF6, Safari 6, Chrome 14, Opera 12.10, IE10)
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
var socket = new WebSocket("ws://localhost/socketserver");
socket.onopen = function (event) {
socket.send(JSON.stringify( { login : "mesan" } ));
};
socket.onmessage = function(event) {
var msg = JSON.parse(event.data);
switch(msg.type) {
case "connected":
console.log("Connected");
break;
case "newUserBroadcast":
console.log("New user: " + msg.name);
}
};
function closeSocket() { socket.close(); }
Pakker inn detaljene i enkelt grensesnitt.
Event-basert
Sørger for alternative løsninger (f.eks. polling) i eldre nettlesere.
Består av JavaScript-API for nettleser og for node.js på server.
Finnes server-alternativer også for bl.a. Java (netty-socketio).
Bruker ikke alternative realtime kommunikasjonsmetoder for nettlesere som ikke støtter WebSockets.
Ikke kompatibel med server som baserer seg på standard WebSockets-protokoll.
Server og klient må begge bruke Socket.IO API.
(function(){
var socket = io(location.origin);
socket.on('connected', function (data) {
console.log(data);
socket.emit('login', 'mikkels');
});
socket.on('newUserBroadcast', function (data) {
console.log(data);
});
})();
var app = require("express")();
var http = require("http").Server(app);
var io = require("socket.io")(http);
http.listen(3000, function() {
console.log("Listening to port 3000.");
});
io.on('connection', function(socket) {
console.log('Client connected.');
socket.emit('connected', "Server responds.");
socket.on('login', function(name) {
console.log(myname + " is logging in");
io.emit('newUserBroadcast', name);
});
});
Mange proxy-servere liker ikke HTTP Upgrade og dropper connection.
Ny teknologi som kan inneholde nye sikkerhetshull.
WebSockets kan være lett å hijacke om man ikke er forsiktig. Bruk WSS (tilsvarende HTTPS.)
Alltid valider data fra klient/server.
WebSockets har ingen autorisering. Man kan lage en form for "ticket"-system for å bøte på problemet.