0Pricing
WebSockets & Realtime Systems Programming · Ders

Canlı Sohbet ve Oyun Sunucuları

Yüksek performanslı canlı sohbet platformları ve çok oyunculu oyun arka uçları oluşturmanın zorluklarını ve çözümlerini keşfedin.

Canlı Sohbet ve Oyun Sunucuları, CoddyKit'te ücretsiz bir WebSockets & Realtime Systems Programming dersidir. Bu, 4 dersinin 2. 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, WebSockets & Realtime Systems Programming öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. WebSockets & Realtime Systems Programming kursu toplamda 4 dersten oluşur.

Bu dersin bazı bölümleri henüz çevrilmemiş olup İngilizce olarak gösterilmektedir.

Realtime Demands of Chat & Games

Live chat applications and multiplayer games are the epitome of realtime communication. They demand instant updates, low latency, and efficient data exchange between many users.

Traditional HTTP, with its request-response model, simply isn't suited for this constant, bidirectional flow of information. This is where WebSockets truly shine.

Tackling Latency & Throughput

One of the biggest challenges is ensuring low latency, meaning messages and game actions arrive almost instantly. High throughput is also crucial to handle many messages per second.

  • Chat: Messages must appear immediately.
  • Games: Player movements, attacks, and scores need to sync without noticeable delay.

WebSockets provide a persistent connection, minimizing overhead compared to repeated HTTP requests, which helps achieve these goals.

Managing Dynamic State

In both chat and games, the server needs to manage dynamic state. This includes:

  • Which users are online.
  • Who is in which chat room or game session.
  • Player positions, health, and scores in a game.
  • Recent chat history.

This state often resides in memory for speed but might be persisted to a database for recovery or long-term history.

Structuring with Rooms & Channels

To manage communication for many users, we often use rooms or channels. Instead of sending every message to every user, messages are routed to specific groups.

  • A chat room for a specific topic.
  • A game lobby or an active game instance.

This approach significantly reduces network traffic and server load by sending data only where it's needed.

Server: Joining a Chat Room

This Node.js example sets up a WebSocket server. Clients can send a joinRoom message to become part of a specific chat room. The server uses a Map to keep track of active rooms and their connected clients.

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

const rooms = new Map(); // Map: roomName -> Set<WebSocket>

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

  ws.on('message', message => {
    const msg = JSON.parse(message);
    if (msg.type === 'joinRoom') {
      const roomName = msg.room;
      if (!rooms.has(roomName)) {
        rooms.set(roomName, new Set());
      }
      rooms.get(roomName).add(ws);
      ws.currentRoom = roomName; // Store room on connection
      ws.send(`You joined: ${roomName}`);
      console.log(`Client joined room '${roomName}'`);
    }
  });

  ws.on('close', () => {
    if (ws.currentRoom) {
      rooms.get(ws.currentRoom).delete(ws);
      if (rooms.get(ws.currentRoom).size === 0) {
        rooms.delete(ws.currentRoom);
      }
    }
    console.log('Client disconnected.');
  });

  ws.send('Send {\"type\": \"joinRoom\", \"room\": \"lobby\"}');
});

console.log('WebSocket server running on port 8080.');

Broadcasting & Targeted Delivery

Once clients are in rooms, the server needs to efficiently send messages:

  • Broadcast: To all clients in a specific room (e.g., a public chat message).
  • Unicast: To a single, specific client (e.g., a private message or a game command for one player).

This targeted delivery is key to keeping the application responsive and preventing unnecessary data transfer.

Server: Broadcasting Chat Messages

Building on the room concept, this code shows how the server can receive a chat message and broadcast it to all other clients in the same room. Notice how it iterates through the Set of clients for the current room.

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

const rooms = new Map(); // Map: roomName -> Set<WebSocket>

wss.on('connection', ws => {
  ws.on('message', message => {
    const msg = JSON.parse(message);
    if (msg.type === 'joinRoom') {
      const roomName = msg.room;
      if (!rooms.has(roomName)) {
        rooms.set(roomName, new Set());
      }
      rooms.get(roomName).add(ws);
      ws.currentRoom = roomName;
      ws.send(`You joined: ${roomName}`);
    } else if (msg.type === 'chat' && ws.currentRoom) {
      const roomClients = rooms.get(ws.currentRoom);
      roomClients.forEach(client => {
        if (client.readyState === WebSocket.OPEN) {
          client.send(`[${ws.currentRoom}] User says: ${msg.text}`);
        }
      });
    }
  });

  ws.on('close', () => {
    if (ws.currentRoom) {
      rooms.get(ws.currentRoom).delete(ws);
      if (rooms.get(ws.currentRoom).size === 0) {
        rooms.delete(ws.currentRoom);
      }
    }
  });

  ws.send('Send {\"type\": \"joinRoom\", \"room\": \"lobby\"} then {\"type\": \"chat\", \"text\": \"Hello!\"}');
});

