DEV Community

Cover image for Advanced WebSockets Techniques For Bi-Directional Data Transfer In Web App Development
Jessica Bennett
Jessica Bennett

Posted on

Advanced WebSockets Techniques For Bi-Directional Data Transfer In Web App Development

Have you ever wondered how chatbots work? What is the technology involved that facilitates such real-time communication between you and the web application? The technology used is WebSockets. Proceed to read more about how WebSockets facilitate bi-directional data flow between the client and the server. We will also talk about how application development specialists can use it to enhance web app development.

How To Leverage WebSockets In Web App Development

Essentially, WebSockets facilitate communication without any intermediary application buffering. Hence, the speed of data transfer quickens, making WebSockets the ideal communication protocol for

  • Instant chap applications
  • Stock tickers
  • Airline booking systems
  • Online gaming, etc.

Till about recently, web developers enabled communications by leveraging stateless HTTP protocols. These one-directional communication protocols were easy to implement within desktop websites. However, the complexities of modern web app development make HTTP an ineffective communication protocol. Users expect the different complex features of modern applications to function fast and relay results instantly. Thus, there was an intense need for quick client-server data flow. With their ability to provide real-time, bi-directional data flow, WebSockets help web apps deliver seamless user experiences across devices.

But there are intricacies involved. The process of integrating WebSockets into modern web application development is complex. It requires the expertise of tech professionals with in-depth knowledge of the complexities of WebSocket integration to optimize its usage.

Understanding The Nuances Of WebSocket And How They Work

HTTP protocols facilitates one-way communication between the client and server. But WebSockets enable full-duplex communication. Here, both parties involved send and receive data simultaneously. WebSockets handle multiple data streams using just one connection. Thus, they achieve bi-directional data transfer easily. This is unlike HTTP/1.1, which allows sending only one stream of structured data at a time.

The WebSocket is also an independent and TCP-based protocol. Hence, it is compatible with all other protocols that support TCP sockets like HTTP. Even though developers implement WebSockets within servers and web browsers during web app development, all clients and server apps can access them easily.

Generally, every WebSocket connection comprises two endpoints: the browser and the server. The browser initiates the connection request. Subsequently, the client sends the value “WebSocket” through an Upgrade Header. In response, the server leverages the upgrade headers and 101 Switching Protocol response to accept the client’s connection upgrade request. Thus, a real-time two-way connection gets established and stays open to both sides until one decides to close it.

An application developer can also use WebSockets for low latency and high throughput web app development. Today, the WebSocket protocol is an essential technique implemented in almost all different types of modern web browsers and server-side applications.

How to establish a WebSocket connection

Let us look at the steps web developers undertake to establish a WebSocket connection.

  • Browser sends an HTTP connection request with a unique Upgrade header field
  • Servers that support WebSockets respond with the 101 Switching Protocols response code
  • Browser client then sends in a WebSocket handshake request

This usually includes an additional HTTP request line and the previous WebSocket handshake response. After the handshake completes, a WebSocket connection forms that facilitates bi-directional data transfer in the form of WebSocket messages. This message transfer is in a binary format that consists of the following:

  • Header containing the message metadata and its type
  • The accompanying payload data

Generally, text messages consist of UTF-8 characters while binary messages are encoded and consist of an array of bytes. Hence, they get transmitted without requiring any additional processing in the browser. This capability is another reason modern application development prefers leveraging WebSocket protocols for bi-directional data transfer.

Implementing WebSocket In Web App Development

Developers build WebSocket-based web applications using the WebSocket API. This API facilitates communication with WebSocket servers. But first web developers must create a WebSocket object. This object will automatically try to open a communication with the server.

Creating a WebSocket object

The code syntax for this depends on the programming language a web developer uses. We will take a look at a sample Object creation code in JavaScript to give readers a fair idea. Here, web developers will use the “WebSocket” API, generally built into modern browsers and as a module in Node.js.

Creating JavaScript browser objects

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

// Event listeners for WebSocket events
socket.addEventListener('open', (event) => {
  console.log('WebSocket connection opened:', event);
});

socket.addEventListener('message', (event) => {
  console.log('Received message:', event.data);
});

socket.addEventListener('close', (event) => {
  console.log('WebSocket connection closed:', event);
});

