개발/Java / / 2022. 4. 15.

절대JAVA Chapter11 입출력과 네트워크, 프로그래밍 연습

728x90
반응형

1. 다음 조건을 만족하도록 파일을 복사하는 프로그램을 작성하시오.

- 현재 소스 파일을 읽어 한 줄의 가장 처음에 줄 번호가 나오도록 하여 다시 새로운 파일에 복사

- 만일 MyClass.java라면 줄 번호가 있는 파일은 MyClass.num으로

 

import java.io.*;
import java.net.*;

public class MyClass {
	
	public static void main(String[]args) {
		int data;
		int num = 1;	//줄 번호
		//불러올 파일 경로  + 이름
		String inFname = "C:\\Users\\seongjin\\eclipse-workspace\\Chapter11_one\\src\\MyClass.java";
		//새로 만들 파일 경로 + 이름
		String outFname = "C:\\Users\\seongjin\\eclipse-workspace\\Chapter11_one\\src\\MyNum.java";
		
		try {
			// 읽을 파일 이름으로 FileInputStream 생성
			FileInputStream fis = new FileInputStream(inFname);
			FileOutputStream fout = new FileOutputStream(outFname);
			//인코딩을 위해
			InputStreamReader isr = new InputStreamReader(fis, "MS949");
			OutputStreamWriter osw = new OutputStreamWriter(fout,"ms949");
			while((data = isr.read()) != -1) {
				char c = (char)data;
				if(num == 1){	//첫번째 줄에 번호를 매기 위한 예외 처리
					osw.write(num+++"  ");
				}
				osw.write(c);
				if(c == '\n') {
					osw.write(num+++"  ");
				}
			}
			osw.flush();
			isr.close();
			osw.close();
			fis.close();
			fout.close();
			System.out.println(outFname + "  : 파일이 생성되었습니다.");
		}catch(FileNotFoundException e) {
			System.err.println("다음 파일이 없습니다. : " + inFname);
		}catch(IOException e) {
			System.out.println(e);
		}
	}

}

https://github.com/sjpark2710/Java-Practice/tree/master/Chapter11_one

 

GitHub - sjpark2710/Java-Practice: 절대자바 연습

절대자바 연습. Contribute to sjpark2710/Java-Practice development by creating an account on GitHub.

github.com

2. 다음 조건을 만족하도록 이미지 파일을 처리하는 프로그램을 작성하시오.

- 확장자 jpg의 이미지 파일을 읽어 표준 출력에 출력

import java.io.*;
import java.net.*;

public class Two {
	public static void main(String[]args) {
		int data;
		String inFname = "C:\\Users\\seongjin\\eclipse-workspace\\Chapter11_two\\src\\car1.jpg";
		try {
			FileInputStream fis = new FileInputStream(inFname);
			while((data = fis.read()) != -1) {
				System.out.println((char)data);
			}
		}catch(FileNotFoundException e) {
			System.err.println("다음 파일이 없습니다" + inFname);
		}catch(IOException e){
			System.out.println(e);
		}
	}

}

 

https://github.com/sjpark2710/Java-Practice/tree/master/Chapter11_two/src

 

GitHub - sjpark2710/Java-Practice: 절대자바 연습

절대자바 연습. Contribute to sjpark2710/Java-Practice development by creating an account on GitHub.

github.com

3. 다음 조건을 만족하며 현재 폴더의 하부 파일을 출력하는 프로그램을 작성하시오.

- 하부 폴더와 일반 파일을 구분하여 출력

import java.io.*;
import java.net.*;

public class Three {
	public static void main(String[]args) {
		String name = "C:\\Users\\seongjin\\eclipse-workspace\\Chapter11-Three\\src";
		
		File f = new File(name);
		File[] flist = f.listFiles();
		for(File i : flist) {
			if(i.isDirectory()) {
				System.out.print("폴더 : ");
			}else {
				System.out.print("파일 : ");
			}
			System.out.println(i.getName());
		}
		
		
		
	}

}

https://github.com/sjpark2710/Java-Practice/tree/master/Chapter11-Three

 

