실습 예제 문제

hovi·2023년 5월 30일
0

JAVA

목록 보기
36/36

1. 텍스트 파일 읽기

  • 임의의 위치에 텍스트 파일을 만들고, 10명의 정보를 공백 기준으로 미리 입력 해둠.
  • 이름 국어 영어 수학 형식
  • 입력 예)
안유진 99 78 45
이영지 34 56 100
이윤지 56 78 34
우영우 99 98 97
정명석 96 99 98
이준호 77 87 88
권민우 96 93 90
최수연 97 88 87
동그라미 45 34 67
미미 45 56 78
  • 해당 파일을 읽어 총점을 구하고 총점이 높은 사람 순으로 이름과 총점 보여주기
public class TextFileRead {
    public static void main(String[] args) throws FileNotFoundException {
        TreeSet<StudentInfo> treeSet = new TreeSet<>();
        FileInputStream inputStream = new FileInputStream("src/파일성적정렬/score.txt");
        Scanner sc = new Scanner(inputStream);

        while (sc.hasNextLine()) {
            String line = sc.nextLine();
            String[] strArr = line.split(" ");
            treeSet.add(new StudentInfo(strArr[0],
                    Integer.parseInt(strArr[1]),
                    Integer.parseInt(strArr[2]),
                    Integer.parseInt(strArr[3])));
        }
        for(StudentInfo e : treeSet) {
            System.out.println(e.getName() + " : " + e.getTotal());
        }
    }
}
public class StudentInfo implements Comparable<StudentInfo>{
    private String name;
    private int kor;
    private int eng;
    private int mat;

    public StudentInfo(String name, int kor, int eng, int mat) {
        this.name = name;
        this.kor = kor;
        this.eng = eng;
        this.mat = mat;
    }
    int getTotal() {
       return kor + eng + mat;
    }
    String getName() {
        return name;
    }

    @Override
    public int compareTo(StudentInfo o) {
        if(this.getTotal() == o.getTotal()) return this.name.compareTo(o.name);
        return o.getTotal() - this.getTotal();
    }
}

2. TCP/IP 소켓을 이용한 명함 전송 하기 (직렬화)

  • 이름, 전화번호, 회사명, 이메일 포함된 10개의 명함 정보 생성 후 다른 컴퓨터로 전송하기
  • 첫번째 단계는 서버에서 연결된 1개의 클라이언트에게 10명의 명함 정보를 전송하고, 해당 클라이언트에서 수신 후 결과를 출력 함
  • 두번째 단계는 연결된 클라이언트의 개수에 상관 없이 모든 클라이언트에게 전송하기

직렬화를 위한 클래스 만들기

public class NameCardInfo implements Serializable {
    private String name;
    private String phone;
    private String company;
    private String email;

