네트워크를 통해 파일을 전송하는것은 Stream에서 파일 전송의 활용이라고 보면 된다.


Stream을 통해서 읽어온 데이터를 그대로 전송하면 된다.


네트워크 부분은 대부분 비슷하기 때문에 설명은 많이 적지 않고 코드의 주석을 통해 설명




Receiver 클래스



package chap12.exam07.file;

import java.io.FileOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
// 직접 만들어본 리시버
public class Receiver {

	public static void main(String[] args) throws Exception {
		// 데이터를 받으려면 항시 대기하여야 하는데 while문으로 묶어버리면
		// 아래의 코드가 작동되지 않으므로 따로 스레드를 만들어야함
		String path = "C:/img/temp2/aaa.pdf";
		// 1. DatagramSocket 생성
		DatagramSocket socket = new DatagramSocket(5001);
		FileOutputStream fos = new FileOutputStream(path);
		
		Thread th = new Thread(){
			@Override
			public void run() {
				// 2. DatagramPacket 준비 (한번에 받은 메시지 크기)
				DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
				while(true) {
					try {
						socket.receive(packet);		// 3. 데이터 수신
						byte[] character = packet.getData();
						fos.write(character);
					} catch (IOException e) {
						e.printStackTrace();
						break;
					}
				}
			}
		};
		th.setDaemon(true); // main이 끝나면 같이 죽도록 설정
		th.start(); // 스레드 실행
		// 5. 자원 정리
		Thread.sleep(10000);
		socket.close(); // 소켓을 닫고
		// 종료		
	}

}


Main FileReceiver



package chap12.exam07.file;

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

public class FileReceiver {

	public static void main(String[] args) throws Exception {
		// 1. 서버소켓 생성
		ServerSocket server = new ServerSocket(7777);

		while(true) { // 대기
			System.out.println("요청 대기중...");
			// 2. 연결 수락
			Socket socket = server.accept();
			System.out.println("수락");

			Thread th = new Thread() {

				@Override
				public void run() {
					try {
						// 3. 파일 위치 지정
						String path = "C:/img/temp2/";
						
						// 4. 스트림 준비
						BufferedInputStream bis = new BufferedInputStream(socket.getInputStream()); // 파일명 받기
						DataInputStream dis = new DataInputStream(bis);
						path += dis.readUTF();
						System.out.println(path);
						FileOutputStream fos = new FileOutputStream(path);  // 파일 받아오기
						BufferedOutputStream bos = new BufferedOutputStream(fos);

						// 5. 읽기 -> 쓰기
						// 배열로 받을 경우 다른 IP로 전송 시 파일이 깨질 수 있음
						byte[] source = new byte[1024];
						while(dis.read(source) != -1) {
							bos.write(source);
						}
						
//						int data;
//						while((data = dis.read() != -1)) {
//							bos.write(data);
//						}
						bos.flush();
						System.out.println("다운로드 완료");
						bos.close();
						fos.close();
						bis.close();
						dis.close();
						socket.close();
					}catch (Exception e) {
						System.out.println(e.toString());
					}
				}
			};
			th.start();
		}
	}

}


Sender 클래스



package chap12.exam07.file;

import java.io.FileInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class Sender { // 직접 만들어본 sender

	public static void main(String[] args) throws Exception {
		String pathInput = "C:/img/10multi.pdf";
		FileInputStream fis = new FileInputStream(pathInput);
		// 1. DatagramSocket 생성
		DatagramSocket socket = new DatagramSocket();
		int i = 0;
		byte[] buffer = new byte[1024];
		
		while(fis.read(buffer)!=-1) { // -1 == EOF
			// 4. 내보내기
			DatagramPacket packet = new DatagramPacket(buffer, buffer.length, new InetSocketAddress("localhost", 5001));
			socket.send(packet);
			i++;
			System.out.println("파일 복사중... " + i);
		}


		fis.close();
		socket.close();

	}

}


Main FileSender



package chap12.exam07.file;

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

public class FileSender {

