0

MainJava FX シーンとステージを定義するクラスと、MainControllerデータベース接続を作成して を起動するクラスがありますPortListener。3 つの異なる部分 ( ViewsDB 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関数を に作成したので、着信メッセージがあるとで関数を呼び出すことができます。にはデータベース接続とポート番号などの変数があり、実質的にすべてが集まるクラスです。portListenerportNumbermainControllerportlistenerMainControllerMainController

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 時間) 試すよりも、何が足りないのかを尋ねたいと思います。

4

0 に答える 0