При первой попытке все работает правильно и меняет значения должным образом, но когда цикл завершен и клиент перезагружается, и нужно иметь возможность вводить новые входные данные, поток соединения становится асинхронизированным с входными данными клиента, и строка запроса назначается на что-либо другое. .
Когда клиент запускается, должны быть вводы для имени и часов / даты, но после полного резервирования вокруг строки 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());
}
}
}
}
Я хочу, чтобы клиент сделал новые входные данные после неудачного резервирования или завершенного резервирования, или после какого-либо другого процесса, чтобы обработчик клиента соединения видел это, а также снова назначал входы.