Gerçek Zamanlı Sohbet Uygulaması
İleti yayınlama ve özel mesajlaşma işlevlerini gösteren basit bir gerçek zamanlı sohbet uygulaması oluşturun.
Gerçek Zamanlı Sohbet Uygulaması, CoddyKit'te ücretsiz bir Node.js Backend Development Bootcamp dersidir. Bu, 6 dersinin 6. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Node.js Backend Development Bootcamp öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Node.js Backend Development Bootcamp kursu toplamda 6 dersten oluşur.
Bu dersin bazı bölümleri henüz çevrilmemiş olup İngilizce olarak gösterilmektedir.
What Makes a Chat App Real-time?
Real-time chat applications allow users to send and receive messages instantly, without refreshing their browser.
This is made possible by WebSockets, which provide a persistent, bidirectional communication channel between the client and server.
In this lesson, we'll build a simple chat app with NestJS, demonstrating message broadcasting and private messaging.
Setting Up Our Chat Gateway
In NestJS, a Gateway is a class annotated with @WebSocketGateway() that handles WebSocket connections and messages.
It acts as the entry point for real-time communication. We'll specify a port for our WebSocket server.
import { WebSocketGateway, WebSocketServer } from '@nestjs/websockets';
import { Server } from 'socket.io';
@WebSocketGateway(3001, { cors: true }) // Port 3001, enable CORS
export class ChatGateway {
@WebSocketServer() server: Server; // socket.io server instance
// More logic will go here
}Managing Client Connections
Our gateway needs to know when clients connect and disconnect. We implement OnGatewayConnection and OnGatewayDisconnect interfaces.
This allows us to run logic when a new user joins or leaves the chat.
import {
WebSocketGateway, WebSocketServer,
OnGatewayConnection, OnGatewayDisconnect
} from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';
@WebSocketGateway(3001, { cors: true })
export class ChatGateway implements OnGatewayConnection, OnGatewayDisconnect {
@WebSocketServer() server: Server;
handleConnection(client: Socket, ...args: any[]) {
console.log(`Client connected: ${client.id}`);
// You might add client to a list here
}
handleDisconnect(client: Socket) {
console.log(`Client disconnected: ${client.id}`);
// Remove client from any lists
}
}Sending Messages to Everyone
To broadcast a message, we listen for an event (e.g., 'sendMessage') from a client. When received, we use this.server.emit() to send it to ALL connected clients.
The @SubscribeMessage() decorator maps incoming WebSocket messages to handler methods.
import {
WebSocketGateway, WebSocketServer,
OnGatewayConnection, OnGatewayDisconnect,
SubscribeMessage, MessageBody
} from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';
@WebSocketGateway(3001, { cors: true })
export class ChatGateway implements OnGatewayConnection, OnGatewayDisconnect {
@WebSocketServer() server: Server;
handleConnection(client: Socket) { /* ... */ }
handleDisconnect(client: Socket) { /* ... */ }
@SubscribeMessage('sendMessage')
handleMessage(@MessageBody() data: { message: string, senderId: string }): void {
console.log(`Message from ${data.senderId}: ${data.message}`);
this.server.emit('receiveMessage', data); // Broadcast to all
}
}Client-side: Basic Chat Interaction
On the client, we use a library like socket.io-client to connect to our NestJS gateway.
We can then emit messages and on events to receive broadcasts.
// index.html (conceptual client-side script)
const socket = io('http://localhost:3001');
socket.on('connect', () => {
console.log('Connected to chat server!');
socket.emit('sendMessage', {
message: 'Hello everyone!',
senderId: 'user123'
});
});
socket.on('receiveMessage', (data) => {
console.log(`New message: ${data.message} from ${data.senderId}`);
// Update chat UI
});Targeting Specific Users (Private Chat)
Broadcasting is great for general announcements, but what about private conversations between two users?
For private messages, we need a way to identify individual clients and send messages only to them, or to a specific group (a 'room').
Identifying Individual Clients
To send private messages, we need to map a user's unique ID (e.g., from their login) to their specific WebSocket connection ID (client.id).
We can store this mapping in a simple object or Map within our gateway.
import {
WebSocketGateway, WebSocketServer,
OnGatewayConnection, OnGatewayDisconnect,
ConnectedSocket
} from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';
@WebSocketGateway(3001, { cors: true })
export class ChatGateway implements OnGatewayConnection, OnGatewayDisconnect {
@WebSocketServer() server: Server;
private connectedUsers: Map<string, string> = new Map(); // userId -> socketId
handleConnection(@ConnectedSocket() client: Socket) {
const userId = client.handshake.query.userId as string; // Get user ID from query
if (userId) {
this.connectedUsers.set(userId, client.id);
console.log(`User ${userId} connected with socket ID: ${client.id}`);
} else {
console.log(`Client connected without userId: ${client.id}`);
}
}
handleDisconnect(@ConnectedSocket() client: Socket) {
const userId = [...this.connectedUsers.entries()]
.find(([key, val]) => val === client.id)?.[0];
if (userId) {
this.connectedUsers.delete(userId);
console.log(`User ${userId} disconnected.`);
} else {
console.log(`Client disconnected: ${client.id}`);
}
}
// ... handleMessage for broadcasting ...
}Sending Direct Messages to a User
With our user-to-socket mapping, we can now send messages directly to a target user's socket.
We listen for a 'privateMessage' event, look up the recipient's socket ID, and use this.server.to(socketId).emit().
import {
WebSocketGateway, WebSocketServer,
OnGatewayConnection, OnGatewayDisconnect,
SubscribeMessage, MessageBody
} from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';
@WebSocketGateway(3001, { cors: true })
export class ChatGateway implements OnGatewayConnection, OnGatewayDisconnect {
@WebSocketServer() server: Server;
private connectedUsers: Map<string, string> = new Map(); // userId -> socketId
handleConnection(client: Socket) { /* ... */ }
handleDisconnect(client: Socket) { /* ... */ }
@SubscribeMessage('sendMessage')
handleMessage(data: { message: string, senderId: string }): void { /* ... */ }
@SubscribeMessage('privateMessage')
handlePrivateMessage(
@MessageBody() data: { recipientId: string, message: string, senderId: string }
): void {
const recipientSocketId = this.connectedUsers.get(data.recipientId);
if (recipientSocketId) {
this.server.to(recipientSocketId).emit('receivePrivateMessage', {
message: data.message,
senderId: data.senderId
});
console.log(`Private message from ${data.senderId} to ${data.recipientId}`);
} else {
console.log(`Recipient ${data.recipientId} not found or offline.`);
}
}
}Using Rooms for Group Chats
For group chats, or even 1-on-1 chats, Socket.IO rooms are a powerful feature. Clients can 'join' a room, and you can then broadcast messages to that specific room.
client.join('roomName'): Adds a client to a room.this.server.to('roomName').emit(): Sends a message to all clients in that room.
This simplifies managing message distribution for multiple participants.
Distinguishing Message Types
Consider a NestJS chat application. A user sends a message. You want to ensure only a specific group of 5 users (who are all online) receives this message, not everyone connected.
Real-time Chat: Broadcast & Private
In this lesson, you learned to build a basic real-time chat application using NestJS WebSockets.
- We set up a Gateway to handle connections.
- Implemented broadcasting messages to all connected clients.
- Explored private messaging by mapping user IDs to socket IDs.
- Briefly touched on using Socket.IO rooms for efficient group communication.
These concepts are fundamental for creating interactive, real-time features in your applications!
Sıkça Sorulan Sorular
“Gerçek Zamanlı Sohbet Uygulaması” dersi ücretsiz mi?
Evet — “Gerçek Zamanlı Sohbet Uygulaması” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Node.js Backend Development Bootcamp kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Node.js Backend Development Bootcamp kursu toplamda 6 dersten oluşur.
“Gerçek Zamanlı Sohbet Uygulaması” dersinde ne öğreneceğim?
İleti yayınlama ve özel mesajlaşma işlevlerini gösteren basit bir gerçek zamanlı sohbet uygulaması oluşturun. Node.js Backend Development Bootcamp ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Node.js Backend Development Bootcamp öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Node.js Backend Development Bootcamp, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 6 dersinin 6. dersidir.
“Gerçek Zamanlı Sohbet Uygulaması” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Node.js Backend Development Bootcamp dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Node.js Backend Development Bootcamp dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- WebSockets'e Giriş
- NestJS ile WebSockets
- Node.js'te Socket.IO Uygulama
- Ağ Geçidi Yapılandırması
- Gerçek Zamanlı Sohbet Uygulaması Geliştirme
- Gerçek Zamanlı Sohbet Uygulaması