我有一个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
只是坐着等待传入的消息,所以在我看来只有一个线程在运行。(我以为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;
}
}
我可能只是错过了一些微不足道的东西,但由于这里有很多熟练的程序员,我宁愿问我错过了什么,而不是再尝试一个小时(或两个)。