Backend/JAVA

JAVA(9)- 네트워크(1)(클라이언트/서버/소켓/TCP)

creativeDeveloper! 2022. 9. 25. 00:43
728x90

1. 네트워크란?

네트워크는 서로 다른 computer끼리 서로 연결되어 있는 망

네트워크가 이루어지기 위해 가장 먼저 필요한 것은 주소값

그리고 이 주소를 알기 쉽게 하기 위해 domain을 사용한다

목적지로 잡은 컴퓨터를 서버라고 부르고 그  목적지로 향해가는 컴퓨터를 클라이언트라고 부른다

내가 만약 유투브에 들어가 영상을 볼때 나(내가 사용하는 컴퓨터)가 클라이언트고 

유투브 홈페이지가 컴퓨터 서버가 된다.

그래서 내가(Client) 유투브(server)에게 요청(request)를 하고 서버는 나에게 응답(respond)를 해준다.

2. IP 주소 얻기

네트워크의 가장 기본인 주소를 얻어야한다.

컴퓨터에서 주소 = IP

컴퓨터의 ip를 얻는 방법은 두가지인데

첫번째는 cmd창에서 ipconfig를 하는 방법과 두번째는 이클립스를 통해서 주소를 얻는것이다.

 

public class GetIp {

	public static void main(String[] args) throws UnknownHostException {

		// 내 pc Ip 알아보기
		 InetAddress addr=InetAddress.getLocalHost();//localhost==127.0.0.1==내 IP
		System.out.println("내 pc 주소"+addr.getHostAddress());

	}        
        }

 

InetAddress 클래스getLocalhost() 메서드로 얻어낼 수 있다.

그렇다면 특정 도메인의 IP를 알아볼수 있는 방법은?

public class GetIp {

	public static void main(String[] args) throws UnknownHostException {
		
		// 하나의 도메인에 여러 서버가 물려있는 경우
		
		String domain="www.naver.com";
		//여러서버를 도메인에 배열로 담아서 가져오기
		InetAddress [] ipList=InetAddress.getAllByName(domain);
		System.out.println(domain+"에 연결된 서버들");
		for (InetAddress ip : ipList) {
			System.out.println(ip.getHostAddress());
		}
     }

3. TCP란?

한마디로 TCP는 연결지향 프로토콜

장점은 데이터를 안전하고 정확하게 전달/ 단점은 데이터를 보내기전에 반드시 연결을 형성
해야하고 UDP보다 속도가 느리다.

 

 

이제 TCP를 통해서 Client로 Server에 접속할것인데
이렇게 하기위해서는 Socket이 필요! -> Socket 통신

먼저 Server class부터 생성해줘야한다.

package chap12.ex02.tcp;

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

public class Server {

	public static void main(String[] args) {
		
		ServerSocket server=null;
		
		//1. 소켓 생성
		
		try {
			server=new ServerSocket(5001);//port: 이 프로그램이 머무를 주소, 주로쓰는 포토주소를 알고 있어야함...
			while (true) {//2. 클라이언트에 대한 요청 대기
				System.out.println("요청 대기 중");
				Socket socket = server.accept(); //3. 요청이 있을 경우 수락(blocking)
				
				// socket 안에는 요청한 클라이언트의 모든 정보와 통신할 수 있는 기능들이 들어있다.
				// 들어온 클라이언트의 정보 확인(아이피와 포트)
				
				InetSocketAddress addr=(InetSocketAddress)socket.getRemoteSocketAddress();
				//socket.getRemoteSocketAddress() -> 연결된 시스템에 대한 주소를 반환한다.
				System.out.println("접속완료 : "+addr.getAddress()+" : "+addr.getPort());
				
				
			}
		} catch (IOException e) {
			
			e.printStackTrace();
			//4. 예외가 없으면 자원 반납			
			try {
				server.close();
				System.out.println("연결이 종료되었습니다.");
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			
		}
		
		// 서버를 확실하게 끄기위해 콘솔에서 terminate disconnect all을 클릭
	}

}

그 후에 Client 클래스를 생성해준다.

package chap12.ex02.tcp;

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

public class Client {

	public static void main(String[] args) {

		Socket socket=null;
		
		try {
			socket=new Socket("192.168.8.223",5001);//1. 접속할 주소로 소켓 생성 -> 접속 요청
			//2. 서버가 허락해주면 접속 완료
			System.out.println("서버 접속 완료!!");
			
		} catch (Exception e) {
			e.printStackTrace();
			
		}finally {
			//3. 할일이 끝나면 socket(자원) 반납
			try {
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}

}

 

server를 먼저 실행시키면 콘솔에 아래와 같이 요청대기중이 찍힌다.

그 후에 이클립스 해당 파일이 있는 곳의 bin 폴더까지 들어가서 창에 cmd를 입력한다.

그리고 아래와 같이 cmd 창에 입력하면 서버 접속 완료라고 이클립스에 출력한 문구가 나오고...

그리고 다시 이클립스 창으로 돌아가면 콘솔에 아래와 같이 찍힌다.

 

728x90