【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メソッドを実行するのは面倒だな・・・






ディスカッション
コメント一覧
まだ、コメントがありません