4. Half-duplex (like walkie-talkie) Full-duplex (like phone)
Traffic flows in 1 direction at a time Bi-directional traffic flow
Connection is typically closes after 1
request / response pair
Connection stays open
1. Request from client to server
2. Response from server to client
Both client and server are
simultaneously “emitting” and
“listening” (.on events)
Headers (1000s of bytes) Uses “frames” (2 bytes)
150ms to establish new TCP connection
for each HTTP message
50ms for message transmission
Polling overhead (constantly sending
messages to check if new data is ready)
No polling overheard (only sends
messages when there is data to send)
HTTP WebSocket
11. Socket.io Server Configuration
// add the HTTP server
var http = require('http');
// add Express server framework for NodeJS
var express = require('express');
// add Socket.io server framework
var socketIO = require('socket.io');
// create instance of Express
var app = express();
// create Express HTTP server
var server = http.createServer(app);
// tell Express HTTP server which port to run on
server.listen(8080);
// tell Socket.io to add event listeners to Express HTTP server
var io = socketIO().listen(server);
1. Create HTTP server
2. Add WebSocket support
to HTTP server
12. Socket.io Server Code
// listens for new socket connections from clients
// triggers a callback function when ‘connection’ event occurs
io.sockets.on('connection', function(socket) {
// do stuff (ex. keep track of # of socket connections)
connections.push(socket);
// emit / broadcast custom event and data (payload) to client
io.sockets.emit(’updateStudents', payload);
}
// listen for custom events “emitted” by client
socket.on('join', function(payload) {
var newStudent = {
socketID: this.id,
name: payload.name
}
this.emit('joined', newStudent);
}
1. Listen
2. Emit
1. Listen
2. Emit
13. Socket.io Client Code
// add Socket.io client framework
var io = require(’socket.io-client');
// add Socket.io client framework
this.socket = io('http://localhost:3000');
// listen for socket connection from server
this.socket.on(’connect', function() {
var newStudent = {name: nameFromForm, type: “student”};
// emit custom event with data (newStudent) back to server
this.emit('join', newStudent);
}
// listen for custom events with data (payload) “emitted” by server
this.socket.on('joined', function(payload) {
// do stuff with payload...
}
1. Listen
2. Emit