GitHub - sjpark2710/Java-Practice: 절대자바 연습

절대자바 연습. Contribute to sjpark2710/Java-Practice development by creating an account on GitHub.

github.com

 

4. 다음 조건을 만족하며 지정한 이름의 폴더를 생성하는 프로그램을 작성하시오.

- 명령행에서 폴더 이름을 입력받아 생성

import java.io.*;

public class Four {
	public static void main(String[]args) {
		String path = "C:\\Users\\seongjin\\eclipse-workspace\\Chapter11_Four1";
		File f = new File(path,args[0]);
		try {
			f.mkdir();
		}catch(Exception e) {
			System.out.println(e);
		}
	}
}

https://github.com/sjpark2710/Java-Practice/tree/master/Chapter11_Four/src

 

GitHub - sjpark2710/Java-Practice: 절대자바 연습

절대자바 연습. Contribute to sjpark2710/Java-Practice development by creating an account on GitHub.

github.com

 

5. 다음 조건을 만족하며 파일 이름을 수정하는 프로그램을 작성하시오.

- 클래스 이름은 Rename

- 명령행에서 이전파일이름 새파일이름 순으로 입력되도록 구현

- java Rename fromfile tofile

import java.io.*;

public class Rename {
	public static void main(String[]args) {
		String path = "C:\\Users\\seongjin\\eclipse-workspace\\Chapter11_Five\\src";
		File file = new File(path,args[0] + ".txt");
		File newfile = new File(path,args[1] + ".txt");
		if(file.exists()) {
			file.renameTo(newfile);
			System.out.println(args[0] + "->" + args[1]);
		}else {
			System.out.println(args[0] + ".txt라는 이름의 파일이 존재하지 않습니다.");
		}
	}

}

https://github.com/sjpark2710/Java-Practice/tree/master/Chapter11_Four/src

 

GitHub - sjpark2710/Java-Practice: 절대자바 연습

절대자바 연습. Contribute to sjpark2710/Java-Practice development by creating an account on GitHub.

github.com

6. 다음 조건을 만족하며 기존 파일을 새로운 파일로 복사하는 프로그램을 작성하시오.

- 클래스 이름은 FileCopy

- 명령행에서 기본파일이름 복사된새파일이름 순으로 입력되도록 구현

- java FileCopy originfile copyfile

package chapter11_Six;
import java.io.*;

public class FileCopy {
	public static void main(String[]args) {
		int data;
		String path = "C:\\Users\\seongjin\\eclipse-workspace\\chapter11_Six\\src\\chapter11_Six";
		// 입력받는 파일들은 txt라고 가정
		File file = new File(path,args[0]+".txt");
		File newfile = new File(path,args[1]+".txt");
		
		if(file.exists()) {
			try {
				newfile.createNewFile();
				// 읽을 파일 이름으로 FileInputStream 생성
				FileInputStream fis = new FileInputStream(file);
				FileOutputStream fout = new FileOutputStream(newfile);
				// 인코딩을 위해
				InputStreamReader isr = new InputStreamReader(fis, "MS949");
				OutputStreamWriter osw = new OutputStreamWriter(fout, "MS949");
				
				while((data=isr.read())!=-1) {
					char c = (char)data;
					osw.write(c);
				}
				osw.flush();//OutputStreamWriter의 버퍼를 비운다. (출력한다.) 
				isr.close();
				osw.close();
				fis.close();
				fout.close();
				System.out.println("복사가 완료되었습니다.");
			}catch(FileNotFoundException e) {
				System.out.println(e);
			}catch (IOException e) {
				System.out.println(e);
			}catch (Exception e) {
				System.out.println(e);
			}
		} else {
			System.err.println("파일이 없습니다.");
		}
	}

}

https://github.com/sjpark2710/Java-Practice/tree/master/chapter11_Six

 

GitHub - sjpark2710/Java-Practice: 절대자바 연습

절대자바 연습. Contribute to sjpark2710/Java-Practice development by creating an account on GitHub.

github.com

 