    public NameCardInfo(String name, String phone, String company, String email) {
        this.name = name;
        this.phone = phone;
        this.company = company;
        this.email = email;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getCompany() {
        return company;
    }
    public void setCompany(String company) {
        this.company = company;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
}

서버

public class NameCardServer {
    static List<NameCardInfo> list = new ArrayList<>();
    public static void main(String[] args) {
        int port = 8990;
        try {
            ServerSocket serverSocket = new ServerSocket(port);
            while(true) {
                Socket socket = serverSocket.accept();
                System.out.println("[클라이언트 : " + socket.getRemoteSocketAddress() + "연결");
                Thread server = new NameServerTh(socket);
                server.start();
            }
        } catch (ConnectException e) {
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    static List<NameCardInfo> writeNameCard() {
        list.add(new NameCardInfo("안유진", "010-1234-5678", "지구오락실", "anyj@gmail.com"));
        list.add(new NameCardInfo("이영지", "010-1234-5678", "지구오락실", "lej@gmail.com"));
        list.add(new NameCardInfo("이은지", "010-1234-5678", "지구오락실", "lyjj@gmail.com"));
        list.add(new NameCardInfo("우영우", "010-1234-5678", "이상한변호사", "yyy@gmail.com"));
        list.add(new NameCardInfo("정명석", "010-1234-5678", "이상한변호사", "jms@gmail.com"));
        list.add(new NameCardInfo("이준호", "010-1234-5678", "이상한변호사", "ljh@gmail.com"));
        list.add(new NameCardInfo("권민우", "010-1234-5678", "이상한변호사", "kmw@gmail.com"));
        list.add(new NameCardInfo("나영석", "010-1234-5678", "지구오락실", "nys@gmail.com"));
        list.add(new NameCardInfo("미미", "010-1234-5678", "지구오락실", "mimi@gmail.com"));
        list.add(new NameCardInfo("임윤아", "010-1234-5678", "빅마우스", "yuna@gmail.com"));
        return list;
    }
}
public class NameServerTh extends Thread {
    static ArrayList<Socket> sockets = new ArrayList<>();
    Socket socket;
    public NameServerTh(Socket socket) {
        this.socket = socket;
        sockets.add(socket);
    }
    @Override
    public void run() {
        try {
            for(int i = 0; i < sockets.size(); i++) {
                OutputStream out = sockets.get(i).getOutputStream();
                ObjectOutputStream oos = new ObjectOutputStream(out);
                oos.writeObject(NameCardServer.writeNameCard());
                oos.flush();
                oos.close();
                System.out.println(sockets.get(i).getRemoteSocketAddress().toString() + "에게 전송 완료.");
		            out.close();
						}
        } catch(IOException e) { }

    }
}

클라이언트

public class NameCardClient {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost", 8990);
            System.out.println("서버 접속 성공");
            Thread nameClientTh = new NameClientTh(socket);
            nameClientTh.start();

        } catch (Exception e) {}
    }
}
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.net.Socket;
import java.util.List;

public class NameClientTh extends Thread {
    Socket socket;
    public NameClientTh(Socket socket) {
        this.socket = socket;
    }
    void viewNameCards(List<NameCardInfo> nameCards) {
        for(NameCardInfo e : nameCards) {
            System.out.println("====== 명함 정보 출력 ======");
            System.out.println("이름 : " + e.getName());
            System.out.println("회사 : " + e.getCompany());
            System.out.println("전화번호 : " + e.getPhone());
            System.out.println("이메일 : " + e.getEmail());
        }
    }

    @Override
    public void run() {
        InputStream input = null;
        ObjectInputStream ois;
        List<NameCardInfo> nameCards;
        try {
            while(true) {
                input = socket.getInputStream();
                ois = new ObjectInputStream(input);
                nameCards = (List<NameCardInfo>) ois.readObject();
                viewNameCards(nameCards);
            }
        } catch (EOFException e) {
            System.out.println("<< 명함 수신이 완료 되었습니다. 작업을 종료 합니다. >>");
            if(input != null) {
                try {
                    input.close();
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
            }
        } catch(IOException | ClassNotFoundException e) {
            System.out.println(e);
        }
    }
}

3. TCP/IP를 이용해 이미지 파일 전송하기

  • 전송할 파일을 선택하세요. (경로명/파일이름) - 서버 사이드
  • 전송이 끝나면 전송 완료 표시
  • 서버에서 파일이 전송되었습니다. 저장할 경로를 지정 하세요. - 클라이언트 사이드
  • 해당 경로로 파일 저장
  • 두번째 단계는 연결된 클라이언트의 개수에 상관없이 모든 클라이언트에게 전송하기

Server

public class ImageSocketServer {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        int port = 8999;
        Scanner sc = new Scanner(System.in);
        System.out.print("전송할 파일을 선택하세요.(경로/파일명) : ");
        String path = sc.nextLine();
        System.out.println("파일명 : " + path);
        try {
            serverSocket = new ServerSocket(port);
            while(true) {
                Socket socket = serverSocket.accept();
                System.out.print("[클라이언트 : " + socket.getRemoteSocketAddress() + "연결 되었습니다.");
                Thread server = new ImageServerTh(socket, path);
                server.start();

            }
        } catch (ConnectException e) {
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
public class ImageServerTh extends Thread {
    Socket socket;
    String fileName;
    static ArrayList<Socket> sockets = new ArrayList<>();
    public ImageServerTh(Socket socket, String fileName) {
        this.socket = socket;
        this.fileName = fileName;
        sockets.add(socket);
    }

    @Override
    public void run() {
        int len;
        byte[] buffer = new byte[1024];
        try {
            for(int i = 0; i < sockets.size(); i++) {
                FileInputStream fis = new FileInputStream(fileName);
                OutputStream out = sockets.get(i).getOutputStream();
                while((len = fis.read(buffer)) != -1) {
                    out.write(buffer, 0, len);
                }
                out.flush();
                out.close();
                System.out.println(sockets.get(i).getRemoteSocketAddress() + "에게 전송 완료.");
            }
        } catch(IOException e) { }
    }
}

클라이언트

public class ImageSocketClient {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        try {
            Socket socket = new Socket("localhost", 8999);
            System.out.println("서버 접속 성공");
            System.out.print("저장할 위치를 지정하세요.(경로/파일명) : ");
            String path = sc.nextLine();
            Thread nameClientTh = new ImageClientTh(socket, path);
            nameClientTh.start();

        } catch (Exception e) {}
    }
}
public class ImageClientTh extends Thread {
    Socket socket;
    String path;
    public ImageClientTh(Socket socket, String path) {
        this.socket = socket;
        this.path = path;
    }

    @Override
    public void run() {
        try {
            InputStream input = socket.getInputStream();
            FileOutputStream fos = new FileOutputStream(path);
            int len;
            byte[] buffer = new byte[1024];
            while((len = input.read(buffer)) != -1) {
                fos.write(buffer, 0, len);
            }
            System.out.println("이미지 전송 완료 !!!!!");
            fos.flush();
            fos.close();
        } catch(IOException e) {
            System.out.println(e);
        }

    }
}
profile
풀스택 예비 개발자

0개의 댓글