【Java】Java11でのWebSocketクライアント
Java11で利用できるjava.net.httpパッケージにWebSocketサーバーと通信できる機能が追加されたようなので今回はApache Tomcatを利用して本当にサーバーとWebSocket通信ができるのか試していきましょう。
使用するクラス群
HttpClient
WebSocketオブジェクトを作成するために使用するクラスです。
newWebSocketBuilderメソッドでWebSocketリクエスト用のオブジェクトを作成することができるWebSocket.Builderを作成できます。
WebSocket.Builder
WebSocketの設定を行いWebSocketオブジェクトを作成します。
buildAsyncメソッドで特定のURLにWebSocket接続要求を行います。
WebSocket
WebSocketのデータ送信、受信に関する処理を行います。
sendTextメソッドで文字列の送信処理を実行できます。
requestメソッドで受信データ数を増やせます。このメソッドで増分しておかないと、サーバからのデータを受信できません。
sendCloseメソッドで接続を閉じることができます。
WebSocket.Listener
WebSocketの接続イベント、受信イベントを取得するリスナです。
onOpenメソッドをオーバーライドして接続イベント、onTextメソッドをオーバーライドすると文字列受信イベントを処理できます。
WebSocket利用サンプル
ApacheTomcatサーバをWebSocketが使える状態で用意して試しに接続、メッセージ送信、切断をしてみます。
import java.net.URI; import java.net.http.HttpClient; import java.net.http.WebSocket; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.concurrent.ExecutionException; public class TestWSClient { public static void main(String[] args) throws InterruptedException, ExecutionException { HttpClient client = HttpClient.newHttpClient(); WebSocket.Builder wsb = client.newWebSocketBuilder(); //WebSocketイベント WebSocket.Listener listener = new WebSocket.Listener() { @Override public void onOpen(WebSocket webSocket){ System.out.println("接続しました。"); //2回分のメッセージ受信を許容する webSocket.request(2); } @Override public CompletionStage<?> onText(WebSocket webSocket, CharSequence data, boolean last) { System.out.println("接続しました。"); System.out.println(data); return null; } }; //接続開始 CompletableFuture<WebSocket> comp = wsb.buildAsync(URI.create("ws://127.0.0.1:8080/TestServer2/ws"), listener); //接続完了 WebSocket ws = comp.get(); //文字列送信 ws.sendText("Hello World!!", true); Thread.sleep(1000); //切断 CompletableFuture<WebSocket> end = ws.sendClose(WebSocket.NORMAL_CLOSURE, "なんとなく"); //切断完了 end.get(); } }
サーバー側のWebSocketクラスは下記の通りです。
このテストサーバーはeclipseのプロジェクトごとgitにアップロードしてます。
import java.io.IOException; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; @ServerEndpoint("/ws") public class WebSocket { Session sess; //接続確率 @OnOpen public void onOpen(Session session) { /* セッション確立時の処理 */ System.out.println("WebSocketセッション確立"); sess = session; } //受信メッセージ @OnMessage public void onMessage(String message) { /* メッセージ受信時の処理 */ System.out.println("WebSocket受信:" + message); try { //クライアントからメッセージを受け取ったら三回送信する sess.getBasicRemote().sendText("OK"); sess.getBasicRemote().sendText("OK2"); sess.getBasicRemote().sendText("OK3"); } catch (IOException e) { e.printStackTrace(); } } //エラー時 @OnError public void onError(Throwable th) { /* エラー発生時の処理 */ System.out.println("WebSocketエラー:" + th.getMessage()); } //切断時 @OnClose public void onClose(Session session) { /* セッション解放時の処理 */ System.out.println("WebSocketセッション終了"); } }
接続しました。
接続しました。
OK
接続しました。
OK2
WebSocketセッション確立
WebSocket受信:Hello World!!
WebSocketセッション終了
サーバーから3回メッセージを送信してますが、requestメソッドで2を指定しているので、2回しか受信していませんね。
いちいちrequestメソッドを実行するのは面倒だな・・・
ディスカッション
コメント一覧
まだ、コメントがありません