Как я могу ждать дополнительного клиентского ввода в клиентском обработчике? Разъем - PullRequest
0 голосов
/ 07 января 2019

При первой попытке все работает правильно и меняет значения должным образом, но когда цикл завершен и клиент перезагружается, и нужно иметь возможность вводить новые входные данные, поток соединения становится асинхронизированным с входными данными клиента, и строка запроса назначается на что-либо другое. .

Когда клиент запускается, должны быть вводы для имени и часов / даты, но после полного резервирования вокруг строки 97 в Соединении ввод и вывод неправильны, они не соответствуют друг другу. Я думаю, что это вызвано запросом дополнительных данных для подтверждения бронирования. или я неправильно зациклен / возвращаюсь к началу. Это класс Client Handler

public class Connection extends Thread {
private Socket socket;
private Data Ledger;
private Reservation that_r;
private Integer month;
private Integer day;
private Integer hour;

public Connection(Socket socket, Data Ledger) {
    this.socket = socket;
    this.Ledger = Ledger;
}
@Override
synchronized public void run() {
    try {
        BufferedReader in = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);




        while(true) {
            String request = in.readLine();
            if(request.equals("exit")) {
                break;
            }

            do{
                Boolean  completion = Boolean.FALSE;

                System.out.println("Received client input: " + request);
                out.println("Write Day + Hour you want to reserve");


                String R_name =  in.readLine();
                System.out.println("name " + R_name);
                String R_month =  in.readLine();
                System.out.println("month "+R_month);
                String R_day =  in.readLine();
                System.out.println("day "+R_day);
                String R_hour =  in.readLine();
                System.out.println("hour "+R_hour);

                out.println("Checking for existing reservation");

                try{this.month = Integer.parseInt(R_month);}
                catch (Exception e){System.out.println("sth wrong"+e.getMessage());out.println("Wrong number"); }
                try{this.day = Integer.parseInt(R_day);}
                catch(Exception e){ System.out.println("sth wrong "+e.getMessage());out.println("Wrong number"); }
                try{this.hour = Integer.parseInt(R_hour);}
                catch (Exception e){System.out.println("sth wrong "+e.getMessage());out.println("Wrong number");}

                try {
                    if (Ledger.findReservation(month, day, hour).getReserved()){
                        System.out.println(Ledger.reservations);
                        out.println("Currently being reserved sorry");
                        out.println("press Enter");
                        out.println("END");
                        return;
                    }
                }catch (NullPointerException e){
                    this.that_r = new Reservation(R_name,month,day,hour,true);
                    Ledger.reservations.add(that_r);
                    out.println("Checking if available");
                    try {if (Ledger.findDay(month, day).aval(hour)){
                        out.println("Can be reserved, RESERVE Y/N");
                        completion = true;
                        out.println("END");
                      }else{
                        out.println("Sorry it is not available but you know that already as you can see all free termines");
                        out.println("END");
                        return;
                      }
                    }catch (NullPointerException f){
                        out.println("Day you want to reserve is not here");
                    }
                }
                if (completion){
                    String answer = in.readLine();
                    System.out.println(answer);
                    if (answer.equals("y")) {
                        Ledger.findDay(month,day).changeaval(hour,Boolean.FALSE);
                        //out.println("END");


                    }
                    if (answer.equals("n")) {
                        Ledger.reservations.remove(that_r);
                    }
                    if (answer.equals("")){
                        break;
                    }
                }
            }while (request.equals("r"));

            if (request.equals("show")){
                out.println(LocalDateTime.of(2019,1,5,23,55));
                out.println("END");
                out.flush();

            }
            }

    } catch(IOException e) {
        System.out.println(e.getMessage());
    } finally {
        try {
            socket.close();
            for (Day x: Ledger.ledger){
                System.out.println(x.getDay()+" / "+ x.getMonth());
                System.out.println(x.getSchedule());
            }

            for (Reservation x: Ledger.reservations){
                System.out.println(x.getDay()+" / "+ x.getMonth());
                System.out.println(x.getName()+" "+ x.getHour());
            }

        } catch(IOException e) {
            System.out.println(e.getMessage());
        }
    }

}
}

А потом есть Клиентская сторона

public class Client {

public static void main(String[] args) {
    try (Socket socket = new Socket("localhost", 5000)) {
        BufferedReader in = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        Scanner scanner = new Scanner(System.in);
        String input;
        do {
            System.out.println("r for reserving ");
            System.out.println("show for showing reservations");

            input = scanner.nextLine();
            out.println(input);
            out.flush();

            if (input.equals("r")) {
                System.out.println(in.readLine());
                System.out.println("name");
                String new_name = scanner.nextLine();
                out.println(new_name);

                System.out.println("month");
                String new_month = scanner.nextLine();
                out.println(new_month);

                System.out.println("day");
                String new_day = scanner.nextLine();
                out.println(new_day);

                System.out.println("hour");
                String new_hour= scanner.nextLine();
                out.println(new_hour);

                System.out.println("wait");

                listen(in);

                String answer = scanner.nextLine();
                System.out.println("answered " + answer);
                out.println(answer);
            }
        } while (!input.equals("exit"));
    } catch (IOException e) {
        System.out.println("Client Error: " + e.getMessage());
    }
}


public static void listen(BufferedReader in) {
    while (true) {
        try {
            String p = in.readLine();
            if (p.equals("END")) {
                break;
            }else{System.out.println(p);}

        }catch (IOException e){
            System.out.println(e.getMessage());
        }


    }
}
}

Я хочу, чтобы клиент сделал новые входные данные после неудачного резервирования или завершенного резервирования, или после какого-либо другого процесса, чтобы обработчик клиента соединения видел это, а также снова назначал входы.

1 Ответ

0 голосов
/ 07 января 2019

Вместо того, чтобы отправлять несколько отдельных частей информации, я бы рекомендовал инкапсулировать всю информацию о бронировании и избежать головной боли, возникающей при сохранении заказа, если несколько клиентов подключатся и отправят свои резервирования. Например. Резервирование booking1 = новое бронирование (имя, месяц, час). Затем просто отправьте все это одним куском: out.write (rout1.getBytes ())

...