我正在创建一个在 JavaFX 应用程序上运行的收银员系统。每当客户离开订单时,还有一个客户会发送字符串消息。收银员服务器必须接收并分解我需要创建一个CarService对象的部分,然后TableView在服务器端的 UI 上使用该信息更新 a。问题是我的服务器运行良好,UI 全部完成,但是当我想将它们组合在一起时它们不起作用。
更具体地说,我知道服务器套接字在与应用程序不同的线程上运行,但我不能一起工作。此外,套接字必须保持打开状态,以便它可以接收多个订单。我已经创建了运行应用程序的主类,我非常确定在哪里放置服务器对象的启动以及如何使用它,因此它首先获取消息,将其分解为各个部分,创建一个CarService对象,然后通知并发送UI 上的对象,TableView以便服务器端的用户可以管理它。我正在使用 UI 为服务器端提供代码。
服务器:
public class Server {
public static ServerSocket serverSocket = null;
public static Socket socket = null;
public static boolean listening = true;
public Server() throws IOException {
try {
serverSocket = new ServerSocket(7777);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Server initialized.");
System.out.println("Server waiting...");
while(listening) {
new EchoServerThread(serverSocket.accept()).start();
}
}
}
回声服务器线程:
public class EchoServerThread extends Thread {
private int sum;
private String carID = "", carType = "", services = "", time = "";
private CarService customer;
private Socket socket;
public EchoServerThread(Socket socket) {
super("Server Thread");
this.socket = socket;
}
@Override
public void run() {
System.out.println("Server accepted connection: " + socket);
customer = receiveCustomer();
System.out.println(customer.toString());
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public CarService receiveCustomer() {
CarService tmpCustomer = null;
try {
Scanner fromClient = new Scanner(socket.getInputStream());
carID = fromClient.nextLine();
carType = fromClient.nextLine();
services = fromClient.nextLine();
sum = fromClient.nextInt();
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
time = sdf.format(date);
tmpCustomer = new CarService(carID, carType, services, sum);
}
catch (IOException e) {
e.printStackTrace();
}
return tmpCustomer;
}
}
主窗口:
public class Window extends Application {
private int fontSize = 25;
public TableView tableView;
public static Server server = null;
public static void main(String[] args) {
try {
server = new Server();
} catch (IOException e) {
e.printStackTrace();
}
launch(args);
}
@Override
public void start(Stage stageServer) {
FileRegistration fr = new FileRegistration();
tableView = new TableView();
tableView.setPlaceholder(new Label("No entries to display here"));
TableColumn<CarService, String> c1 = new TableColumn<>("Car ID");
c1.setCellValueFactory(new PropertyValueFactory<>("carID"));
c1.setEditable(false);
c1.setPrefWidth(80.0);
c1.setResizable(false);
c1.setReorderable(false);
TableColumn<CarService, String> c2 = new TableColumn<>("Car Type");
c2.setCellValueFactory(new PropertyValueFactory<>("carType"));
c2.setEditable(false);
c2.setPrefWidth(80.0);
c2.setResizable(false);
c2.setReorderable(false);
TableColumn<CarService, String> c3 = new TableColumn<>("Services");
c3.setCellValueFactory(new PropertyValueFactory<>("servicesMessage"));
c3.setEditable(false);
c3.setPrefWidth(600.0);
c3.setResizable(true);
c3.setReorderable(false);
TableColumn<CarService, String> c4 = new TableColumn<>("Summary");
c4.setCellValueFactory(new PropertyValueFactory<>("sum"));
c4.setEditable(false);
c4.setPrefWidth(100.0);
c4.setResizable(false);
c4.setReorderable(false);
tableView.getColumns().add(c1);
tableView.getColumns().add(c2);
tableView.getColumns().add(c3);
tableView.getColumns().add(c4);
// Insert will be done when a customer arrives in the EchoServer class.
//
CarService cs1 = new CarService("TYA4567", "car", "1,7,8,9,", 187);
CarService cs2 = new CarService("TRZ9876", "jeep", "3,6,7,10,", 114);
CarService cs3 = new CarService("POD4567", "car", "1,7,8,9,10", 190);
CarService cs4 = new CarService("YGD9876", "moto", "4,8,", 48);
tableView.getItems().add(cs1);
tableView.getItems().add(cs2);
tableView.getItems().add(cs3);
tableView.getItems().add(cs4);
//
TableViewSelectionModel<CarService> selectionModel = tableView.getSelectionModel();
selectionModel.setSelectionMode(SelectionMode.SINGLE);
// Setting up the layout of the buttons.
Button remove = new Button("Remove");
remove.setFont(new Font("arial", fontSize-5));
remove.setTextAlignment(TextAlignment.CENTER);
Button cash = new Button("Cash");
cash.setFont(new Font("arial", fontSize-5));
cash.setTextAlignment(TextAlignment.CENTER);
HBox buttons = new HBox();
buttons.setAlignment(Pos.CENTER);
buttons.setPadding(new Insets(30.0));
buttons.setSpacing(20.0);
buttons.getChildren().addAll(remove, cash);
// Setting up functions for the buttons.
// Making remove button.
remove.setOnAction(event -> {
if (!selectionModel.isEmpty()) {
Alert alert = new Alert(AlertType.CONFIRMATION);
alert.setTitle("Confirmation");
alert.setHeaderText("Proceed with removal of the registry?\n");
alert.setContentText(null);
Optional<ButtonType> result = alert.showAndWait();
if (result.isPresent()) {
if (result.get() == ButtonType.OK) {
tableView.getItems().remove(tableView.getSelectionModel().getSelectedIndex());
selectionModel.clearSelection();
} else{
selectionModel.clearSelection();
event.consume();
}
}
}
});
// Making cash button.
cash.setOnAction(event -> {
if (!selectionModel.isEmpty()){
ObservableList<CarService> selectedCar = selectionModel.getSelectedItems();
Alert alert = new Alert(AlertType.CONFIRMATION);
alert.setTitle("Receipt");
alert.setHeaderText("Proceed with transaction?\n");
String receipt = "";
for (int i = 0; i < selectedCar.get(0).getServices().size(); i++){
receipt = receipt + selectedCar.get(0).getServices().get(i) + " : " + selectedCar.get(0).getPrices().get(i) + "\n";
}
alert.setContentText("Car ID : " + selectedCar.get(0).getCarID() + "\n\n" + receipt + "\nSummary : " + selectedCar.get(0).getSum());
Optional<ButtonType> result = alert.showAndWait();
if (result.isPresent()) {
if (result.get() == ButtonType.OK) {
// Writing cashing to the registrations book.
fr.writeToFile(selectedCar.get(0));
tableView.getItems().remove(tableView.getSelectionModel().getSelectedIndex());
selectionModel.clearSelection();
} else {
selectionModel.clearSelection();
event.consume();
}
}
}
});
VBox mainServer = new VBox();
mainServer.setAlignment(Pos.CENTER);
mainServer.setPadding(new Insets(30.0));
mainServer.setSpacing(20.0);
mainServer.getChildren().addAll(tableView, buttons);
// Setting up the close_window function.
stageServer.addEventFilter(WindowEvent.WINDOW_CLOSE_REQUEST, event -> {
ObservableList<CarService> items = tableView.getItems();
if (items.size() > 0) {
Alert alert = new Alert(AlertType.ERROR);
alert.setTitle("Warning");
alert.setHeaderText("You can NOT exit when there are customers waiting.");
alert.setContentText(null);
alert.showAndWait();
event.consume();
}
});
Scene stageScene = new Scene(mainServer, 1024, 768);
stageServer.setTitle("Cash Desk");
stageServer.setResizable(false);
stageServer.setScene(stageScene);
stageServer.show();
}
}
我真的不太擅长线程处理,所以请,如果可能的话,我需要解释性的答案。
提前致谢。