先ほどの続き
接続処理
- 画面の開始ボタンから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