관리 메뉴

거니의 velog

230911_입출력 5 본문

대덕인재개발원_자바기반 애플리케이션

230911_입출력 5

Unlimited00 2023. 9. 11. 13:15

[ReporterSelect.java]

package kr.or.ddit.basic.tcp;

import java.util.Arrays;
import java.util.Collections;

public class ReporterSelect {

	public static void main(String[] args) {
		
		String[][] members = {
				{"정소현", "최성동", "강민택", "강진석"},
				{"이건정", "박상협", "한동욱", "전민균"},
				{"장낙훈", "김영진", "신찬섭", "하지웅"},
				{"최룡", "민지현", "김선욱"},
				{"김지호", "홍창용", "서강민", "전승표"},
				{"최예원", "송시운", "김민채"}
		};
		
		String[] reporters = new String[members.length];
		
		for(int i=0; i<members.length; i++) {
			int index = (int)(Math.random() * members[i].length);
			reporters[i] = members[i][index];
		}
		
		System.out.println("== 각 조별 발표자 ==");
		
		for(int i=0; i<reporters.length; i++) {
			System.out.println((i+1) + " 조 발표자 : " + reporters[i]);
		}
		
		Collections.shuffle(Arrays.asList(reporters));
		System.out.println("발표 순서 : " + Arrays.deepToString(reporters));
		
	}

}


[Sender.java]

package kr.or.ddit.basic.tcp;

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

// 이 클래스는 소켓을 통해서 메시지를 보내는 역할을 담당하는 쓰레드 클래스이다.
public class Sender extends Thread {
	
	private Socket socket;
	private DataOutputStream dout;
	
	private Scanner scan;
	private String name;
	
