先ほどの続き
接続処理
- 画面の開始ボタンからSingleController#handleStartButtonActionが呼ばれる。
- handleStartButtonAction内でClientManager#connectToServerを呼びWebSocketの起動を開始する。
- WebSocketの@OnOpenが呼ばれる。ここはJavaFXのスレッド配下ではなく、WebSocketのスレッドに移っている。そのため、JavaFXのコントロールを直接操作することはできない。
- @OnOpenの中でPlatform.runLaterを呼び、JavaFXの画面操作(接続時処理ViewObj#open)の呼び出しを登録(?)する。
- JavaFXスレッドに戻り、JavaFXの画面操作が実行される。
切断処理1
- 画面の終了ボタンからSingleController#handleStoptButtonActionが呼ばれる。
- Session#closeを呼び出し、WebSocketの終了処理を開始する。
- 切断処理2に続く
切断処理2
- 「切断処理1」または「ServerEndpointからの切断」等により、WebSocketの@OnCloseが呼ばれる。ここはJavaFXのスレッド配下ではなく、WebSocketのスレッドに移っている。そのため、JavaFXのコントロールを直接操作することはできない。
- @OnCloseの中でPlatform.runLaterを呼び、JavaFXの画面操作(接続時処理ViewObj#close)の呼び出しを登録(?)する。
- JavaFXスレッドに戻り、JavaFXの画面操作が実行される。
(コントローラーの関連する部分)
public class SingleController implements Initializable { private WSJsonSingleClient wsClient = null; private Session sess = null; // 略 @FXML private void handleStartButtonAction(ActionEvent event) { System.out.println("SingleController#handleStartButtonAction"); try { ClientManager m = org.glassfish.tyrus.client.ClientManager .createClient(); URI clientURI = new URI("ws://localhost:8080/first/hellojson/"); sess = m.connectToServer(wsClient, clientURI); } catch (DeploymentException | URISyntaxException e) { Logger.getLogger(SampleController.class.getName()).log( Level.SEVERE, null, e); } } @FXML private void handleStoptButtonAction(ActionEvent event) { System.out.println("SingleController#handleStoptButtonAction"); try { sess.close(); } catch (IOException e) { e.printStackTrace(); } } // 略 }
(ClientEndpointの関連する部分)
@ClientEndpoint( decoders = { ClientDecoder.class }, encoders = { ClientEncoder.class }) public class WSJsonSingleClient { // 略 @OnOpen public void onOpen(Session session) { System.out.println("WSJsonSingleClient#onOpen"); Platform.runLater(new Runnable() { @Override public void run() { viewObj.open(); }; }); } // 略 @OnClose public void closeConnection(Session session) { System.out.println("WSJsonSingleClient#closeConnection"); Platform.runLater(new Runnable() { @Override public void run() { viewObj.close(); }; }); } // 略 }
github:https://github.com/epea/test01/tree/WF_JSON_FX_SINGLE