提问人:JeroenV 提问时间:8/26/2013 最后编辑:Stephen CJeroenV 更新时间:8/26/2013 访问量:121
Java:如何实现一个不阻塞程序其余部分的 portlistener
Java: How to implement a portlistener that doesn't block the rest of the program
问:
我有定义 Java FX 场景和阶段的类,还有一个创建数据库连接并启动 .这 3 个不同的部分(和 Port Listener)在单独测试时都起作用,但是当我取消注释这些部分以便我可以完全工作地测试程序时,它不起作用。Main
MainController
PortListener
Views
DB connection
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();
}
问题是我从来没有进入过主程序,因为它只是坐着等待传入的消息,所以在我看来只有一个线程在运行。(我以为java默认是多线程的)primaryStage.show();
portlistener
应该等待传入的消息,但不应阻止程序运行。我已经更改了实现,但我在某处读到应该从另一个类中新创建的线程的方法调用可运行对象的方法。portlistener
Main
Portlistener
Runnable
run()
start()
现在有一个问题,我在 中创建了一个函数,它有 2 个参数,一个是 to listening to,另一个是 instance,因此一旦有传入消息,就可以调用一个函数。具有数据库连接和端口号等变量,实际上是所有内容汇集在一起的类。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;
}
}
我可能只是错过了一些微不足道的东西,但由于这里有这么多熟练的程序员,我宁愿问我错过了什么,而不是再尝试一个小时(或两个小时)。
答: 暂无答案
评论
new Thread(myRunnable).start()
I thought java was multithreaded by default
: 它是,在后台...不过,默认情况下它不会完成您的工作......myRunnable