0

我有一个Main类,我在其中定义 Java FX 场景和阶段,MainController在其中创建一个数据库连接并启动一个PortListener. 3 个不同的部分(ViewsDB connectionPort 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只是坐着等待传入的消息,所以在我看来只有一个线程在运行。(我以为java默认是多线程的)

portlistener应该等待传入的消息,但它不应该阻止程序Main运行。我已将其更改Portlistener为 implementation Runnable,但我在某处读到应该从另一个类中run()新创建的线程的方法调用可运行的方法。start()

现在有一个问题,我在其中创建了一个startListening函数,portListener它有 2 个参数、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;
    }
}

我可能只是错过了一些微不足道的东西,但由于这里有很多熟练的程序员,我宁愿问我错过了什么,而不是再尝试一个小时(或两个)。

4

0 回答 0