본문으로 바로가기

Socket (소켓) 통신 과 TCP / IP 통신

category JAVA 2019. 12. 17. 00:04

TCP / IP 통신


  • 'TCP/IP'는 TCP와 IP로 나눌 수 있다.
  • 주로 IP(Internet Protocol)을 주로 사용하고 있다.
  • IP는 규약 혹은 규칙에 따라 컴퓨터에 인터넷 주소를 부여한다는 의미를 갖고 있다.
  • IP를 확인하는 방법
    1. 명령프롬프트에서 'inpconfig'를 검색한다.
    2. localhost주소
    127.0.01를 사용할 수도 있다.

 

Port란?


  • IP로 해당 PC에 접근했더라도 PC내부에서 어느 프로그램과 통신을 해야하는지 구분을 해야한다.
    이때 사용하는 것이 Port 이다.
  • 포트는 통신을 하기 위한 출입구라고 볼 수 있다.
  • 각 프로그램들은 자신만의 포트를 부여함으로써 각각 통신을 할때 구분을 할 수 있게된다.
  • 사용가능한 포트 번호 0~65535
    단, 0~1023 까지는 시스템에서 사용하는 포트이기때문에 사용불가

 

 

Socket 통신


  • 'TCP/IP' 통신을 하기 위해서 소켓(Socket)을 이용한다.
  • 소켓(Socket)은 각 포트를 사용하여 통신을 수행하는 도구이다.
  • 각 프로그램에 포트를 세팅하고 소켓으로 데이터를 주고 받는다.
    즉, 포트는 출입구 역할, 소켓은 출입구를 통하여 데이터를 직접 송수신하는 매체인 것이다.
  • [소켓의 동작]
    1. Server Socket과 Client Socket으로 나뉜다.
    2. Server Socket의 역할은 Client Socket의 연결요청을 대기하고, 연결 요청이 오면 클라이언트 소켓을 생성하여 통신을 가능하게 한다.
    3. Client Socket은 대기 없이 바로 사용가능하며, 실제로 데이터 송수신이 일어나는 곳이다.

 

 

예제


1단계

Client와 Server를 연결해줄 Socket을 세팅하고 연결이 잘 되는지 확인해보기

[Client]

public class ClientMain {
	public static void main(String[] args) {
		//지역변수 선언
		Socket socket=null;	//new Socket의 참조값을 담을 지역변수. try 블럭과 finally 블럭에서
							//사용하기 위해 local 변수로 선언해주었다.
		//client 소켓
		try {
			socket=new Socket("127.0.01",5000);	//new Socket("server 주소", port 번호). new하는 시점에 동작함
                                                //연결에 성공하면 서버에 있는 socket 객체와 일대일로 연결된 socket 객체의 참조값이 반환된다.
			System.out.println("socket 연결 성공"); //serverSocket과 연결에 성공시 출력될 문자열
		} catch (Exception e) {	//new Socket으로 인해 발생한 exception handling
			e.printStackTrace();
		}finally {
			try {
				if(socket!=null)socket.close();	//socket 사용 후 닫아주기
			} catch (Exception e) {	//socket.close();으로 인해 발생한 exception handling
				e.printStackTrace();
			}
		}
	}
}

 

 

[Server]

public class ServerMain {
	public static void main(String[] args) {
		//지역변수 선언
		ServerSocket serverSocket=null;	//try블럭과 finally 블럭에서 참조값을 사용하기 위해 지역변수 선언
		Socket socket=null;
		
		//server socket
		try {
			serverSocket=new ServerSocket(5000);	//new ServerSocket(prot번호); 5000번 port로 client 접속 받기
			System.out.println("클라이언트의 연결요청을 대기 중입니다...");
			while (true) {	//server에 접속하려는 client는 다수 이므로 반복문으로 접속 받는다.
				//5000번 port의 연결 요청을 기다린다.
				socket=serverSocket.accept(); //accept() : client로 부터 접속요청이 올 때까지 block 상태로 있는다. 
                							  //따라서 client의 요청이 들어올때까지 반복문은 돌지 않는다. serverSocket.accept();의 반환값은 방금 접속요청을 한 client의 socket 참조값이다.    
				String ip=socket.getInetAddress().getHostAddress();	//접속한 client의 ip 주소
				System.out.println("접속된 클라이언트의 ip : "+ip);
			}	
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if(serverSocket!=null)serverSocket.close();	//serverSocket과 socket 소켓 사용 후 닫기
				if(socket!=null)socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

 

 

2단계

클라이언트 측에서는 키보드에 입력된 값을 받아와서, 서버에 데이타를 전송하고,

서버에서는 전송받은 데이터를 입력받아서 출력하기

[Client]

 

 

 

 

 

[Server]

 

 

 

 

3단계

 

 

 

 

 

 

 

4단계

 

 

 

 

 

 

 

5단계

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'JAVA' 카테고리의 다른 글

JSON 라이브러리  (0) 2019.12.18
JSON 라이브러리 Build Path  (0) 2019.12.17
Multi Thread(멀티스레드)  (0) 2019.12.13
I/O (Input/Output)  (0) 2019.12.12
예외(Exception)처리 / 로깅(logging) / 디버깅(debugging)  (0) 2019.12.11