DEV Community

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

Posted on

9 1

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.

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

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

The Most Contextual AI Development Assistant

Pieces.app image

Our centralized storage agent works on-device, unifying various developer tools to proactively capture and enrich useful materials, streamline collaboration, and solve complex problems through a contextual understanding of your unique workflow.

👥 Ideal for solo developers, teams, and cross-company projects

Learn more

AWS GenAI LIVE!

GenAI LIVE! is a dynamic live-streamed show exploring how AWS and our partners are helping organizations unlock real value with generative AI.

Tune in to the full event

DEV is partnering to bring live events to the community. Join us or dismiss this billboard if you're not interested. ❤️