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
반응형
'Programming Study > 절대JAVA' 카테고리의 다른 글
[절대JAVA]11장 프로그래밍 연습문제(1) (0) | 2018.10.04 |
---|---|
[절대JAVA]10장 프로그래밍 연습문제(2) (0) | 2018.10.03 |
[절대JAVA]10장 프로그래밍 연습문제(1) (0) | 2018.10.01 |
[절대JAVA]9장 프로그래밍 연습문제(2) (0) | 2018.09.29 |
[절대JAVA]9장 프로그래밍 연습문제(1) (0) | 2018.09.28 |
댓글