	public static void main(String[] args) throws Exception {
		// 1. 파일 위치
		String path = "C:/img/10multi.pdf";
		int i = 0;
		// 2. 스트림 준비 + 소켓(스트림)
		try(
		FileInputStream fis = new FileInputStream(path);
		BufferedInputStream bis = new BufferedInputStream(fis);
		Socket socket = new Socket("여기에 IP를 입력해야 정상적으로 동작해요">", 7777);
		BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
		DataOutputStream dos = new DataOutputStream(bos);
		){
			// 3. 읽어오기 -> 전송(파일 바이너리 + 파일 명)
			String[] name = path.split("/");
			dos.writeUTF(name[name.length-1]); // -1번방의 내용을 전송
			dos.flush();
			
			// 파일 바이너리 전송
			byte[] source = new byte[1024];
			while(bis.read(source) != -1 ) {  // 한번의 루프로 1024바이트(1kb) 전송
				dos.write(source);
				// 전송 진행율 표시를 어떻게 할 것인가????
				i++;
				System.out.println("파일 전송중..." + i + " / " + source.length);
			}
			dos.flush();
			System.out.println("전송 완료...!");
			
		} catch (Exception e) {
			System.out.println(e.toString());
		}
	}

}


File Sender의 19번째 줄에 접속할 대상의 IP를 입력해주어야 한다.


그리고 서버는 이클립스에서 실행하고


클라이언트를 따로 실행해야 하는데


https://qdgbjsdnb.tistory.com/79 를 참조하여 cmd에서 클라이언트를 작동해보자.





'개념 및 코딩 > 10.네트워크' 카테고리의 다른 글

[JAVA]10-06.UDP, Datagram  (0) 2018.09.27
[JAVA]10-05.N:M MultiChat Server, Client  (2) 2018.09.27
[JAVA]10-04.1:1 Chat Server, Client  (0) 2018.09.27
[JAVA]10-03.Echo Server, Client  (0) 2018.09.27
[JAVA]10-02.TCP Server, Client  (0) 2018.09.27

UDP는 TCP와 달리 DatagramSocket과 DatagramPacket을 사용한다.


TCP와의 차이점으로는 일방적인 전송을 하고 확인 작업이 없기 때문에 속도가 빠르지만


정확도가 낮다




Server가 될 Receiver


package chap12.exam06.udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Receiver {

	public static void main(String[] args) throws Exception {
		// 데이터를 받으려면 항시 대기하여야 하는데 while문으로 묶어버리면
		// 아래의 코드가 작동되지 않으므로 따로 스레드를 만들어야함

		// 1. DatagramSocket 생성
		DatagramSocket socket = new DatagramSocket(5001);

		Thread th = new Thread(){

			@Override
			public void run() {
				// 2. DatagramPacket 준비 (한번에 받은 메시지 크기)
				DatagramPacket packet = new DatagramPacket(new byte[100],  100);
				while(true) {
					try {
						socket.receive(packet);		// 3. 데이터 수신
						byte[] character = packet.getData();
						String data = new String(character,  "UTF-8").replace('\0', ' ');
						System.out.println(data);		// 4. 받은 데이터 출력
					} catch (IOException e) {
						e.printStackTrace();
						break;
					}
				}
			}
		};
		th.setDaemon(true); // main이 끝나면 같이 죽도록 설정
		th.start(); // 스레드 실행
		// 5. 자원 정리
		Thread.sleep(10000);
		socket.close(); // 소켓을 닫고
		// 종료		
	}

}


Client가 될 Sender


package chap12.exam06.udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class Sender {

	public static void main(String[] args) throws Exception {
		// 1. DatagramSocket 생성
		DatagramSocket socket = new DatagramSocket();
		// 2. 보낼 메시지 준비
		for(int i = 1; i <= 3; i++) {
			String msg = "data_" + i;
			byte[] arr = msg.getBytes();
			// 3. DatagramPacket으로 전송
			DatagramPacket packet = new DatagramPacket(arr,  arr.length, new InetSocketAddress("localhost", 5001));
			socket.send(packet);
		}

		// 4. 자원 반납
		socket.close();
		
	}

}



서버는 이클립스에서 실행하고


클라이언트를 따로 실행해야 하는데


https://qdgbjsdnb.tistory.com/79 를 참조하여 cmd에서 클라이언트를 작동해보자.



1:1 채팅을 조금 바꾼 다대다, N:M 멀티 채팅이다.


전과 다른점으로는 클라이언트와 서버에 사용할 Receiver, Sender 따로 있는 점이다.





서버 기능을 가지고 있는 ServerManager 클래스


package chap12.exam05.multichat;

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

public class ServerManager extends Thread {
	Socket socket;
	DataInputStream in;
	DataOutputStream out;
	// 서버이기에 in 먼저 일어남
	
	public ServerManager(Socket socket) throws IOException {
		this.socket = socket;
		in= new DataInputStream(socket.getInputStream());
		sendMsg(socket.getPort() + "님이 입장 하였습니다.");
	}