console.log('WebSocket server running on port 8080.');

Client UI & Responsiveness

On the client-side (e.g., in a web browser), JavaScript uses the native WebSocket API to connect and handle messages. The UI is updated dynamically without page reloads.

This example shows a basic HTML structure and JavaScript to connect, join a room, and display incoming messages.

<!DOCTYPE html>
<html>
<head>
  <title>Chat Client</title>
</head>
<body>
  <div id="messages" style="border: 1px solid #ccc; height: 150px; overflow-y: scroll; padding: 5px;"></div>
  <input type="text" id="chatInput" placeholder="Type your message...">
  <button onclick="sendMessage()">Send</button>

  <script>
    const ws = new WebSocket('ws://localhost:8080');
    const messagesDiv = document.getElementById('messages');
    const chatInput = document.getElementById('chatInput');

    ws.onopen = () => {
      messagesDiv.innerHTML += '<p><em>Connected!</em></p>';
      ws.send(JSON.stringify({ type: 'joinRoom', room: 'lobby' }));
    };

    ws.onmessage = event => {
      messagesDiv.innerHTML += `<p>${event.data}</p>`;
      messagesDiv.scrollTop = messagesDiv.scrollHeight; // Auto-scroll
    };

    function sendMessage() {
      const text = chatInput.value;
      if (text.trim() !== '') {
        ws.send(JSON.stringify({ type: 'chat', text: text }));
        chatInput.value = '';
      }
    }
  </script>
</body>
</html>

Game State Synchronization

For multiplayer games, game state synchronization is critical. This involves more than just chat messages; it's about continuously updating player positions, health, scores, and game events across all connected clients.

  • Server as Authority: The server often acts as the single source of truth for the game state.
  • Game Loop: A server-side game loop frequently calculates and broadcasts state changes to clients.

Techniques like interpolation and extrapolation on the client help smooth out visual updates despite network latency.

Key Realtime Challenges

Consider the typical requirements for building a robust live chat or multiplayer game server using WebSockets. Which of the following present significant challenges?

Recap: Building Realtime Apps

In this lesson, we explored the unique challenges of building live chat and multiplayer game servers with WebSockets. We learned:

  • The critical need for low latency and high throughput.
  • Strategies for managing dynamic state for users, rooms, and game entities.
  • The importance of room-based messaging for efficient communication.
  • How servers handle joining rooms, broadcasting messages, and how clients update their UI.
  • The concept of game state synchronization for interactive experiences.

These principles form the foundation for creating engaging and responsive realtime applications.

Sıkça Sorulan Sorular

“Canlı Sohbet ve Oyun Sunucuları” dersi ücretsiz mi?

Evet — “Canlı Sohbet ve Oyun Sunucuları” 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 WebSockets & Realtime Systems Programming kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. WebSockets & Realtime Systems Programming kursu toplamda 4 dersten oluşur.

“Canlı Sohbet ve Oyun Sunucuları” dersinde ne öğreneceğim?

Yüksek performanslı canlı sohbet platformları ve çok oyunculu oyun arka uçları oluşturmanın zorluklarını ve çözümlerini keşfedin. WebSockets & Realtime Systems Programming 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.

WebSockets & Realtime Systems Programming öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te WebSockets & Realtime Systems Programming, 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, 4 dersinin 2. dersidir.

“Canlı Sohbet ve Oyun Sunucuları” 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 WebSockets & Realtime Systems Programming dersinde kod yazıp çalıştırabilir miyim?

Evet. Her WebSockets & Realtime Systems Programming 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

  1. İş Birlikçi Düzenleyiciler ve Beyaz Tahtalar
  2. Canlı Sohbet ve Oyun Sunucuları
  3. Gerçek Zamanlı Veri Panoları
  4. Gerçek Zamanlı Konum İzleme Sistemi Oluşturma
← WebSockets & Realtime Systems Programming Sayfasına Dön