はじめに
今回は、JavaによるWebSocketクライアントの実装方法を解説します。
今回のサンプルでは、WebSocketクライアントを作成し、動作確認のためサーバ側の処理(Java)も実装します。
最終的にはサーバ側でクライアントから送信したメッセージが受け取れることを確認します。
以降、以下のバージョン、環境での解説となります。
IDE:eclipse
Tomcatバージョン:8.5
Javaバージョン:8
Contents
フォルダ構成
今回作成するサンプルソースのフォルダ構成は以下の通りです。
プロジェクトの作成
1. WebSocketクライアントのプロジェクト作成
パッケージエクスプローラーで右クリック>新規>Javaプロジェクトを選択し、「SampleClient」というプロジェクトを作成します。
2. サーバのプロジェクト作成
パッケージエクスプローラーで右クリック>新規>その他>Web>動的Javaプロジェクトを選択し、「SampleServer」というプロジェクトを作成します。
WebSocketクライアントのライブラリダウンロード
WebSocketクライアントを実装するには外部からライブラリをダウンロードする必要があります。
まずは、以下のサイトへアクセスしてください。
赤枠部分をクリックしてください。
赤枠のダウンロードリンクをクリックします。
ページ下部にある赤枠部分をクリックします。
ダウンロードボタンをクリックします。
すると、「tyrus-standalone-client-1.12.jar」というファイルがダウンロードされると思いますので、そのファイルを以下へコピーします。
workspace/SampleClient/lib
次に、SampleClientを右クリック>プロパティ>Javaのビルド・パス>ライブラリタブを選択し、JARの追加ボタンを押下します。
さきほどコピーしたjarファイルを選択し、OKボタンを押します。
Javaのビルド・パス画面のライブラリーに選択したjarファイルが表示されていれば、適用して閉じるボタンを押します。
WebSocketクライアントの実装
WebSocketClient.javaを作成し、まず必要なライブラリをインポートします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package main.java; // 今回追加する部分 import java.net.URI; import javax.websocket.ClientEndpoint; import javax.websocket.ContainerProvider; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.WebSocketContainer; public class WebSocketClient { (省略) |
Websocketのセッション確立やメッセージ送受信など、Websocketクライアントとしてのライフサイクルを回すために必要なClientEndpointというアノテーションをクラスの先頭につけます。
また、super()メソッドを使用し、ClientEndpointのコンストラクタを呼び出します。
1 2 3 4 5 6 7 8 9 |
(省略) @ClientEndpoint //今回追加する部分 public class WebSocketClient { // 今回追加する部分 public WebSocketClient() { super(); } (省略) |
続いてアノテーションを利用して、以下の処理を実装します。
– セッション確立時の処理
– メッセージ受信時の処理
– エラー発生時の処理
– セッション解放時の処理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
(省略) @ClientEndpoint public class WebSocketClient { public WebSocketClient() { super(); } //今回追加する部分 @OnOpen public void onOpen(Session session) { /* セッション確立時の処理 */ System.out.println("WebSocketセッション確立"); } //今回追加する部分 @OnMessage public void onMessage(String message) { /* メッセージ受信時の処理 */ System.out.println("WebSocket受信:"); } //今回追加する部分 @OnError public void onError(Throwable th) { /* エラー発生時の処理 */ System.out.println("WebSocketエラー:" + th.getMessage()); } //今回追加する部分 @OnClose public void onClose(Session session) { /* セッション解放時の処理 */ System.out.println("WebSocketセッション確立"); } (省略) |
最後に、WebSocketを起動するためのメインメソッドをコーディングします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
(省略) @ClientEndpoint public class WebSocketClient { public WebSocketClient() { super(); } // 途中省略 //今回追加する部分 public static void main(String[] args) throws Exception { // 初期化のためWebSocketコンテナのオブジェクトを取得する WebSocketContainer container = ContainerProvider.getWebSocketContainer(); // サーバー・エンドポイントのURI URI uri = URI.create("ws://localhost:8080/SampleServer/WebSocketServer"); // サーバー・エンドポイントとのセッションを確立する Session session = container.connectToServer(new WebSocketClient(),uri); // メッセージをサーバへ送る session.getBasicRemote().sendText("Hello World!!"); } } (省略) |
これでWebSocketクライアントは完成です。
最後にコード全体をのせておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
package main.java; import java.net.URI; import javax.websocket.ClientEndpoint; import javax.websocket.ContainerProvider; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.WebSocketContainer; @ClientEndpoint public class WebSocketClient { public WebSocketClient() { super(); } @OnOpen public void onOpen(Session session) { /* セッション確立時の処理 */ System.out.println("WebSocketセッション確立"); } @OnMessage public void onMessage(String message) { /* メッセージ受信時の処理 */ System.out.println("WebSocket受信:"); } @OnError public void onError(Throwable th) { /* エラー発生時の処理 */ System.out.println("WebSocketエラー:" + th.getMessage()); } @OnClose public void onClose(Session session) { /* セッション解放時の処理 */ System.out.println("WebSocketセッション確立"); } public static void main(String[] args) throws Exception { // 初期化のためWebSocketコンテナのオブジェクトを取得する WebSocketContainer container = ContainerProvider.getWebSocketContainer(); // サーバー・エンドポイントのURI URI uri = URI.create("ws://localhost:8080/SampleServer/WebSocketServer"); // サーバー・エンドポイントとのセッションを確立する Session session = container.connectToServer(new WebSocketClient(),uri); // メッセージをサーバへ送る session.getBasicRemote().sendText("Hello World!!"); } } |
サーバ側の処理
動作確認のため、サーバ側の処理を実装します。
WebSocketでサーバ側がデータを受け取る場合は、@ServerEndpointというアノテーションとエンドポイントを指定し、クライアント側がアクセスできるようにしてやる必要があります。
また、データを受け取れるようクライアントと同様に@OnMessageをアノテーションにし、メッセージを受信したら、「メッセージを受信しました。:[message]」とコンソールに出力されるようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package main.java; import javax.websocket.OnMessage; import javax.websocket.server.ServerEndpoint; @ServerEndpoint("/WebSocketServer") public class WebSocketServer { @OnMessage public String echo(String message) { System.out.println("メッセージを受信しました。:" + message); return message; } } |
サーバ側の処理は以上です。
動作確認
1. サーバの起動
WebSocketServer.javaを右クリック>実行>サーバで実行をクリックし、
サーバを起ち上げます。
2. クライアントの起動
WebSocketClient.javaを右クリック>実行>Javaアプリケーションをクリックし、
クライアントを起動します。
3. 結果確認
最後に、コンソールにクライアントから投げた「Hello World!!」というメッセージが
サーバ側のコンソールに出力されていればOKです。
1 |
メッセージを受信しました。:Hello World!! |
Javaエンジニアとしてよりスキルアップ
ここからはJavaエンジニアとしてよりスキルアップしたい方向けのおすすめ記事紹介となります。
JavaフレームワークのデファクトスタンダードであるSpringフレームワーク習得したいけど、何から手をつけたらよいかわからないという方。
以下の記事をお読みください。
また、無料で基礎からJavaを学びなおしたいという方は以下の記事を参考にしていただければと思います。
さいごまで読んでいただき、ありがとうございました。
知り合いから
「フリーランスエンジニアになれば、年収800万円以上の高報酬でかつ、自由な働き方をチョイスできる」
というのを聞いて、フリーランスエンジニアに興味を持ったのですが、
当時SIer企業でエンジニアをやっていたボクはなかなか一歩踏みだせませんでした。
というもの以下のような不安があったからです。
■フリーランスエンジニアってかなりの技術力がないとなれないのではないのか?
■フリーランスエンジニアって不安定なのではないのか?
■フリーランスエンジニアって人脈やコネ、営業力が必要なのではないのか?
しかし、実際にフリーランスエンジニアになってみて気づきました。
これらはすべて間違いです。
過去のボクのようにフリーランスエンジニアに興味あるけど一歩踏み出せないという方向けに
『フリーランスエンジニア転職完全ロードマップ』
という記事を書きました。
この記事読めば、どうすればフリーランスになれるのかが分かりますので、ぜひ一読ください。