カテゴリ: Jakarta EE 更新日: 2026/03/18

Jakarta EEでWebSocketクライアントエンドポイントを初心者向けに解説!Javaでリアルタイム通信を実装しよう

Jakarta EE WebSocketクライアントエンドポイントの実装方法
Jakarta EE WebSocketクライアントエンドポイントの実装方法

先生と生徒の会話形式で理解しよう

生徒

「先生、Jakarta EEでWebSocketを使ってリアルタイム通信をしたいんですけど、クライアント側はどう作ればいいですか?」

先生

「WebSocketクライアントエンドポイントを作ることで、サーバーと双方向のリアルタイム通信が可能になります。Javaでは@ClientEndpointアノテーションを使って簡単に作れます。」

生徒

「サーバーと同じようにクラスを作ればいいんですか?」

先生

「そうです。クラスに@ClientEndpointを付けて、メッセージ受信や接続時の処理をメソッドで実装します。」

1. Jakarta EE WebSocketクライアントとは?

1. Jakarta EE WebSocketクライアントとは?
1. Jakarta EE WebSocketクライアントとは?

Jakarta EE WebSocketクライアントは、サーバー側のWebSocketエンドポイントに接続してリアルタイム通信を行うJavaのクラスです。HTTP通信と違い、常に接続が維持され、サーバーからの通知を即座に受け取れる点が特徴です。これによりチャットアプリやリアルタイムデータ更新、ゲームなど多様な用途で活用できます。

2. WebSocketクライアントの基本構造

2. WebSocketクライアントの基本構造
2. WebSocketクライアントの基本構造

WebSocketクライアントは@ClientEndpointアノテーションを使い、接続時、メッセージ受信時、切断時に処理を定義します。基本的には以下のような構造になります。


import jakarta.websocket.ClientEndpoint;
import jakarta.websocket.OnMessage;

@ClientEndpoint
public class MyWebSocketClient {
    @OnMessage
    public void onMessage(String message) {
        System.out.println("受信メッセージ: " + message);
    }
}

上記のコードではサーバーから文字列メッセージを受信し、コンソールに表示する簡単なクライアントを作成しています。

3. サーバーへの接続方法

3. サーバーへの接続方法
3. サーバーへの接続方法

クライアントをサーバーに接続するには、ContainerProviderを使ってWebSocketContainerを取得し、connectToServerでエンドポイントを指定します。


import jakarta.websocket.ContainerProvider;
import jakarta.websocket.Session;
import jakarta.websocket.WebSocketContainer;
import java.net.URI;

public class WebSocketClientApp {
    public static void main(String[] args) throws Exception {
        WebSocketContainer container = ContainerProvider.getWebSocketContainer();
        URI uri = new URI("ws://localhost:8080/chat");
        Session session = container.connectToServer(MyWebSocketClient.class, uri);
    }
}

これで指定したWebSocketサーバーに接続が可能になります。

4. メッセージ送信の実装方法

4. メッセージ送信の実装方法
4. メッセージ送信の実装方法

クライアントからサーバーにメッセージを送る場合は、SessionオブジェクトのgetBasicRemote().sendTextを使います。


session.getBasicRemote().sendText("こんにちは、サーバー!");

送信後、サーバーは接続中の全クライアントにブロードキャストすることもできます。

5. 接続のライフサイクル管理

5. 接続のライフサイクル管理
5. 接続のライフサイクル管理

WebSocketクライアントは接続中にエラーが発生したり、サーバーが切断されることがあります。@OnOpen@OnClose@OnErrorを使ってライフサイクルイベントをハンドリングします。


import jakarta.websocket.OnOpen;
import jakarta.websocket.OnClose;
import jakarta.websocket.OnError;

@ClientEndpoint
public class MyWebSocketClient {
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("接続開始");
    }

    @OnClose
    public void onClose(Session session) {
        System.out.println("接続終了");
    }

    @OnError
    public void onError(Session session, Throwable throwable) {
        throwable.printStackTrace();
    }
}

これにより、接続状況を常に把握し、エラー発生時の対処も可能になります。

