WebSockets & Real-Time Systems with Spring · レッスン

STOMPによるプライベートメッセージング

STOMPのユーザー宛先を使用して、ユーザー同士が1対1で直接プライベートメッセージを送受信する機能を実装します。

レッスン 3/411 ステップ

「STOMPによるプライベートメッセージング」はCoddyKit上の無料WebSockets & Real-Time Systems with Springレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはWebSockets & Real-Time Systems with Spring学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 WebSockets & Real-Time Systems with Springコースには全4レッスンが含まれています。

このレッスンの一部はまだ翻訳されておらず、英語で表示されています。

Private Chat Essentials

Welcome! In this lesson, we'll learn how to build private messaging functionality into our chat application using WebSockets and STOMP.

Unlike public chat rooms where everyone receives messages, private messages (like direct messages or DMs) are sent specifically from one user to another. This requires a way to route messages directly to an individual's unique session.

STOMP User Destinations

STOMP provides a special destination prefix: /user. When a client subscribes to a destination like /user/queue/private-messages, the STOMP broker (and Spring) automatically translate this into a unique, session-specific queue for that particular authenticated user.

  • /user prefix: Indicates a user-specific destination.
  • Unique per user: Each user gets their own 'inbox' for private messages.
  • Abstracted routing: You don't need to know the actual session ID.

Spring & User Routes

Spring's WebSocket and STOMP integration works hand-in-hand with the /user prefix. When you configure your message broker, you tell Spring to enable user destinations:

config.setUserDestinationPrefix("/user");

This setting ensures that messages addressed to /user/{username}/queue/{destination} are correctly routed by Spring to the WebSocket session(s) associated with {username}.

Server-Side: Sending Private Messages

On the server, Spring provides the SimpMessagingTemplate. This powerful tool allows you to send messages to various STOMP destinations, including user-specific ones.

The key method for private messaging is convertAndSendToUser(). It takes three main arguments:

  1. username: The identifier of the recipient user.
  2. destination: The specific queue within that user's private space (e.g., /queue/private-messages).
  3. payload: The actual message content.

Server Private Send Demo

Try running this simplified Spring Boot application. It shows a controller method that sends a private message using SimpMessagingTemplate. Remember, in a real app, the recipient's username would come from the client's message payload or other context.

package com.coddykit;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.stereotype.Controller;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
import java.security.Principal;

@SpringBootApplication
@EnableWebSocketMessageBroker
public class PrivateChatApp {

    public static void main(String[] args) {
        SpringApplication.run(PrivateChatApp.class, args);
    }

    @Configuration
    static class WsConfig implements WebSocketMessageBrokerConfigurer {
        @Override
        public void configureMessageBroker(MessageBrokerRegistry cfg) {
            cfg.enableSimpleBroker("/topic", "/queue");
            cfg.setApplicationDestinationPrefixes("/app");
            cfg.setUserDestinationPrefix("/user"); // Crucial for private messages
        }
        @Override
        public void registerStompEndpoints(StompEndpointRegistry reg) {
            reg.addEndpoint("/ws").withSockJS();
        }
    }

    @Controller
    static class PrivateMsgController {
        private final SimpMessagingTemplate template;

        public PrivateMsgController(SimpMessagingTemplate t) {
            this.template = t;
        }

        @MessageMapping("/sendPrivate") // Client sends to /app/sendPrivate
        public void sendPrivateMsg(String msg, Principal p) {
            String sender = p != null ? p.getName() : "anon";
            String recipient = "targetUser"; // In real app, from msg payload

            // Send to a specific user's private queue
            template.convertAndSendToUser(
                recipient,
                "/queue/private-messages", // Client subscribes here
                "From " + sender + ": " + msg
            );
            System.out.println("Sent private msg to " + recipient + " from " + sender);
        }
    }
}

Client's Private Inbox

On the client side, a user needs to subscribe to their own private destination to receive messages. If a user's principal name is 'alice', they would subscribe to:

/user/queue/private-messages

Spring automatically maps this to /queue/private-messages-user{sessionId} internally, ensuring only 'alice' receives messages sent to her.

Client-Side Subscription

Using a STOMP client library (like Stomp.js), the subscription process is straightforward:

stompClient.subscribe('/user/queue/private-messages', function(message) {
    // Handle the private message
    console.log("Received private message: " + message.body);
});

This ensures that any message sent to the currently authenticated user's /queue/private-messages destination will be received by this client.

Private Message Model

For robust private chat, your message payload should contain structured data. A typical private message model might include:

  • senderId: The ID of the user who sent the message.
  • recipientId: The ID of the user intended to receive the message.
  • content: The actual text or data of the message.
  • timestamp: When the message was sent.

This allows clients to display messages correctly, identifying who sent what to whom.

User Identity & STOMP

How does Spring know which user is 'alice' for the /user destination? It relies on the Principal object, which is usually populated by Spring Security or another authentication mechanism.

When a WebSocket connection is established, Spring associates a Principal with that session. The convertAndSendToUser() method uses the getName() of this Principal to identify the target user.

Private Message Quiz

You've learned how Spring and STOMP handle private messages. Let's test your understanding of sending them.

Private Chat Summary

Great job! You've learned the fundamentals of implementing private messaging with STOMP and Spring.

  • The /user destination prefix routes messages to individual users.
  • Spring's SimpMessagingTemplate.convertAndSendToUser() sends messages to specific user destinations.
  • Clients subscribe to /user/queue/{your-private-destination} to receive their DMs.
  • User identity (Principal) is crucial for correct routing.

This knowledge allows you to build sophisticated, personalized real-time interactions in your applications!

無料で開始

AI チューターと学ぶ WebSockets & Real-Time Systems with Spring — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
12
レッスン
48

よくある質問

「STOMPによるプライベートメッセージング」レッスンは無料ですか?

はい。「STOMPによるプライベートメッセージング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、WebSockets & Real-Time Systems with Springコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 WebSockets & Real-Time Systems with Springコースには全4レッスンが含まれています。

「STOMPによるプライベートメッセージング」で何を学びますか?

STOMPのユーザー宛先を使用して、ユーザー同士が1対1で直接プライベートメッセージを送受信する機能を実装します。 ブラウザで直接実行するハンズオンコードでWebSockets & Real-Time Systems with Springを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

WebSockets & Real-Time Systems with Springを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのWebSockets & Real-Time Systems with Springは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「STOMPによるプライベートメッセージング」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このWebSockets & Real-Time Systems with Springレッスンでコードを書いて実行できますか?

はい。すべてのWebSockets & Real-Time Systems with Springレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. チャットメッセージモデルの設計
  2. パブリックチャットルームの実装
  3. STOMPによるプライベートメッセージング
  4. 入力中インジケーターとオンラインプレゼンス
← WebSockets & Real-Time Systems with Springに戻る