我有一个Main类,我在其中定义 Java FX 场景和阶段,MainController在其中创建一个数据库连接并启动一个PortListener. 3 个不同的部分(Views和DB 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;
}
}
我可能只是错过了一些微不足道的东西,但由于这里有很多熟练的程序员,我宁愿问我错过了什么,而不是再尝试一个小时(或两个)。