6. クライアントエンドポイントでの非同期処理

6. クライアントエンドポイントでの非同期処理
6. クライアントエンドポイントでの非同期処理

大量のメッセージを受信する場合は非同期で処理することが推奨されます。session.getAsyncRemote().sendTextを使うと送信も非同期で行えます。


session.getAsyncRemote().sendText("非同期メッセージ送信");

これによりUIスレッドをブロックせず、リアルタイム性の高い通信を維持できます。

7. クライアントとサーバー間での簡単なチャット例

7. クライアントとサーバー間での簡単なチャット例
7. クライアントとサーバー間での簡単なチャット例

サンプルとして、サーバーに接続してメッセージを送受信する簡単なチャットクライアントを作ってみます。


import java.util.Scanner;
import jakarta.websocket.Session;

public class ChatClientApp {
    public static void main(String[] args) throws Exception {
        WebSocketContainer container = ContainerProvider.getWebSocketContainer();
        Session session = container.connectToServer(MyWebSocketClient.class, new URI("ws://localhost:8080/chat"));
        Scanner scanner = new Scanner(System.in);
        while (true) {
            String input = scanner.nextLine();
            session.getAsyncRemote().sendText(input);
        }
    }
}

これでユーザーが入力したテキストをサーバーに送信し、サーバーからの返答をリアルタイムに受信できます。

8. セキュリティと接続の注意点

8. セキュリティと接続の注意点
8. セキュリティと接続の注意点

WebSocketクライアントを作成するときは、SSLを利用したwss://接続を推奨します。また、接続先URIの検証やエラーハンドリングを適切に行い、セキュリティリスクを最小化することが重要です。


URI uri = new URI("wss://secure-server:8080/chat");
Session session = container.connectToServer(MyWebSocketClient.class, uri);

これにより、安全にサーバーとクライアント間で通信が可能になります。

まとめ

まとめ
まとめ

この記事では、Jakarta EEを使ったWebSocketクライアントエンドポイントの基礎から応用までを詳しく解説しました。まず、WebSocketクライアントとは何か、HTTP通信との違いやリアルタイム通信の特徴を理解しました。HTTP通信はリクエストとレスポンスの単方向通信ですが、WebSocketクライアントはサーバーと常時接続し、双方向でリアルタイムにデータをやり取りできます。これによりチャットアプリやゲーム、リアルタイム通知など、即時性を求めるアプリケーションに最適です。

次に、@ClientEndpointアノテーションを使ったクライアントエンドポイントの基本構造を学びました。メッセージ受信には@OnMessage、接続開始には@OnOpen、接続終了には@OnClose、エラー処理には@OnErrorをそれぞれ実装することで、ライフサイクル全体を管理できます。これにより、接続状況の把握や例外処理も簡単に行えます。

サーバーへの接続方法も重要で、ContainerProviderからWebSocketContainerを取得し、connectToServerでクライアントエンドポイントを指定することで接続が可能になります。接続後は、Sessionオブジェクトを用いてメッセージの送受信が行えます。メッセージ送信は同期処理のgetBasicRemote().sendTextのほか、非同期処理のgetAsyncRemote().sendTextを利用することで、UIスレッドをブロックせず効率的に通信できます。

さらに、簡単なチャットクライアントの例を通じて、ユーザー入力をサーバーに送信し、サーバーからのメッセージをリアルタイムに受信する具体的な実装方法を確認しました。Scannerを利用してコンソール入力を取得し、非同期で送信することで、リアルタイム通信の利便性を体感できます。

最後に、セキュリティ面ではSSLを利用したwss://接続を推奨し、接続先URIの検証やエラーハンドリングを徹底することで、WebSocket通信に伴うリスクを最小化できます。これにより、安全にサーバーとクライアント間でリアルタイム通信を実現できます。

先生と生徒の振り返り会話

生徒

「先生、今回学んだWebSocketクライアントの基本は、クラスに@ClientEndpointを付けてメソッドで処理を実装するんですよね?」

先生

