Main
Java FX シーンとステージを定義するクラスと、MainController
データベース接続を作成して を起動するクラスがありますPortListener
。3 つの異なる部分 ( Views
、DB connection
および Port Listener`) は、個別にテストするとすべて機能しますが、プログラムを完全に機能させるために部分のコメントを外すと、機能しません。
public class Main extends Application {
MainController mainController;
@Override
public void start(Stage primaryStage) {
BorderPane root = new BorderPane();
Scene scene = new Scene(root, 1100, 690);
root.setTop(setupMenuBar());
root.setCenter(setupCenter());
root.setBottom(setupStatusBar());
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
primaryStage.setScene(scene);
mainController = new MainController();
mainController.initController(primaryStage);
primaryStage.show();
}
問題はprimaryStage.show();
、メインプログラムに到達できないことportlistener
です。これは、受信メッセージをただ座って待機しているため、実行中のスレッドが 1 つしかないように思われるためです。(Javaはデフォルトでマルチスレッドだと思っていました)
はportlistener
受信メッセージを待機する必要がありますが、Main
プログラムの機能をブロックするべきではありません。Portlistener
をimplementに変更しましたが、別のクラスで新しく作成されたスレッドのメソッドからRunnable
ランナブルのメソッドを呼び出す必要があることをどこかで読みました。run()
start()
ここで問題が発生しました。リッスンする とインスタンスの 2 つのパラメーターを持つstartListening
関数を に作成したので、着信メッセージがあるとで関数を呼び出すことができます。にはデータベース接続とポート番号などの変数があり、実質的にすべてが集まるクラスです。portListener
portNumber
mainController
portlistener
MainController
MainController
PortListener
:_
public class PortListener implements Runnable {
boolean stayConnected = true;
MainController mainController;
ServerSocket serverSocket;
Socket clientSocket = null;
public void startListening(int portNumber, MainController controller) throws IOException {
mainController = controller;
try {
serverSocket = new ServerSocket(portNumber);
serverSocket.setReuseAddress(true);
}
catch (IOException e) {
System.err.println("Could not start listener on port: " + portNumber);
return;
}
while(stayConnected) {
run();
}
}
public void run() {
try {
clientSocket = serverSocket.accept();
System.out.println("Connection established");
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
// TODO: handle incoming message by calling mainController
System.out.println("Line incoming: " + inputLine);
}
in.close();
clientSocket.close();
serverSocket.close();
} catch (IOException e) {
System.err.println("Portlistener run() failed: " + e.getMessage());
}
}
public void stopListening() {
stayConnected = false;
}
}
些細なことを見逃しているだけかもしれませんが、ここには熟練したプログラマーがたくさんいるので、もう 1 時間 (または 2 時間) 試すよりも、何が足りないのかを尋ねたいと思います。