	@Override
	public void run() { // 서버는 메시지를 감지해야 하므로 in을 이용
		while(in != null) {
			try {
				sendMsg(socket.getPort()+"> " + in.readUTF());
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		try {
			in.close();
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void sendMsg(String msg) throws IOException { // MultiServer의 List에서 소켓 리스트를 받아옴
		System.out.println(msg);
		for(Socket soc : MultiServer.list) {
			out = new DataOutputStream(soc.getOutputStream());
			out.writeUTF(msg);
			out.flush();
		}
	}


}




ServerManager를 불러오는 MultiServer


package chap12.exam05.multichat;

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

public class MultiServer {
	static ArrayList<Socket> list = new ArrayList<>();
	
	public static void main(String[] args) throws IOException {
		
		ServerManager manager;
		Socket socket;
		ServerSocket server = new ServerSocket(5252);
		System.out.println("서버 실행 중");
		
		while(true) {
			socket = server.accept(); // 소켓을 기다림
			list.add(socket); // 추가
			manager = new ServerManager(socket);
			manager.start();
		}
	}

}



다음으로는 Client에 필요한 클래스와 메인 클라이언트


Sender


package chap12.exam05.multichat;

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

public class ClientSender extends Thread {
	Socket socket;
	DataOutputStream out;
	
	public ClientSender(Socket socket) throws IOException {
		// 초기화와 동시에 스트림도 잡아주면 효율적
		this.socket = socket;
		out = new DataOutputStream(socket.getOutputStream());
		// socket.getOutputStream을 그대로 형변환 해도 된다.
	}

	@Override
	public void run() {
		while(out != null) {
			System.out.print("당신>");
			Scanner scan = new Scanner(System.in);
			
			try {
				out.writeUTF(scan.nextLine());
				out.flush();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		try {
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}



Receiver



package chap12.exam05.multichat;

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

public class ClientReceiver extends Thread {
	Socket socket;
	DataInputStream in;
	
	public ClientReceiver(Socket socket) throws IOException {
		this.socket = socket;
		in = new DataInputStream(socket.getInputStream());
		// Sender와 크게 차이 없음
	}

	@Override
	public void run() {
		while(in != null) {
			try {
				System.out.println(in.readUTF());
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		try {
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}



실질적으로 동작할 Main MultiClient



package chap12.exam05.multichat;

import java.net.Socket;

public class MultiClient {

	public static void main(String[] args) throws Exception {
		Socket socket = new Socket("여기에 IP를 입력해야 정상적으로 동작해요", 5252);
		System.out.println("연결 성공");
		ClientReceiver receiver = new ClientReceiver(socket);
		ClientSender sender = new ClientSender(socket);
		
		receiver.start();
		sender.start();
	}

}




8번째 줄에 접속할 대상의 IP를 입력해주어야 하고 1개의 컴퓨터로 테스트 할 경우


대상 Server가 자기 자신이므로 자신의 IP를 입력하면 된다.


그리고 서버는 이클립스에서 실행하고


클라이언트를 따로 실행해야 하는데


https://qdgbjsdnb.tistory.com/79 를 참조하여 cmd에서 클라이언트를 작동해보자.



'개념 및 코딩 > 10.네트워크' 카테고리의 다른 글

[JAVA]10-06.File Sender, Receiver  (0) 2018.09.27
[JAVA]10-06.UDP, Datagram  (0) 2018.09.27
[JAVA]10-04.1:1 Chat Server, Client  (0) 2018.09.27
[JAVA]10-03.Echo Server, Client  (0) 2018.09.27
[JAVA]10-02.TCP Server, Client  (0) 2018.09.27

이번에는 1:1 채팅 프로그램으로


채팅을 한번 하고 끝나지 않기 위해서는 반복문을 돌려야만 한다.


또한 통신 기능 외의 작업이 같이 돌아가야 하기 때문에 Thread를 이용한다.






메시지를 받을 서버 Receiver 클래스



package chap12.exam04.chat;

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;

public class Receiver extends Thread {
	private Socket socket = null;

	public Receiver(Socket socket) {
		this.socket = socket;
	}

	@Override
	public void run() {
		try {
			// 4. InputStream으로 보내온 메시지를 받는다.
			InputStream is = socket.getInputStream(); // 핵심
			BufferedInputStream bis = new BufferedInputStream(is);
			InputStreamReader reader = new InputStreamReader(bis, "UTF-8");
			char[] arr = new char[100];
			while(is != null) {  // 스트림으로 반복문 제어
				// 5. 출력
				reader.read(arr);
				// ㅁㅁㅁ는 \0이고 배열의 공백을 의미한다.
				String msg = new String(arr).replace('\0', ' ');
				System.out.println("[상대] " + msg);

				// 긴 문장 후 짧은 문장이 들어올 경우 이전 값과 섞여 들어온다.
				// 초기화
				arr = new char[100];
			}
		} catch (Exception e) {
			System.out.println(e.toString());
		}
	}

}



메시지를 받을 클라이언트 Sender 클래스



package chap12.exam04.chat;

import java.io.BufferedOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;

public class Sender extends Thread {
	private Socket socket = null;
	
	public Sender(Socket socket) {
		this.socket = socket;
	}

	@Override
	public void run() {
		try {
			// 입력값을 받는 Scanner
			Scanner scan = new Scanner(System.in);
			// OutputStream으로 보내온 메시지를 전송한다.
			OutputStream os = socket.getOutputStream();
			BufferedOutputStream bos = new BufferedOutputStream(os);
			OutputStreamWriter writer = new OutputStreamWriter(bos, "UTF-8");

			while(os != null) {
				String msg = scan.nextLine();
				writer.write(msg);
				writer.flush();
				
			}
			
			scan.close();
		} catch (Exception e) {
			System.out.println(e.toString());
		}
	}

}





Receiver와 Sender을 Thread로 만들어 실행해준다.




Server


package chap12.exam04.chat;

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

public class ChatServer {

	public static void main(String[] args) {

		try {
			// 1. 소켓 생성(bind 생략 가능)
			ServerSocket server = new ServerSocket(5001);
			// 2. 접속 수락
			Socket socket = server.accept();
			System.out.println("접속 수락");
			// 3. 받기 전용 스레드 실행
			Receiver receiver = new Receiver(socket);
			receiver.start();
			// 4. 전송 전용 스레드 실행
			Sender sender = new Sender(socket);
			sender.start();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

}





Client


package chap12.exam04.chat;

import java.net.Socket;

public class ChatClient {

	public static void main(String[] args) {
		try {
			// 1. 소켓 생성
			Socket socket = new Socket("여기에 IP를 입력해야 정상적으로 동작해요", 5001);
// 2. 연결 요청 // 3. 받기 전용 스레드 실행 Receiver receiver = new Receiver(socket); receiver.start(); // 4. 전송 전용 스레드 실행 Sender sender = new Sender(socket); sender.start(); } catch (Exception e) { System.out.println(e.toString()); } } }


10번째 줄에 접속할 대상의 IP를 입력해주어야 하고 1개의 컴퓨터로 테스트 할 경우


대상 Server가 자기 자신이므로 자신의 IP를 입력하면 된다.


그리고 서버는 이클립스에서 실행하고


클라이언트를 따로 실행해야 하는데


https://qdgbjsdnb.tistory.com/79 를 참조하여 cmd에서 클라이언트를 작동해보자.

Echo 서버는 메아리처럼 client에서 메시지를 서버에 전송하여


서버가 받은 메시지를 그대로 client에 전송하는 프로그램이다.




서버


package chap12.exam03.echo;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

	public static void main(String[] args) throws Exception {
		// 1. Server Socket 생성
		ServerSocket server = new ServerSocket();
		// 2. IP 개방 (localhost는 자기만 들어오고, 자신의 ip를 입력하면 외부에서 접속가능)
		server.bind(new InetSocketAddress("여기에 IP를 입력해야 정상적으로 동작해요", 5001));
		// 3. 요청 대기
		while(true) {
			System.out.println("Connect Ready");
			Socket socket = server.accept(); // block
			
			// 접속 요청이 있을 경우 요청 주소를 뽑아 낸다.(선택)
			InetSocketAddress addr = (InetSocketAddress) socket.getRemoteSocketAddress();
			System.out.println("접속 완료 : " + addr.getAddress());
			
			// 4. InputStream으로 보내온 메시지를 받는다.
			InputStream is = socket.getInputStream(); // 핵심
			BufferedInputStream bis = new BufferedInputStream(is);
			InputStreamReader reader = new InputStreamReader(bis);
			
			// 5. 출력
			char[]arr = new char[100];
			reader.read(arr);
			// ㅁㅁㅁ는 \0이고 배열의 공백을 의미한다, 38번째 줄의 replace를 생략한다면 이상한 문자를 볼 수 있다.
			String msg = new String(arr).replace('\0', ' ');
			System.out.println("[client] " + msg);
			
			// 6. OutputStream으로 보내온 메시지를 전송한다.
			OutputStream os = socket.getOutputStream();
			BufferedOutputStream bos = new BufferedOutputStream(os);
			OutputStreamWriter writer = new OutputStreamWriter(bos, "UTF-8");
			writer.write(msg);
			writer.flush();
			// 서버는 켜져있어야 하므로 자원반납을 생략
		}
	}

}


클라이언트


package chap12.exam03.echo;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.Socket;

public class Client {

	public static void main(String[] args) throws Exception {
		// 1. 소켓 생성
		Socket socket = new Socket();
		// 2. 접속 요청
		try {
			socket.connect(new InetSocketAddress("여기에 IP를 입력해야 정상적으로 동작해요", 5001));
			System.out.println("접속 완료");
			
			OutputStream os = socket.getOutputStream();
			BufferedOutputStream bos = new BufferedOutputStream(os);
			OutputStreamWriter writer = new OutputStreamWriter(bos,  "UTF-8");
			writer.write("Hello, Server");
			writer.flush();
			// 3. 데이터 전송
			// 4. 받아온 데이터 출력
			InputStream is = socket.getInputStream();
			BufferedInputStream bis = new BufferedInputStream(is);
			InputStreamReader reader = new InputStreamReader(bis);
			
			char[] arr = new char[100];
			reader.read(arr);

			String msg = new String(arr);
			System.out.println("내가 받은 메세지 : " + msg);
			// 5. 자원반납
			os.close();
			bos.close();
			writer.close();
			is.close();
			bis.close();
			reader.close();
		} catch (Exception e) {
			// 
		}
		

	}

}


서버의 19번째 줄과 클라이언트의 20번째 줄에


접속할 대상의 IP를 입력해주어야 하고 1개의 컴퓨터로 테스트 할 경우


대상 Server가 자기 자신이므로 자신의 IP를 입력하면 된다.


그리고 서버는 이클립스에서 실행하고


클라이언트를 따로 실행해야 하는데


https://qdgbjsdnb.tistory.com/79 를 참조하여 cmd에서 클라이언트를 작동해보자.

TCP는 연결지향적 프로토콜로 데이터를 안전하고 정확하게 전달한다.


데이터가 잘 전송 됫는지 확인 작업이 따로 있으며


작업이 추가로 있기 때문에 UDP보다 느리다.





여기서는 Socket을 이용한 통신을 해볼것이다.


Socket은 안에 IP, 포트 등 다양한 정보를 담고


상대방에게 전송된다.


다음의 간단한 예제를 통해 확인해보자.



서버


package chap12.exam02.tcp;

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

public class Server {

	public static void main(String[] args) {

		ServerSocket server = null;

		// 1. 서버 소켓 생성
		try {
			server = new ServerSocket();
			// 2. IP를 개방 (열어주길 원하는 IP, 오픈 호스트), localhost는 자기 자신의 IP를 의미
			server.bind(new InetSocketAddress("localhost", 5001));
			// 3. 요청 대기
			while(true) {
				System.out.println("요청 대기중");
				// 4. 접속 요청이 있을 경우 수락 (하나의 스레드, 조인, 블로킹하여 요청이 올 때 까지 대기)
				Socket socket = server.accept();
				// 4-1. 요청이 있을 경우 처리 (클라이언트 주소 알아내기)
				InetSocketAddress addr = (InetSocketAddress) socket.getRemoteSocketAddress();
				System.out.println("접속 완료 >" + addr.getAddress() + ":" + addr.getPort());
			}
			// 5. 자원 반납 (서버는 5번 아래로 잘 안씀)
			// 6. 종료
		} catch (IOException e) { // 서버에 문제가 있을 때
			// 5. 자원 반납 (서버는 5번 아래로 잘 안씀)
			try {
				server.close();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			// 6. 종료
			e.printStackTrace();
		}
	}

}


클라이언트


package chap12.exam02.tcp;

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

public class Client {

	public static void main(String[] args) {
		Socket socket = null;
		
		try {
			// 1. 소켓 생성
			socket = new Socket();
			
			// 2. 접속 요청
			socket.connect(new InetSocketAddress("localhost", 5001));
			
			// 3. 시킬 일 있으면 요청
			System.out.println("접속 완료");
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			// 4. 종료
			try {
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}


먼저 서버를 작동한 후 클라이언트 코드도 작동을 해줘야 하는데


서버는 이클립스에서 돌리고


https://qdgbjsdnb.tistory.com/79 를 참조하여 cmd에서 클라이언트를 작동해보자.






Network는 다양한 컴퓨터들끼리 연결되어 있는 망을 의미한다.


컴퓨터 뿐만 아니라 다양한 사물(Things), 예를들어 냉장고 선풍기, 에어컨 등의 사물(Things)들이 Network, Internet에 연결이 되고


그것을 IOT(Internet Of Things) 사물 인터넷이라고 한다.


특히 Java는 컴퓨터를 벗어나 다양한 사물에 활용되기 좋아 널리 사용되고 있다.







Network의 깊은 지식이 목적이 아니기 때문에 전문적인 내용을 다루지 않고


Java에서 쓸만한 간단한 Server, Client 통신을 공부한다.







Network는 결국 목적지까지 어떻게 가느냐가 제일 중요한 과제이다.


그래서 컴퓨터에 고유 통신 번호인 IP가 지정되고 IP는 집주소 처럼 데이터를 전달할 목적지 주소로 쓰이게 된다.


또한 컴퓨터 장치 자체에 부여된 주소도 따로 있지만 IP만 사용한다.


IP와 함께 필요한게 하나 있는데 포트 번호가 꼭 필요하다.


일반적으로 사용하는 포트는 TCP와 UDP가 있고


TCP는 Three Way Handshake와 같은 방법으로 확실한 데이터를 전송하지만 속도가 조금 느리다.


UDP는 일방적인 전송을 하므로 불확실한 데이터를 전송하지만 속도가 빠르다는 장점이 있다.







IP와 포트의 예로는 127.0.0.1:8080과 같이


127.0.0.1은 IP가 되고


: 뒤에 8080은 포트 번호가 된다.


그리고 127.0.0.1은 자신을 지정하는 IP로 자신의 IP를 모를때 쓰는 IP이다.





Java에서 자신의 IP 주소를 얻는법과


특정 도메인의 IP를 얻는법을 확인해보자


InetAddress를 사용한다.





여기서 도메인은 네이버로 예를 든다면


naver.com이 도메인(IP의 닉네임으로 이해하면 된다)이다.


수많은 웹사이트들을 접속하는데 일일히 IP를 암기하고 사용 할 수 없으니 닉네임을 배정하는 혁신적인 기술이다.


도메인이 생기고 인터넷의 발전은 급격히 상승했다.



package chap12.exam01.ipaddr;

import java.net.InetAddress;

public class GetIp {

	public static void main(String[] args) throws Exception {
		// 내 컴퓨터의 IP 얻기
		// localhost => 127.0.0.1 => 자신의 주소를 지정하는 주소
		InetAddress addr = InetAddress.getLocalHost();
		System.out.println("my PC IP " + addr.getHostAddress());
		
		// 특정 도메인으로 IP 얻기
		String domain = "naver.com";
		addr = InetAddress.getByName(domain);
		System.out.println(addr.getHostAddress());
		
		// 특정 도메인으로 IP 전부 얻기
		domain = "www.youtube.com";
		InetAddress[] addrs = InetAddress.getAllByName(domain); // 반환값이 배열
		for(InetAddress ip : addrs) {
			System.out.println("ip : " + ip);
		}
	}

}



여기서 특정 도메인으로 IP 전부 얻기라는 말이 이해가 안 갈수도 있다.


왜 여러대가 나오는거지? 할 수 있는데 웹사이트들은 서버를 여러대를 두어 접속을 대비하여야 하기 때문에 여러개가 나온다.


예를들면 naver.com과 같이 대형 웹사이트는 1분안에 수만, 수십만명이 동시에 접속할 수 있기 때문에


서버를 여러대 준비하여 부하가 낮아지게끔 해야한다.


만약 여러대를 준비하지 않을 경우 사람이 몰리는 아침시간에 naver.com에 접속하려고 하면


과장해서 1시간, 2시간 걸릴 것이다...



'개념 및 코딩 > 10.네트워크' 카테고리의 다른 글

[JAVA]10-06.UDP, Datagram  (0) 2018.09.27
[JAVA]10-05.N:M MultiChat Server, Client  (2) 2018.09.27
[JAVA]10-04.1:1 Chat Server, Client  (0) 2018.09.27
[JAVA]10-03.Echo Server, Client  (0) 2018.09.27
[JAVA]10-02.TCP Server, Client  (0) 2018.09.27

+ Recent posts