「そうです。@OnMessageでメッセージ受信、@OnOpenで接続開始、@OnCloseで接続終了、@OnErrorでエラー処理を行います。これによりライフサイクル全体を管理できます。」

生徒

「サーバーに接続するにはWebSocketContainerを使ってconnectToServerで指定するんですよね?」

先生

「その通りです。そして送信は同期のgetBasicRemote().sendTextや非同期のgetAsyncRemote().sendTextで行えます。非同期にすることでUIや他の処理を止めずに通信可能です。」

生徒

「なるほど、非同期なら大量のメッセージを受信しても処理がスムーズになるんですね。セキュリティ面ではSSLを使ってwss://接続にすれば安全に通信できるんですね。」

先生

「その通りです。接続先URIの検証や例外処理も組み合わせることで、安全かつ安定したリアルタイム通信を実現できます。これでチャットアプリやゲームなど、多様なリアルタイムアプリを作る準備が整いました。」

生徒

「わかりました!実際にサンプルを作りながら練習すれば、リアルタイム通信の仕組みも理解できますね。」


import jakarta.websocket.ClientEndpoint;
import jakarta.websocket.OnMessage;
import jakarta.websocket.OnOpen;
import jakarta.websocket.OnClose;
import jakarta.websocket.OnError;
import jakarta.websocket.Session;
import jakarta.websocket.ContainerProvider;
import jakarta.websocket.WebSocketContainer;
import java.net.URI;
import java.util.Scanner;

@ClientEndpoint
public class MyWebSocketClient {
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("接続開始");
    }

    @OnMessage
    public void onMessage(String message) {
        System.out.println("受信メッセージ: " + message);
    }

    @OnClose
    public void onClose(Session session) {
        System.out.println("接続終了");
    }

    @OnError
    public void onError(Session session, Throwable throwable) {
        throwable.printStackTrace();
    }
}

public class ChatClientApp {
    public static void main(String[] args) throws Exception {
        WebSocketContainer container = ContainerProvider.getWebSocketContainer();
        Session session = container.connectToServer(MyWebSocketClient.class, new URI("wss://localhost:8080/chat"));
        Scanner scanner = new Scanner(System.in);
        while (true) {
            String input = scanner.nextLine();
            session.getAsyncRemote().sendText(input);
        }
    }
}
カテゴリの一覧へ
新着記事
New1
Play Framework
Play Frameworkでセッションを削除・クリアする方法を完全ガイド!ログアウト処理も解説
New2
Jakarta EE
Jakarta EE JAX-RSとは?RESTful Web Servicesを作るための基本と役割を初心者向けに徹底解説
New3
Jakarta EE
Jakarta EE開発環境の構築手順を完全解説!初心者でも安心のステップガイド
New4
Jakarta EE
Jakarta EEとSpringの比較|どちらを選ぶべきか?初心者向けに徹底解説!
人気記事
No.1
Java&Spring記事人気No1
Jakarta EE
Jakarta EEとSpringの比較|どちらを選ぶべきか?初心者向けに徹底解説!
No.2
Java&Spring記事人気No2
Jakarta EE
Jakarta EEとJava EEの違いまとめ!初心者向けにやさしく比較解説
No.3
Java&Spring記事人気No3
Jakarta EE
Jakarta EEのリリースサイクルとバージョンの進化をやさしく解説!
No.4
Java&Spring記事人気No4
Play Framework
Play Frameworkとは?特徴と歴史を初心者向けにわかりやすく解説
No.5
Java&Spring記事人気No5
Jakarta EE
Jakarta EEとは?Java EEからの移行の歴史をやさしく解説
No.6
Java&Spring記事人気No6
Jakarta EE
Jakarta サーブレットのdoGetとdoPostの違いと使い分けを徹底解説!初心者でもわかるHTTPリクエスト処理
No.7
Java&Spring記事人気No7
Jakarta EE
Jakarta WebSocket APIの概要と利用メリットを徹底解説 リアルタイム通信を実現するJakarta EE入門
No.8
Java&Spring記事人気No8
Jakarta EE
Jakarta EEとJava EEアプリの互換性を完全解説!移行で困らないための基礎知識