Browse Source

Добавлена серверная часть. Созданы классы Client, Server, UserMessage, UserMessageType.

Alec 4 years ago
parent
commit
93c156ea55

+ 1 - 1
.idea/misc.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="13" project-jdk-type="JavaSDK">
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="false" project-jdk-name="11" project-jdk-type="JavaSDK">
     <output url="file://$PROJECT_DIR$/out" />
   </component>
 </project>

+ 1 - 1
readme.md

@@ -1,3 +1,3 @@
 <h3>Bank</h3>
 
-Пример создания односвязного списка
+Пример создания многопоточного серверного приложения 

+ 90 - 28
src/com/company/Bank.java

@@ -7,77 +7,139 @@ public class Bank {
     /**
      * Голова списка счетов банка
      */
-    private Bill Head;
+    private static Bill head;
 
     /**
      * Счётчик клиентов банка. Обновлятся при добавлении нового клиента или удалении старого счёта.
      */
-    private int count;
+    private static int count;
 
-    private String name;
+    /**
+     * Наименование банка
+     */
+    private static String name;
 
     /**
-     * Конструктор открывающий банк
+     * Возвращает количество клиентов
      *
-     * @param name наименование банка
+     * @return размер списка
      */
-    public Bank(String name) {
-        this.name = name;
-    }
-
-    public int getClientCount() {
+    public static int getClientCount() {
         return count;
     }
 
-    public String getName() {
+    /**
+     * Возвращает наименование банка
+     *
+     * @return название
+     */
+    public static String getName() {
         return name;
     }
 
-    public void insert(String passport, String phone, String name, double balance) {
+    /**
+     * Задать наименование банка
+     *
+     * @param name имя банка
+     */
+    public static void setName(String name) {
+        Bank.name = name;
+    }
+
+    /**
+     * Вставить новый элемент в конец списока (открытие нового счёта)
+     *
+     * @param passport серия и номер паспорта
+     * @param phone    мобильный телефон
+     * @param name     фамилия и имя клиента
+     * @param balance  начальный баланс
+     */
+    public static void insert(String passport, String phone, String name, double balance) {
         Bill newBill = new Bill(balance, passport, phone, name, count);
 
-        if (Head == null) {
-            Head = newBill;
+        if (head == null) {
+            head = newBill;
         } else {
-            Bill last = Head;
+            Bill last = head;
 
-            while (last.Next != null) {
-                last = last.Next;
+            while (last.next != null) {
+                last = last.next;
             }
 
-            last.Next = newBill;
+            last.next = newBill;
         }
 
         count++;
     }
 
-    public void insertAt(int indexAfter, String passport, String phone, String name, double balance) {
+    /**
+     * Вставить новый элемент после указанного indexAfter (открытие ранее удалённого счёта)
+     *
+     * @param indexAfter индекс элемента, после которого будет вставлен новый
+     * @param passport   серия и номер паспорта клиента
+     * @param phone      мобильный телефон
+     * @param name       фамилия и имя клиента
+     * @param balance    начальный баланс
+     */
+    public static void insertAt(int indexAfter, String passport, String phone, String name, double balance) {
         Bill newBill = new Bill(balance, passport, phone, name, count);
 
-        Bill current = Head;
+        Bill current = head;
         if (indexAfter > count) {
-            while (current.Next != null) {
-                current = current.Next;
+            while (current.next != null) {
+                current = current.next;
             }
         } else {
             int index = 1;
 
             while (index < indexAfter) {
-                current = current.Next;
+                current = current.next;
                 index++;
             }
 
-            newBill.Next = current.Next;
+            newBill.next = current.next;
         }
-        current.Next = newBill;
+        current.next = newBill;
     }
 
-    public void ShowClientsInfo() {
-        Bill current = Head;
+    /**
+     * Вывод информации о всех клиентах в консоль
+     */
+    public static void showClientsInfo() {
+        Bill current = head;
 
         while (current != null) {
             System.out.printf("Bill number: %s; Client: %s; Passport: %s; Phone: %s; Balance: %.2f;\n", current.getNumber(), current.getName(), current.getPassport(), current.getPhone(), current.getBalance());
-            current = current.Next;
+            current = current.next;
         }
     }
+
+    /**
+     * Пополнить баланс
+     *
+     * @param value пополняемое значение
+     * @param bill  пополняемый номер счёта
+     */
+    public static void deposit(double value, String bill) {
+
+    }
+
+    /**
+     * Списать баланс
+     *
+     * @param value списываемое значение
+     * @param bill  номер счёта для списания
+     */
+    public static void withdraw(double value, String bill) {
+
+    }
+
+    /**
+     * Разорвать договор с банком (удалить счёт)
+     *
+     * @param bill номер удаляемого счёта
+     */
+    public static void delete(String bill) {
+
+    }
 }

+ 2 - 2
src/com/company/Bill.java

@@ -1,7 +1,7 @@
 package com.company;
 
 public class Bill {
-    public Bill Next;
+    public Bill next;
 
     private double balance;
     private String passport;
@@ -23,7 +23,7 @@ public class Bill {
         this.passport = passport;
         this.phone = phone;
         this.name = name;
-        Next = null;
+        next = null;
 
         number = String.format("%04d %04d %04d %04d", 3202, 2200, 5420, num);
     }

+ 57 - 0
src/com/company/Client.java

@@ -0,0 +1,57 @@
+package com.company;
+
+import java.io.*;
+import java.net.Socket;
+
+public class Client extends Thread {
+    private Socket socket;
+    private InputStream is;
+    private OutputStream os;
+
+    /**
+     *
+     * @param socket сокет клиента
+     */
+    public Client(Socket socket) throws IOException {
+        this.socket = socket;
+        this.is = this.socket.getInputStream();
+        this.os = this.socket.getOutputStream();
+    }
+
+    @Override
+    public void run() {
+        while (!isInterrupted()) {
+            try {
+                ObjectInputStream objectInputStream = new ObjectInputStream(is);
+
+                UserMessage userMessage = (UserMessage)objectInputStream.readObject();
+                switch (userMessage.TYPE) {
+                    case DEPOSIT:
+                        Bank.deposit(userMessage.BALANCE, userMessage.BILL_NUMBER);
+                        break;
+                    case WITHDRAW:
+                        Bank.withdraw(userMessage.BALANCE, userMessage.BILL_NUMBER);
+                        break;
+                    case SIGN_CONTRACT:
+                        Bank.insert(userMessage.PASSPORT, userMessage.PHONE, userMessage.FULLNAME, userMessage.BALANCE);
+                        break;
+                    case BREAK_CONTRACT:
+                        Bank.delete(userMessage.BILL_NUMBER);
+                        break;
+                }
+
+            } catch (ClassNotFoundException | IOException exception) {
+                System.out.println(exception.getMessage());
+                interrupt();
+            }
+        }
+
+        try {
+            is.close();
+            os.close();
+            socket.close();
+        } catch (IOException exception) {
+            System.out.println(exception.getMessage());
+        }
+    }
+}

+ 9 - 8
src/com/company/Main.java

@@ -1,16 +1,17 @@
 package com.company;
 
+import java.io.IOException;
+
 public class Main {
 
     public static void main(String[] args) {
-        Bank bank = new Bank("Сбербанк");
-
-        bank.insert("3505 543456", "+79634324568", "Ivan Ivanov", 35000);
-        bank.insert("3520 543344", "+79619983745", "Petr Petrov", 35000);
-        bank.insert("3425 764648", "+79095545237", "Grigorij Sidorov", 35000);
-
-        bank.insertAt(2, "", "", "", 0.0);
+        Bank.setName("Сберыч");
 
-        bank.ShowClientsInfo();
+        try {
+            Server server = new Server();
+            server.Run();
+        } catch (IOException exception) {
+            System.out.println(exception.getMessage());
+        }
     }
 }

+ 51 - 0
src/com/company/Server.java

@@ -0,0 +1,51 @@
+package com.company;
+
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.ArrayList;
+
+public class Server {
+    private ServerSocket socket;
+    private boolean interrupt;
+    private ArrayList<Client> clients;
+
+    public Server() throws IOException {
+        socket = new ServerSocket(8080);
+        interrupt = false;
+        clients = new ArrayList<>();
+    }
+
+    public void Run() {
+        while (!interrupt) {
+            try {
+                Socket clientSocket = socket.accept();
+                Client client = new Client(clientSocket);
+                // Добавление клиента в список всех подключенных клиентов
+                clients.add(client);
+                // Старт работы потока с подключенным клиентом
+                client.start();
+            } catch (IOException exception) {
+                System.out.println(exception.getMessage());
+            }
+        }
+
+        for (Client cl: clients) {
+            cl.interrupt();
+
+            try {
+                cl.join();
+            } catch (InterruptedException exception) {
+                System.out.println(exception.getMessage());
+            }
+        }
+    }
+
+    public boolean isInterrupt() {
+        return interrupt;
+    }
+
+    public void Interrupt(boolean interrupt) {
+        this.interrupt = interrupt;
+    }
+}

+ 12 - 0
src/com/company/UserMessage.java

@@ -0,0 +1,12 @@
+package com.company;
+
+import java.io.Serializable;
+
+public class UserMessage implements Serializable {
+    public UserMessageType TYPE = UserMessageType.DEFAULT;
+    public String BILL_NUMBER;
+    public String FULLNAME;
+    public String PHONE;
+    public String PASSPORT;
+    public double BALANCE;
+}

+ 24 - 0
src/com/company/UserMessageType.java

@@ -0,0 +1,24 @@
+package com.company;
+
+/**
+ * Типы сообщений клиента
+ */
+public enum UserMessageType {
+    DEFAULT,
+    /**
+     * Пополнить баланс
+     */
+    DEPOSIT,
+    /**
+     * Снять с счёта
+     */
+    WITHDRAW,
+    /**
+     * Прекратить действие договора
+     */
+    BREAK_CONTRACT,
+    /**
+     * Открыть новый счёт
+     */
+    SIGN_CONTRACT,
+}