WebSockets – Akademikveld Mesan



WebSockets – Akademikveld Mesan

0 0


word-war-presentation


On Github mesan / word-war-presentation

WebSockets

Akademikveld Mesan

Arild Tvergrov & Mikkel Steine

Fordeler

Rask, direkte kommunikasjon mellom klient (nettleser) og server.

Broadcast/push fra server til en eller flere klienter.

Kobling blir holdt åpen i klientens levetid.

WS-protokollen

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)

Klienten...

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
                

Serveren...

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
                

WebSockets API

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(); }

Socket.IO

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).

Socket.IO ulemper

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.

Socket.IO i klienten

(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);
  });
})();

Socket.IO på server

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);
  });
});

Utfordringer

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.

Les mer...

socket.io

WebSockets Basics

WebSockets Security