본문 바로가기
Programming Study/절대JAVA

[절대JAVA]11장 프로그래밍 연습문제(2)

by 푸고배 2018. 10. 5.

fromefile.txt
다운로드
originfile.txt
다운로드

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

- 클래스 이름은 Rename

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

- java Rename fromfile tofile

<소스코드>

package Chapter11_5;

import java.io.File;

public class Rename {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 입력받는 파일들은 txt라고 가정
		String path = "C:\\Users\\doqtq\\Documents\\절대JAVA\\Chapter11\\src\\Chapter11_5";
		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라는 이름의 파일이 존재하지 않습니다.");
		}
	}

}

 

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

- 클래스 이름은 FileCopy

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

- java FileCopy originfile copyfile

<소스코드>

package Chapter11_6;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class FileCopy {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int data;
		String path = "C:\\Users\\doqtq\\Documents\\절대JAVA\\Chapter11\\src\\Chapter11_6";
		// 입력받는 파일들은 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("파일이 없습니다.");
		}
	}

}

 

 

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

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

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

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

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

- connect : 서버에 접속하기

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

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

<소스코드>

Server

ChatServer.java

package Chapter11_7_1;

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();
	}

}

MsgReceiver.java

package Chapter11_7_1;

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();
		}
	}

}

 

MsgSender.java

package Chapter11_7_1;

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();
		}
	}
	
}

 

Client

ChatCilent.java

package Chapter11_7_2;

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();
		}
	}

}


MsgReceiver.java

package Chapter11_7_2;

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();
				}
			}
		}
		
	}
}


MsgSender.java

package Chapter11_7_2;

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();
				}
			}
		}
	}
	
}

 

참고자료 : 인피니티북스 절대 JAVA

github 주소 : 

https://github.com/ch1517/Network-programming/tree/master/Chapter11

반응형

댓글