package com.company; import java.io.*; import java.net.Socket; import java.sql.Timestamp; class SendMessage implements Serializable { public String msg; public SendMessage(String msg) { this.msg = msg; } } public class Client extends Thread { private Socket socket; private InputStream is; private OutputStream os; private boolean authorizedCard; private boolean isAuthorized; private User user; /** * @param socket сокет клиента */ public Client(Socket socket) throws IOException { this.socket = socket; this.is = this.socket.getInputStream(); this.os = this.socket.getOutputStream(); authorizedCard = false; isAuthorized = false; } @Override public void run() { try { // Принимаем сообщение от клиента ObjectInputStream objectInputStream = new ObjectInputStream(is); ObjectOutputStream objectOutputStream = new ObjectOutputStream(os); while (!isInterrupted()) { Header header = (Header) objectInputStream.readObject(); switch (header.Type) { case USER: if (header.Data instanceof UserTransport) { UserTransport ut = (UserTransport) header.Data; switch (ut.Type) { case AUTHORIZATION: isAuthorized = Bank.authorizedUser(ut.Login, ut.Password); System.out.println(String.format("Пользователь %s авторизовался", ut.Login)); objectOutputStream.writeObject(new SendMessage("С возвращением!")); objectOutputStream.flush(); objectOutputStream.reset(); continue; case REGISTRATION: Bank.registerUser(new User(ut.Name, ut.Phone, ut.Login, ut.Password)); objectOutputStream.writeObject(new SendMessage("Поздравляем! Вы успешно зарегистрировались!")); objectOutputStream.flush(); objectOutputStream.reset(); continue; } } break; case BILL: if (header.Data instanceof BillTransport) { BillTransport bt = (BillTransport) header.Data; switch (bt.TYPE) { case AUTHORIZATION: System.out.println("Авторизация"); authorizedCard = Bank.authorization(bt.BILL_NUMBER, bt.PIN); if (authorizedCard) { objectOutputStream.writeObject(new SendMessage("Авторизация карты успешно")); } else { objectOutputStream.writeObject(new SendMessage("В авторизации отказано")); } objectOutputStream.flush(); objectOutputStream.reset(); continue; case SIGN_CONTRACT: System.out.println("Открытие счёта"); SecretData secretData = Bank.insert(user, bt.BALANCE); objectOutputStream.writeObject(secretData); objectOutputStream.flush(); continue; case BREAK_CONTRACT: System.out.println("Закрытие счёта"); if (!authorizedCard) { System.out.println("Для совершения операций со счётом необходимо авторизоваться"); objectOutputStream.writeObject(new SendMessage("Действие не выполнено! Необходимо авторизоваться.")); objectOutputStream.flush(); continue; } Bank.delete(bt.BILL_NUMBER); break; case DEPOSIT: System.out.println("Пополнение"); if (!authorizedCard) { System.out.println("Для совершения операций со счётом необходимо авторизоваться"); objectOutputStream.writeObject(new SendMessage("Действие не выполнено! Необходимо авторизоваться.")); objectOutputStream.flush(); continue; } Bank.deposit(bt.BALANCE, bt.BILL_NUMBER); break; case WITHDRAW: System.out.println("Снятие"); if (!authorizedCard) { System.out.println("Для совершения операций со счётом необходимо авторизоваться"); objectOutputStream.writeObject(new SendMessage("Действие не выполнено! Необходимо авторизоваться.")); objectOutputStream.flush(); continue; } Bank.withdraw(bt.BALANCE, bt.BILL_NUMBER); break; } } break; } objectOutputStream.writeObject(new SendMessage("Нет действий...")); objectOutputStream.flush(); } } catch (ClassNotFoundException | IOException exception) { if (exception.getMessage() != null) { System.out.println(exception.getMessage()); } interrupt(); } System.out.println(new Timestamp(System.currentTimeMillis()) + " Client disconnected: " + socket.getInetAddress().getHostAddress()); try { is.close(); os.close(); socket.close(); } catch (IOException exception) { System.out.println(exception.getMessage()); } } }