7. 다음 조건을 만족하도록 1:1 채팅 프로그램을 작성하시오.

- 클라이언트에서 입력받을 내용

- 클라이언트의 이름을 표준입력으로 저장

- 서버의 IP 주소를 표준입력으로 저장

- 클라이언트의 간단한 메뉴를 제공하여 실행되도록 구현

- connect : 서버에 접속하기

- bye : 접속 종료하고 클라이언트만 프로그램 종료

- quit : 접속 종료하고 클라이언트와 서버 함께 종료

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;


public class ChatServer {
	public static int  port = 1004;
	ServerSocket server;
	Socket socket;
	
	public ChatServer(int port) {
		this.port = port;
		System.out.println(">> 서버를 시작합니다.");
		try {
			server = new ServerSocket(port);
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
	public void communicate() {
		System.out.println(">> 클라이언트가 접속하길 기다리고 있습니다.(포트번호 : "+port+")");
		try {
			// 클라이언트 접속 때까지 대기
			socket = server.accept();
			System.out.println(socket.getInetAddress());
			printInfo();
			// 서버 소켓에 입력과 출력을 위한 sender와 receiver를 연결
			MsgSender sender = new MsgSender("서버", socket);
			MsgReceiver receiver = new MsgReceiver("서버", socket);
			// sender와 receiver의 스레드를 실행
			receiver.start();
			sender.start();
		}  catch(SocketException e){
			System.out.println("알 수 없는 이유로 인해 연결이 끊겼습니다.");
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
	public void close() {
		try {
			// 클라이언트 소켓 종료
			socket.shutdownOutput();
			socket.shutdownInput();
			socket.close();
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
	public void printInfo() {
		System.out.println(">> 클라이언트가 접속에 성공했습니다.");
		// 서비스 포트 번호와 클라이언트 주소와 포트번호 출력
		System.out.println("     서버 포트번호: "+socket.getLocalPort());
		System.out.println("     클라이언트 주소: "+socket.getInetAddress());
		System.out.println("     클라이언트 포트번호: "+socket.getPort());
		System.out.println(">>클라이언트에 전달할 메시지를 쓰고 Enter를 누르세요. \n");
	}
	public static void start() {
		ChatServer myServer = new ChatServer(port);
		myServer.communicate();
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		start();
	}

}

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.SocketException;

public class MsgReceiver extends Thread{
	String nickname;
	Socket socket;
	BufferedReader in;
	
	public MsgReceiver(String nickname, Socket socket) {
		this.nickname = "["+nickname+"]";
		this.socket = socket;
		try {
			//소켓에 입력 스트림을 연결
			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		}catch (IOException e) {
			System.out.println(e.toString());
			// TODO: handle exception
		}
	}
	public void byeClient() {
		while(in != null){	
			try {
				//소켓으로부터 받은 메시지를 화면에 출력
				String r = in.readLine();
				if(r==null) { // quit 입력으로 인해 연결이 끊어졌을 때
					in.close();
					socket.close();
					System.exit(0);
				}else {
					System.out.println(r);
				}
			}catch(SocketException e) { // client의 연결이 비정상적으로 끊겼을 때(=bye 입력시)
				ChatServer.port = ChatServer.port+1; // port 번호 바꾸고
				ChatServer.start();
				break;
			}catch(IOException e) {
				System.out.println(e.toString());
			} catch (Exception e) {
				System.out.println("연결을 종료하였습니다.");
				System.exit(0);
			}
		}
	}
	public void run() {
		try {
			byeClient();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

 

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class MsgSender extends Thread {
	String nickname;
	Socket socket;
	PrintWriter out;
	
	public MsgSender(String nickname, Socket socket) {
		this.nickname = "["+nickname+"]";
		this.socket = socket;
		try {
			//소켓에 출력 스트림을 연결
			out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
		}catch (IOException e) {
			System.out.println(e.toString());
		}
	}
	public void run() {
		Scanner s = new Scanner(System.in);
		while(out != null){
			String msg = s.nextLine();
			//보내는 사람의 별명까지 앞에 붙여 전송
			out.println(nickname+msg);
			out.flush();
		}
	}
	
}

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

import Chapter11_7_1.ChatServer;


public class ChatClient {
	Socket socket;
	BufferedReader in;
	PrintWriter out;
	String nickname;
	public ChatClient(String ip, int port) {
		try {
			socket = new Socket(ip, port);
			printInfo();
		}catch (IOException e) {
			e.printStackTrace();
		} 
	}
	public void communicate() {
		// 클라이언트 소켓에 입력과 출력을 위한 sender와 receiver를 연결
		MsgSender sender = new MsgSender(nickname, socket);
		MsgReceiver receiver = new MsgReceiver(nickname, socket);
		// sender와 receiver의 스레드를 실행
		sender.start();
		receiver.start();
	}
	public void close() {
		try {
			// 클라이언트 소켓 종료
			socket.shutdownOutput();
			socket.shutdownInput();
			socket.close();
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
	public void printInfo() {
		System.out.println(">> 서버 접속에 성공했습니다.");
		System.out.println("     클라이언트 포트번호: "+socket.getLocalPort());
		System.out.println("     서버 주소: "+socket.getInetAddress());
		System.out.println("     서버 포트번호: "+socket.getPort());
		System.out.print("닉네임 : ");
		Scanner s = new Scanner(System.in);
		nickname = s.nextLine();
		System.out.println(">>서버에 전달할 메시지를 쓰고 Enter를 누르세요. \n");
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		System.out.println("서버 연결 원할 시 'connect'입력");
		Scanner s = new Scanner(System.in);
		String word = s.nextLine();
		String ip;
		int port;
		if(word.equals("connect")) {
			System.out.print("IP : ");
			ip = s.nextLine();
			System.out.print("Port : ");
			port = s.nextInt();
			ChatClient client = new ChatClient(ip, port);
			client.communicate();
		}
	}

}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.Scanner;

public class MsgReceiver extends Thread{
	String nickname;
	Socket socket;
	BufferedReader in;
	
	public MsgReceiver(String nickname, Socket socket) {
		this.nickname = "["+nickname+"]";
		this.socket = socket;
		try {
			//소켓에 입력 스트림을 연결
			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		}catch (IOException e) {
			System.out.println(e.toString());
			// TODO: handle exception
		}
	}
	public void run() {
		while(in != null){
			try {
				//소켓으로부터 받은 메시지를 화면에 출력
				System.out.println(in.readLine());
			} catch(IOException e) {
				System.out.println("소켓연결을 종료했습니다");
				try {
					in.close();
					socket.close();
					System.exit(0);
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		}
		
	}
}
import java.awt.Window;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class MsgSender extends Thread {
	String nickname;
	Socket socket;
	PrintWriter out;
	
	public MsgSender(String nickname, Socket socket) {
		this.nickname = "["+nickname+"]";
		this.socket = socket;
		try {
			//소켓에 출력 스트림을 연결
			out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
		}catch (IOException e) {
			System.out.println(e.toString());
		}
	}
	public void run() {
		Scanner s = new Scanner(System.in);
		while(out != null){
			String msg = s.nextLine();
			out.println(nickname+msg);
			out.flush();
			//보내는 사람의 별명까지 앞에 붙여 전송
			if(msg.equals("quit")){
				try {
					out.close();
					socket.close(); 
					System.exit(0);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(msg.equals("bye")){
				try {
					 
					System.exit(0);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	
}

https://github.com/sjpark2710/Java-Practice/tree/master/Chapter11_Seven

 

GitHub - sjpark2710/Java-Practice: 절대자바 연습

절대자바 연습. Contribute to sjpark2710/Java-Practice development by creating an account on GitHub.

github.com

https://github.com/sjpark2710/Java-Practice/tree/master/Chapter11_Seven1

 

GitHub - sjpark2710/Java-Practice: 절대자바 연습

절대자바 연습. Contribute to sjpark2710/Java-Practice development by creating an account on GitHub.

github.com

 

728x90
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유