socket.addEventListener('error', (event) => {
  console.error('WebSocket error:', event);
});

Enter fullscreen mode Exit fullscreen mode

Creating Node.js objects within JavaScript

const WebSocket = require('ws');

// Server-side WebSocket
const wss = new WebSocket.Server({ port: 3000 });

wss.on('connection', (ws) => {
  console.log('WebSocket connection opened');

  ws.on('message', (message) => {
    console.log('Received message:', message);
  });

  ws.on('close', () => {
    console.log('WebSocket connection closed');
  });

  ws.on('error', (error) => {
    console.error('WebSocket error:', error);
  });
});

Enter fullscreen mode Exit fullscreen mode

Sending data to the server

After opening the connection, a web application development company must make provisions to send data to the server. Below a code sample is given to enable the same in JavaScript.

In Javascript Browser

const socket = new WebSocket('ws://example.com');

socket.addEventListener('open', (event) => {
  console.log('WebSocket connection opened:', event);

  // Sending data to the server after the connection is open
  socket.send('Hello, server!');
});

socket.addEventListener('message', (event) => {
  console.log('Received message:', event.data);
});

socket.addEventListener('close', (event) => {
  console.log('WebSocket connection closed:', event);
});

socket.addEventListener('error', (event) => {
  console.error('WebSocket error:', event);
});

Enter fullscreen mode Exit fullscreen mode

Completing the transfer in Node.js

const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 3000 });

wss.on('connection', (ws) => {
  console.log('WebSocket connection opened');

  ws.on('message', (message) => {
    console.log('Received message:', message);

    // Send the client a response
    ws.send('Hello, client!');
  });

  ws.on('close', () => {
    console.log('WebSocket connection closed');
  });

  ws.on('error', (error) => {
    console.error('WebSocket error:', error);
  });
});

Enter fullscreen mode Exit fullscreen mode

Using the above codes the client can send data to the server. Now let us look at how data is received from the server.

Receiving data or messages from the server

Receiving WebSocket messages in JavaScript browser

const socket = new WebSocket('ws://example.com');

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

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

socket.addEventListener('close', (event) => {
  console.log('WebSocket connection closed:', event);
});

socket.addEventListener('error', (event) => {
  console.error('WebSocket error:', event);
});
Completing the action in Node.js
const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 3000 });

wss.on('connection', (ws) => {
  console.log('WebSocket connection opened');

  ws.on('message', (message) => {
    console.log('Received message from the client:', message);

    // Send back the client’s response 
    ws.send('Hello, client!');
  });

  ws.on('close', () => {
    console.log('WebSocket connection closed');
  });

  ws.on('error', (error) => {
    console.error('WebSocket error:', error);
  });
});

Enter fullscreen mode Exit fullscreen mode

While this will complete the data transfer within the browser and the server, a client might need to close the connection if there is no further use.

Closing an open WebSocket connection

To close a WebSocket connection, let us look at the codes to integrate during application development.

Closing the connection in JavaScript Browser

const socket = new WebSocket('ws://example.com');

socket.addEventListener('open', (event) => {
  console.log('WebSocket connection opened:', event);

  // Close the WebSocket connection after 5 seconds (for example)
  setTimeout(() => {
    socket.close();
  }, 5000);
});

socket.addEventListener('close', (event) => {
  console.log('WebSocket connection closed:', event);
});

socket.addEventListener('error', (event) => {
  console.error('WebSocket error:', event);
});
Completing the action using Node.js
const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 3000 });

wss.on('connection', (ws) => {
  console.log('WebSocket connection opened');

  // Close the WebSocket connection after 5 seconds (for example)
  setTimeout(() => {
    ws.close();
  }, 5000);

  ws.on('close', () => {
    console.log('WebSocket connection closed');
  });

  ws.on('error', (error) => {
    console.error('WebSocket error:', error);
  });
});

Enter fullscreen mode Exit fullscreen mode

This close request will close the connection on both the browser and the server endpoints.

Conclusion

Several advantages justify the use of WebSockets in application development. Generally, integrating WebSocket protocols within web app development results in low latency, cross-browser support, support for binary bi-directional communication, and complete elimination of the need for polling. WebSockets is a powerful technology for facilitating bi-directional data transfer. Hence, developers extensively leverage this technology to integrate modern communication features within their web app development.

Top comments (0)