본문 바로가기
CS(Computer Science)/20) 자바

자바를 자바 fp

by tonyhan18 2020. 12. 30.
728x90

서버단 제작

일단 TreeSet을 사용하고 내부 서버를 연결하는 것부터 제작해 보자

특정 문자들이 있는지 확인
https://highcode.tistory.com/6

package cse3040fp;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

@SuppressWarnings("serial")
class chMap extends TreeMap<String, List<String>> {

    @Override
    public String toString() {
        String ans = "";
        List<Map.Entry<String, List<String>>> list = new ArrayList<>(super.entrySet());
        Collections.sort(list,new Comparator<Map.Entry<String, List<String>>>() {
            @Override
            public int compare(Map.Entry<String, List<String>> o1,Map.Entry<String, List<String>> o2) {
                return o1.getKey().toLowerCase().compareTo(o2.getKey().toLowerCase());
            }
        });
        for(Map.Entry<String, List<String>> entry : list) {
            System.out.println(entry.getKey() + " : " + entry.getValue().get(0)+ " : " + entry.getValue().get(1));
        }
        return ans;
    }
}

public class Server {
    private HashMap<String, DataOutputStream> clients;
    private static Map<String, List<String>> BookList;

    Server() {
        clients = new HashMap<>();
        Collections.synchronizedMap(clients);
    }