	// 생성자
	public Sender(Socket socket) {
		this.socket = socket;
		scan = new Scanner(System.in);
		
		System.out.print("대화명 입력 >> ");
		name = scan.nextLine();
		
		try {
			dout = new DataOutputStream(this.socket.getOutputStream());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void run() {
		while(dout != null) {
			try {
				dout.writeUTF(name + " : " + scan.nextLine());
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
}

[Receiver.java]

package kr.or.ddit.basic.tcp;

import java.io.DataInputStream;
import java.net.Socket;

// 이 클래스는 소켓에서 메시지를 받아서 화면에 출력하는 역할을 담당하는 쓰레드 클래스이다.
public class Receiver extends Thread {

	private Socket socket;
	private DataInputStream din;
	
	// 생성자
	public Receiver(Socket socket) {
		this.socket = socket;
		try {
			din = new DataInputStream(this.socket.getInputStream());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	@Override
	public void run() {
		while(din != null) {
			try {
				System.out.println(din.readUTF());
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
}

[TcpServer03.java]

package kr.or.ddit.basic.tcp;

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

public class TcpServer03 {

	public static void main(String[] args) throws IOException {
		
		// ServerSocket을 생성하고, 클라이언트가 접속해 오면 소켓을 만들어서
		// 메시지를 받는 쓰레드와 메시지를 보내는 쓰레드에 이 소켓을 주입 시킨다.
		ServerSocket server = new ServerSocket(7777);
		
		System.out.println("서버가 준비중입니다...");
		
		Socket socket = server.accept();
		
		Sender sender = new Sender(socket);
		Receiver receiver = new Receiver(socket);
		
		sender.start();
		receiver.start();
		
	}

}

[TcpClient03.java]

package kr.or.ddit.basic.tcp;

import java.net.Socket;

public class TcpClient03 {

	public static void main(String[] args) {
		
		try {
//			Socket socket = new Socket("localhost", 7777);
			Socket socket = new Socket("192.168.36.115", 7777);
			System.out.println("서버에 연결되었습니다...");
			System.out.println();
			
			Sender sender = new Sender(socket);
			Receiver receiver = new Receiver(socket);
			
			sender.start();
			receiver.start();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

}

- D:\A_TeachingMaterial\03_HighJava\workspace\javaNetworkTest\bin

- cmd라고 쓰고 엔터 2번(클라이언트, 서버용)

- 서버용 : java kr.or.ddit.basic.tcp.TcpServer03

- 클라이언트용 : java kr.or.ddit.basic.tcp.TcpClient03


[TcpFileClient.java]

package kr.or.ddit.basic.tcp;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.Socket;

/*
 * 파일을 전송하는 프로그램 작성하기
 * 
 * - 클라이언트 프로그램 ==> 클라이언트 프로그램은 서버와 접속이 완료되면
 * 		'd/d_other'폴더에 있는 '펭귄.jpg'파일을 서버로 전송한다.
 * 		==> 파일 스트림으로 읽어서 소켓 스트림으로 출력한다.
 * 
 * - 서버용 프로그램 ==> 서버용 프로그램은 클라이언트와 접속이 성공하고
 * 		클라이언트가 보내온 파일 데이터를 받아서 'd/d_other/uploads/' 폴더에
 * 		저장한다.
 * 		==> 소켓 스트림으로 읽어서 파일 스트림으로 출력한다.
 */
public class TcpFileClient {
	
	private void clientStart() {
		// 파일을 읽어서 Socket으로 쓰기 : 전송
		File file = new File("d://d_other/펭귄.jpg");
		
		String fileName = file.getName();
		if(!file.exists()) {
			System.out.println(fileName + " 파일이 없습니다.");
			System.out.println("작업을 중단합니다...");
			return;
		}
		
		try {
			Socket socket = new Socket("localhost", 7777);
			System.out.println("파일 전송 시작...");
			
			// Socket용 OutputStream 객체 생성
			DataOutputStream dout = new DataOutputStream(socket.getOutputStream());
			BufferedOutputStream bout = new BufferedOutputStream(dout);
			
			// 서버에 접속하면 첫번째로 전송할 파일의 파일명을 전송한다.
			dout.writeUTF(fileName);
			
			// 파일 입력용 InputStream 객체 생성
			BufferedInputStream bin = new BufferedInputStream(
						new FileInputStream(file)
					);
			
			byte[] temp = new byte[1024];
			int length = 0;
			
			// 파일 내용 읽어와 소켓으로 전송하기
			while( (length = bin.read(temp)) > 0 ) {
				bout.write(temp, 0, length);
			}
			bout.flush(); // 현재 버퍼에 저장된 내용을 클라이언트로 전송하고 버퍼를 비운다.
			
			System.out.println("파일 전송 완료...");
			
			// 스트림과 소켓 닫기
			bin.close();
			bout.close();
			socket.close();
			
		} catch (Exception e) {
//			e.printStackTrace();
			System.out.println("파일 전송 실패 : " + e.getMessage());
		}
	}
	
	public static void main(String[] args) {
		
		new TcpFileClient().clientStart();
		
	}

}

[TcpFileServer.java]

package kr.or.ddit.basic.tcp;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/*
 * 파일을 전송하는 프로그램 작성하기
 * 
 * - 클라이언트 프로그램 ==> 클라이언트 프로그램은 서버와 접속이 완료되면
 * 		'd/d_other'폴더에 있는 '펭귄.jpg'파일을 서버로 전송한다.
 * 		==> 파일 스트림으로 읽어서 소켓 스트림으로 출력한다.
 * 
 * - 서버용 프로그램 ==> 서버용 프로그램은 클라이언트와 접속이 성공하고
 * 		클라이언트가 보내온 파일 데이터를 받아서 'd/d_other/uploads/' 폴더에
 * 		저장한다.
 * 		==> 소켓 스트림으로 읽어서 파일 스트림으로 출력한다.
 */
public class TcpFileServer {

	private void serverStart() {
		// Socket으로 읽어서 file로 쓴다.
		File saveDir = new File("d://d_other/uploads");
		if(!saveDir.exists()) { // 저장할 폴더가 없으면 새 폴더로 만들어준다.
			saveDir.mkdirs();
		}
		
		try {
			ServerSocket server = new ServerSocket(7777);
			System.out.println("서버가 준비중입니다...");
			
			Socket socket = server.accept(); // 클라이언트의 요청을 기다린다.
			
			System.out.println("파일 저장 시작...");
			
			// 소켓용 입력 스트림 객체 생성
			DataInputStream din = new DataInputStream(socket.getInputStream());
			BufferedInputStream bin = new BufferedInputStream(din);
			
			// 클라이언트가 접속되었을 때 첫 번째로 보내온 파일 이름을 받는다.
			String fileName = din.readUTF();
			
			File saveFile = new File(saveDir, fileName);
			
			// 파일 출력용 스트림 객체 생성
			BufferedOutputStream bout = new BufferedOutputStream(
						new FileOutputStream(saveFile)
					);
			
			byte[] temp = new byte[1024];
			int length = 0;
			
			while( (length = bin.read(temp)) > 0 ) {
				bout.write(temp, 0, length);
			}
			bout.flush();
			
			System.out.println("파일 저장 완료");
			
			// 스트림과 소켓 닫기
			bin.close();
			bout.close();
			socket.close();
			
		} catch (Exception e) {
//			e.printStackTrace();
			System.out.println("파일 저장 실패!! " + e.getMessage());
		}
	}
	
	public static void main(String[] args) {
		
		new TcpFileServer().serverStart();
		
	}

}

- 서버 : java kr.or.ddit.basic.tcp.TcpFileServer

- 클라이언트 : java kr.or.ddit.basic.tcp.TcpFileClient


[TcpFileClient2.java]

package kr.or.ddit.basic.tcp;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.Socket;

/*
 * 파일을 전송하는 프로그램 작성하기
 * 
 * - 클라이언트 프로그램 ==> 클라이언트 프로그램은 서버와 접속이 완료되면
 * 		'd/d_other'폴더에 있는 '펭귄.jpg'파일을 서버로 전송한다.
 * 		==> 파일 스트림으로 읽어서 소켓 스트림으로 출력한다.
 */
public class TcpFileClient2 {
	
	private void clientStart() {
		// 전송할 파일 정보를 갖는 File객체 생성
		File file = new File("d://d_other/펭귄.jpg");
		if(!file.exists()) {
			System.out.println(file.getPath() + " 파일이 없습니다.");
			System.out.println("작업을 중단합니다...");
			return;
		}
		
		Socket socket = null;
		BufferedInputStream bin = null;
		BufferedOutputStream bout = null;
		DataOutputStream dout = null;
		try {
			socket = new Socket("localhost", 7777);
			
			System.out.println("파일 전송 시작...");
			
			// 파일 입력용 스트림 객체 생성
			bin = new BufferedInputStream(new FileInputStream(file));
			
			// 소켓으로 출력할 스트림 객체 생성
			dout = new DataOutputStream(socket.getOutputStream());
			bout = new BufferedOutputStream(dout);
			
			// 서버에 접속하면 처음으로 파일명을 전송한다.
			dout.writeUTF(file.getName());
			
			// 파일이름 전송이 완료되면 파일의 내용을 읽어서 전송한다.
			byte[] temp = new byte[1024];
			int len = 0;
			while( (len = bin.read(temp)) != -1 ) {
				bout.write(temp, 0, len);
			}
			bout.flush();
			
			System.out.println("파일 전송 완료...");
			
		} catch (Exception e) {
//			e.printStackTrace();
			System.out.println("파일 전송 실패 : " + e.getMessage());
		} finally {
			// 스트림과 소켓 닫기
			if(dout != null) try { dout.close(); } catch (Exception e2) {}
			if(bout != null) try { bout.close(); } catch (Exception e2) {}
			if(bin != null) try { bin.close(); } catch (Exception e2) {}
			if(socket != null) try { socket.close(); } catch (Exception e2) {}
		}
	}
	
	public static void main(String[] args) {
		
		new TcpFileClient2().clientStart();
		
	}

}

[TcpFileServer2.java]

package kr.or.ddit.basic.tcp;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/*
 * 파일을 전송하는 프로그램 작성하기
 * 
 * - 서버용 프로그램 ==> 서버용 프로그램은 클라이언트와 접속이 성공하고
 * 		클라이언트가 보내온 파일 데이터를 받아서 'd/d_other/uploads/' 폴더에
 * 		저장한다.
 * 		==> 소켓 스트림으로 읽어서 파일 스트림으로 출력한다.
 */
public class TcpFileServer2 {

	private void serverStart() {
		File saveDir = new File("d://d_other/uploads"); // 저장할 폴더 설정
		if(!saveDir.exists()) { // 저장 폴더가 없으면 새로 만든다.
			saveDir.mkdirs();
		}
		
		Socket socket = null;
		DataInputStream din = null;
		BufferedInputStream bin = null;
		BufferedOutputStream bout = null;
		ServerSocket server = null;
		
		try {
			server = new ServerSocket(7777);
			System.out.println("서버가 준비되었습니다...");
			
			socket = server.accept(); // 클라이언트의 접속을 기다린다.
			
			System.out.println("파일 수신 시작...");
			
			// 스트림 객체 생성
			din = new DataInputStream(socket.getInputStream());
			
			// 클라이언트가 처음으로 보낸 자료인 파일명을 받는다.
			String fileName = din.readUTF();
			
			// 수신한 파일명과 저장할 폴더를 이용한 File객체 생성
			File file = new File(saveDir, fileName);
			
			bin = new BufferedInputStream(din);
			bout = new BufferedOutputStream(new FileOutputStream(file));
			
			// 수신한 파일 데이터를 받아서 파일로 저장한다.
			byte[] temp = new byte[1024];
			int len = 0;
			while( (len = bin.read(temp)) != -1 ) {
				bout.write(temp, 0, len);
			}
			bout.flush();
			
			System.out.println("파일 수신 완료...");
			
		} catch (Exception e) {
//			e.printStackTrace();
			System.out.println("파일 수신 실패!! " + e.getMessage());
		} finally {
			if(din != null) try { din.close(); } catch (Exception e2) {}
			if(bout != null) try { bout.close(); } catch (Exception e2) {}
			if(bin != null) try { bin.close(); } catch (Exception e2) {}
			if(socket != null) try { socket.close(); } catch (Exception e2) {}
			if(server != null) try { server.close(); } catch (Exception e2) {}
		}
	}
	
	public static void main(String[] args) {
		
		new TcpFileServer2().serverStart();
		
	}

}

- 서버 : java kr.or.ddit.basic.tcp.TcpFileServer2

- 클라이언트 : java kr.or.ddit.basic.tcp.TcpFileClient2

'대덕인재개발원_자바기반 애플리케이션' 카테고리의 다른 글

230913_JDBC 1  (0) 2023.09.12
230912_입출력 6  (0) 2023.09.11
230908_입출력 4  (0) 2023.09.08
230907_입출력 3  (2) 2023.09.07
230906_입출력 2  (0) 2023.09.06