90 – WebSockets (Javascript)

Introduction to WebSockets

WebSockets have revolutionized real-time communication on the web. They provide a full-duplex, bidirectional communication channel over a single, long-lived connection. With WebSockets, web applications can push data from the server to the client and vice versa, making them a vital technology for chat applications, online gaming, live data feeds, and more.

Key Features of WebSockets

WebSockets offer several key features that make them a powerful tool for web development:

Full-Duplex Communication

Unlike traditional HTTP requests, which are one-way (request and response), WebSockets enable full-duplex communication. Both the client and server can send data at any time, creating an interactive and responsive experience.


// Client-side WebSocket connection
const socket = new WebSocket('wss://example.com/socket');

// Listen for messages from the server
socket.addEventListener('message', (event) => {
  const message = event.data;
  console.log('Received message:', message);
});

// Send a message to the server
socket.send('Hello, server!');
Low Latency

WebSockets reduce latency by eliminating the need to repeatedly open and close connections for communication. This makes them ideal for real-time applications that require quick data exchange.


// Server-side WebSocket handling (Node.js)
const WebSocket = require('ws');
const wss = a WebSocket.Server({ server });

wss.on('connection', (ws) => {
  console.log('Client connected');

  ws.on('message', (message) => {
    console.log('Received message:', message);
    ws.send('You said: ' + message);
  });
});
Bi-Directional Communication

WebSockets support bi-directional communication, making them suitable for scenarios where both the client and server need to exchange data without a strict request-response pattern.

WebSocket Lifecycle

Understanding the lifecycle of a WebSocket connection is essential for implementing it effectively:

Connection Establishment

To establish a WebSocket connection, the client sends a WebSocket handshake request to the server, which in turn responds with a handshake response. Once the connection is established, data can flow in both directions.


// Client-side WebSocket connection
const socket = new WebSocket('wss://example.com/socket');

socket.addEventListener('open', (event) => {
  console.log('Connection opened');
});

socket.addEventListener('close', (event) => {
  console.log('Connection closed');
});
Data Exchange

After the connection is established, both the client and server can send data at any time. Messages can be text, binary, or any format that can be serialized.


// Server-side WebSocket handling (Node.js)
const WebSocket = require('ws');
const wss = a WebSocket.Server({ server });

wss.on('connection', (ws) => {
  console.log('Client connected');

  ws.on('message', (message) => {
    console.log('Received message:', message);
    ws.send('You said: ' + message);
  });
});
Connection Closure

WebSocket connections can be closed intentionally by the client or server or due to unforeseen circumstances. Properly handling closure is essential to ensure the reliability of your application.


// Client-side WebSocket connection
const socket = new WebSocket('wss://example.com/socket');

socket.addEventListener('close', (event) => {
  if (event.wasClean) {
    console.log('Connection closed cleanly, code:', event.code, 'reason:', event.reason);
  } else {
    console.error('Connection abruptly closed');
  }
});
Security Considerations

While WebSockets provide powerful capabilities, it’s crucial to address security concerns. Always use secure WebSocket connections (wss://), validate and sanitize data, and implement proper access control to prevent unauthorized access.

Conclusion

WebSockets are a fundamental technology for real-time web applications, offering low-latency, bidirectional communication. Understanding the WebSocket lifecycle and key features is essential for implementing them effectively in your web projects.

With WebSockets, you can create dynamic, interactive, and real-time applications that keep users engaged and informed. Whether you’re building a chat application, an online game, or a live data dashboard, WebSockets can provide the real-time communication your application needs.