DEV Community

Cover image for Beginner's Guide: Creating a Real-Time Chat App with Next.js and WebSockets
Manjush
Manjush

Posted on

Beginner's Guide: Creating a Real-Time Chat App with Next.js and WebSockets

Introduction:

In this guide, we'll explore how to create a basic real-time chat application using Next.js and WebSockets. Real-time capabilities are essential for contemporary applications, and the combination of Next.js with WebSockets offers a powerful solution for building interactive and collaborative experiences.

Prerequisites:

Before we begin, ensure you have Node.js and npm (Node Package Manager) installed on your system. You can download them from nodejs.org.

Setting Up a New Next.js Project:

Create a new Next.js project by running the following commands in your terminal:

npx create-next-app real-time-chat-app
cd real-time-chat-app
Enter fullscreen mode Exit fullscreen mode

Install additional dependencies for managing WebSocket connections:

npm install socket.io-client socket.io
Enter fullscreen mode Exit fullscreen mode

Creating the WebSocket Server

Create a WebSocket server that will handle real-time communication. Create a new folder named server in the project root directory and create a server.js file inside it:

// server/server.js
const http = require('http');
const { Server } = require('socket.io');

const server = http.createServer((req, res) => {
  // Handle HTTP requests if needed
});
const io = new Server(server);

io.on('connection', (socket) => {
  console.log('User connected');

  // Handle chat messages
  socket.on('chat message', (message) => {
    io.emit('chat message', message); // Broadcast the message to all connected clients
  });

  socket.on('disconnect', () => {
    console.log('User disconnected');
  });
});

server.listen(3001, () => {
  console.log('WebSocket server listening on port 3001');
});
Enter fullscreen mode Exit fullscreen mode

Creating the Chat Interface

Update main page with following code in Next.js app:

// pages/index.js
import React, { useState, useEffect } from 'react';
import io from 'socket.io-client';

const socket = io('http://localhost:3001'); // Replace with your server URL

const Index = () => {
  const [messages, setMessages] = useState([]);
  const [newMessage, setNewMessage] = useState('');

  useEffect(() => {
    // Listen for incoming messages
    socket.on('chat message', (message) => {
      setMessages((prevMessages) => [...prevMessages, message]);
    });
  }, []);

  const sendMessage = () => {
    socket.emit('chat message', newMessage);
    setNewMessage('');
  };

  return (
    <div>
      <h1>Real-Time Chat</h1>
      <div>
        {messages.map((message, index) => (
          <div key={index}>{message}</div>
        ))}
      </div>
      <input
        type="text"
        value={newMessage}
        onChange={(e) => setNewMessage(e.target.value)}
      />
      <button onClick={sendMessage}>Send</button>
    </div>
  );
};

export default Index;
Enter fullscreen mode Exit fullscreen mode

Running the Application

Start your Next.js application and the WebSocket server:

npm run dev
Enter fullscreen mode Exit fullscreen mode

Your real-time chat application should now be running at http://localhost:3000. Open it in multiple browser tabs or devices to see real-time messages in action.

Conclusion

Congratulations! You’ve built a real-time chat application using Next.js and WebSockets from scratch. This is a fundamental example, but you can extend it by adding user authentication, message history, and more features to create a full-fledged chat application.

Top comments (2)

Collapse
 
dreama profile image
Dream

How would this setup handle user authentication if I wanted to add that feature? Great guide, by the way!

Collapse
 
manjushsh profile image
Manjush

Thank you! This is just a basic example.
SocketIO has this good article for JWT auth that you can refer: socket.io/how-to/use-with-jwt