0

我正在创建一个在 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();
    }
}

我真的不太擅长线程处理,所以请,如果可能的话,我需要解释性的答案。

提前致谢。

4

0 回答 0