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.