    public void start(int port) {
        // 네트워크를 연결할 serverSocket과
        // 데이터를 받아올 socket
        ServerSocket serverSocket = null;
        Socket socket = null;

        try {
            // 서버단과 함께 입력된 포트 번호를 기준으로 새로운 소켓 제작
            serverSocket = new ServerSocket(port);

            // Client가 올 때마다 소켓을 연결해줌
            while (true) {
                socket = serverSocket.accept();
                ServerReceiver thread = new ServerReceiver(socket);
                thread.start();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void readBooks(String path) {
        try {
            BufferedReader br = new BufferedReader(new FileReader(path));
            while (true) {
                String Line = br.readLine();
                if (Line == null)
                    break;
                String[] sLine = Line.split("\t");
                List<String> temp = new ArrayList<>();
                temp.add(sLine[1]);
                temp.add(sLine[2]);
                BookList.put(sLine[0], temp);
            }
            br.close();
        } catch (IOException e) {
            System.out.println("Input file not found.");
            System.exit(0);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(BookList);
    }

    public static void main(String args[]) {
        // 성분을 제대로 주었을 경우에만 작동
        if (args.length != 1) {
            System.out.println("Please give the port number as an argument.");
            System.exit(0);
        } else {
            //프로그램이 시작되면 라이브러리를 제작함
            BookList =new chMap();
            readBooks("books.txt");
            new Server().start(Integer.parseInt(args[0]));
        }
    }

    synchronized void writeFile() {
        try {
            @SuppressWarnings("resource")
            OutputStream out = new FileOutputStream("books.txt");
            String ans="";

            List<Map.Entry<String, List<String>>> list = new ArrayList<>(BookList.entrySet());
            Collections.sort(list,new Comparator<Map.Entry<String, List<String>>>() {
                @Override
                public int compare(Map.Entry<String, List<String>> o1,Map.Entry<String, List<String>> o2) {
                    return o1.getKey().toLowerCase().compareTo(o2.getKey().toLowerCase());
                }
            });
            for(Map.Entry<String, List<String>> entry : list) {
                ans = entry.getKey() + "\t" + entry.getValue().get(0) + "\t" + entry.getValue().get(1) + "\t\n";
                out.write(ans.getBytes());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    synchronized boolean addBook(String title, String author) {
        Iterator<Map.Entry<String, List<String>>> it = BookList.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<String, List<String>> entry = it.next();
            if (entry.getKey().toString().toLowerCase().equals(title.toLowerCase())) {
                return false;
            }
        }

        List<String> temp = new ArrayList<String>();
        temp.add(author);temp.add("-");
        try {
            BookList.put(title, temp);
            writeFile();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return true;
    }

    synchronized String borrowBook(String title, String borrower) {
        Iterator<Map.Entry<String, List<String>>> it = BookList.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<String, List<String>> entry = it.next();
            String borrowBook = entry.getKey().toString();
            System.out.println(borrowBook.toLowerCase());
            if (borrowBook.toLowerCase().equals(title.toLowerCase()) && entry.getValue().get(1).equals("-")) {
                BookList.get(borrowBook).set(1, borrower);
                writeFile();
                return borrowBook;
            }
        }
        return "";
    }

    synchronized String returnBook(String title, String returner) {
        Iterator<Map.Entry<String, List<String>>> it = BookList.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<String, List<String>> entry = it.next();
            String borrowBook = entry.getKey().toString();
            if (borrowBook.toLowerCase().equals(title.toLowerCase()) && !BookList.get(borrowBook).get(1).equals("-")) {
                BookList.get(borrowBook).set(1, "-");
                writeFile();
                return borrowBook;
            }
        }
        return "";
    }

    String infoBook(String name) {
        String ans = "";
        Iterator<Map.Entry<String, List<String>>> it = BookList.entrySet().iterator();
        if (name.equals("-"))
            return "";
        while (it.hasNext()) {
            Map.Entry<String, List<String>> entry = it.next();
            String borrowBook = entry.getKey().toString();
            if (BookList.get(borrowBook).get(1).equals(name)) {
                ans += "\t" + borrowBook + ", " + BookList.get(borrowBook).get(0);
            }
        }
        return ans;
    }

    String searchBook(String word) {
        String ans = "";
        Iterator<Map.Entry<String, List<String>>> it = BookList.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<String, List<String>> entry = it.next();
            String borrowBook = entry.getKey().toString();
            if (BookList.get(borrowBook).get(0).toLowerCase().indexOf(word.toLowerCase()) >= 0
                    || borrowBook.toLowerCase().indexOf(word.toLowerCase()) >= 0) {
                ans += "\t" + borrowBook + ", " + BookList.get(borrowBook).get(0);
            }
        }
        return ans;
    }

    //////////////////////////////////////
    ///// Server Main Function ///////////
    /////////////////////////////////////
    class ServerReceiver extends Thread {
        Socket socket;
        DataInputStream in;
        DataOutputStream out;

        // 크라이언트를 받아들이고 Stream을 연결
        ServerReceiver(Socket socket) {
            this.socket = socket;
            try {
                in = new DataInputStream(socket.getInputStream());
                out = new DataOutputStream(socket.getOutputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public void run() {
            String name = "";
            String Line, order[];
            String bookname = "";
            try {
                name = in.readUTF();
                clients.put(name, out);
                System.out.println(name + " login");

                while (in != null) {
                    Line = in.readUTF();
                    if (Line == null)
                        break;
                    order = Line.split("\t");
                    switch (order[0]) {
                    case "add":
                        if (addBook(order[1], order[2])) {
                            System.out.println(name + "added new Book : " + order[1] + ", " + order[2]);
                            System.out.println(BookList);
                            out.writeUTF("addS");
                        } else {
                            System.out.println(order[0] + "adding is Blocked");
                            out.writeUTF("addF");
                        }
                        break;
                    case "borrow":
                        if ((bookname = borrowBook(order[1], name)) != "") {
                            System.out.println(name + " borrowed Book : " + order[1]);
                            System.out.println(BookList);
                            out.writeUTF("borrowS\t" + bookname);
                        } else {
                            System.out.println(name + " can't borrow book : " + order[1]);
                            out.writeUTF("borrowF");
                        }
                        break;
                    case "return":
                        if ((bookname = returnBook(order[1], name)) != "") {
                            System.out.println(name + " returned Book : " + order[1]);
                            System.out.println(BookList);
                            out.writeUTF("returnS\t" + bookname);
                        } else {
                            System.out.println(name + " cant's return book: " + order[1]);
                            out.writeUTF("returnF");
                        }
                        break;
                    case "info":
                        System.out.println(BookList);
                        System.out.println(name + " looking for borrowed books");
                        out.writeUTF("info" + infoBook(name));
                        break;
                    case "search":
                        System.out.println(BookList);
                        System.out.println(name + " looking for specific books");
                        out.writeUTF("search" + searchBook(order[1]));
                        break;
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                System.out.println(name + " logout");
                clients.remove(name);
            }
        }

    }
}

Client 단

package cse3040fp;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ConnectException;
import java.net.Socket;
import java.util.Scanner;



public class Client {

    static class ClientSender extends Thread {
        Socket socket;
        DataOutputStream out;
        String name;

        ClientSender(Socket socket, String name) {
            this.socket = socket;
            try {
                out = new DataOutputStream(socket.getOutputStream());
                this.name = name;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        public void run() {
            @SuppressWarnings("resource")
            Scanner scanner = new Scanner(System.in);
            String title, author, order, sender = "";

            // 총 6가지 경우에 대해서 입력을 받게 됨
            try {
                if (out != null) {
                    out.writeUTF(name);
                    sleep(100);
                }
                while (out != null) {
                    System.out.print("\n"+name + ">> ");
                    order = scanner.nextLine().trim();
                    switch (order) {
                    case "add":
                        System.out.print("add-title> ");
                        title = scanner.nextLine().trim();
                        System.out.print("add-author> ");
                        author = scanner.nextLine().trim();
                        if (title.equals(" ") || title.equals("") || author.equals("") || author.equals(" ")) {
                        } else {
                            sender = "add" + "\t" + title + "\t" + author;
                            try {
                                out.writeUTF(sender);
                                sleep(100);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                        break;
                    case "borrow":
                        System.out.print("borrow-title> ");
                        title = scanner.nextLine().trim();
                        if (title.equals(" ") || title.equals("")) {
                        } else {
                            sender = "borrow" + "\t" + title;
                            try {
                                out.writeUTF(sender);
                                sleep(100);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                        break;
                    case "return":
                        System.out.print("return-title> ");
                        title = scanner.nextLine().trim();
                        if (title.equals(" ") || title.equals("")) {
                        } else {
                            sender = "return" + "\t" + title;
                            try {
                                out.writeUTF(sender);
                                sleep(100);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                        break;
                    case "info":
                        sender = "info"+"\t"+name;
                        try {
                            out.writeUTF(sender);
                            sleep(100);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        break;
                    case "search":
                        while(true) {
                            System.out.print("search-string> ");
                            title=scanner.nextLine().trim();
                            if(title.length()<3) {
                                System.out.println("Search string must be longer than 2 characters.");
                            }else if(title.equals("") || title.equals(" ")) {}
                            else {
                                sender="search"+"\t"+title;
                                try {
                                    out.writeUTF(sender);
                                    sleep(100);
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                                break;
                            }
                        }
                        break;
                    default:
                        System.out.println("[available commands]\n" + "add: add a new book to the list of books.\n"
                                + "borrow: borrow a book from the library.\n"
                                + "return: return a book to the library.\n"
                                + "info: show list of books I am currently borrowing.\n" + "search: search for books.");
                        break;
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

    static class ClientReceiver extends Thread {
        Socket socket;
        DataInputStream in;

        ClientReceiver(Socket socket) {
            this.socket = socket;
            try {
                in = new DataInputStream(socket.getInputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public void run() {
            String Line;
            String order[];
            //총 8가지 경우에 대해서 출력을 맡게 됨
            while (in != null) {
                try {
                    Line=in.readUTF();
                    order=Line.split("\t");
                    switch(order[0]) {
                    case "addS":
                        System.out.println("A new book added to the list.");
                        break;
                    case "addF":
                        System.out.println("The book already exists in the list.");
                        break;
                    case "borrowS":
                        System.out.println("You borrowed a book. - "+order[1]);
                        break;
                    case "borrowF":
                        System.out.println("The book is not available.");
                        break;
                    case "returnS":
                        System.out.println("You returned a book. - "+order[1]);
                        break;
                    case "returnF":
                        System.out.println("You did not borrow the book.");
                        break;
                    case "info":
                        System.out.println("You are currently borrowing "+(order.length-1)+ " books:");
                        for (int i = 1 ; i<order.length;++i) {
                            System.out.println((i)+". "+order[i]);
                        }
                        break;
                    case "search":
                        System.out.println("Your search matched "+(order.length-1)+ "  results.");
                        for (int i = 1 ; i<order.length;++i) {
                            System.out.println((i)+". "+order[i]);
                        }
                        break;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                    System.exit(0);
                }
            }
        }
    }

    public static void main(String[] args) {
        if (args.length != 2) {
            System.out.println("Please give the IP address and port number as arguments.");
            System.exit(0);
        }

        try {
            Socket socket = new Socket(args[0], Integer.parseInt(args[1]));
            String name = "";
            while (true) {
                @SuppressWarnings("resource")
                Scanner scan = new Scanner(System.in);
                System.out.print("Enter UserID>> ");
                name = scan.nextLine();
                if (name.contains(" ") || !name.matches("^[0-9|a-z|A-Z]*$") || name.equals("")) {
                    System.out.println("UserID must be a single word with lowercase alphabets and numbers.\n");
                } else
                    break;
            }
            Thread sender = new Thread(new ClientSender(socket, name));
            Thread receiver = new Thread(new ClientReceiver(socket));
            sender.start();
            receiver.start();
        } catch (ConnectException ce) {
            ce.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
728x90

'CS(Computer Science) > 20) 자바' 카테고리의 다른 글

자바를 자바 26 : Multithreaded Programming with Java (2)  (0) 2020.12.30
자바를 자바 25  (0) 2020.12.30
자바를 자바 24 (Networking with Java(3))  (0) 2020.12.30
자바를 자바 23  (0) 2020.12.30
자바를 자바 22  (0) 2020.12.03