Practice makes perfect

[JAVA] 네트워크(NETWORK) 본문

빅데이터/JAVA

[JAVA] 네트워크(NETWORK)

kerpect 2020. 5. 23. 16:53

TCP/IP 프로토콜

: TCPTransmission Control Protocol

- 두 시스템 간에 신뢰성 있는 데이터의 전송을 관장하는 프로토콜입니다.

- TCP에서 동작하는 응용프로그램 사례 : e-mail, FTP, (HTTP)

 

: IP는 Internet Protocol

- 패킷 교환 네트워크에서 송신 호스트와 수신 호스트가 데이터를 주고 받는 것을 관장하는 프로토콜입니다.

- TCP보다 하위 레벨 프로토콜

 

+) IP 주소 : 네트워크 상에서 유일하게 식별될 수 있는 컴퓨터 주소입니다.

- 숫자로 구성된 주소로 4개의 숫자가 ‘.’으로 연결되어있습니다. ) 192.156.11.15

- 숫자로 된 주소는 기억하기 어려우므로 www.naver.com과 같은 문자열로 구성된 도메인 이름으로 바꿔 사용합니다.

 

 

포트

- 통신하는 프로그램 간에 가상의 연결단 포트 생성합니다.

- IP 주소는 네트워크 상의 컴퓨터 또는 시스템을 식별하는 주소입니다.

- 포트 번호를 이용하여 통신할 응용프로그램 식별합니다.

- 모든 응용프로그램은 하나 이상의 포트 생성 가능합니다.

- 포트를 이용하여 상대방 응용프로그램과 데이터 교환합니다.

 

 

클라이언트/서버(client/server)
- 컴퓨터간의 관계를 역할(role)로 구분하는 개념으로 서비스를 제공하는 쪽이 서버, 제공받는 쪽이 클라이언트입니다.
- 제공하는 서비스의 종류에 따라 메일서버(email server), 파일서버(file server), 웹서버(web server) 등이 있습니다.
- 전용서버를 두는 것을 ‘서버기반 모델’, 전용서버없이 각 클라이언트가 서버역할까지 동시에 수행하는 것을

  ‘P2P 모델’이라고 합니다.

 

● 소켓 프로그래밍

 

소켓 (socket)

: TCP/IP 네트워크를 이용하여 쉽게 통신 프로그램을 작성하도록 지원하는 기반 기술을 말합니다.

 

특징

- 두 응용프로그램 간의 양방향 통신 링크의 한쪽 끝 단

- 소켓끼리 데이터를 주고받음

- 소켓은 특정 IP 포트 번호와 결합

- 자바로 소켓 통신할 수 있는 라이브러리 지원

- 소켓 종류 : 서버 소켓과 클라이언트 소켓

- 전화할 때 양쪽에 전화기가 필요한 것처럼, 프로세스간의 통신에서도 양쪽에 소켓이 필요

 

 

예시) Socket 클래스(서버/ 클라이언트)

 

서버)

public class SocketServer { // 서버로 구성해서 동작. 
	public static void main(String[] args) {
		
		try {
			ServerSocket serverScoket = new ServerSocket(9001); 
            // 서버로 동작되게 구성하도록 해준다.  
			// ServerSocket 인스턴스 되는 순간 서버로 구현되어지도록 한다(환경구축 완료)

			while(true) { // 클라이언트의 요청이 오면 바로 처리 할 수 있도록 무한대기 한다. 
				Socket socket =  serverScoket.accept();
				ObjectInputStream InStream = 
                new ObjectInputStream(socket.getInputStream()); 
				// 프로그램과 socket 사이의 통로로 내용을 꺼내온다. 
				
				String msg = InStream.readUTF(); 
                // 유니코드로 되어있는 문자열을 읽어오도록 한다. 
				System.out.println("클라이언트가 전송해 온 메세지 : " + msg);
				
				if(msg.equals("exit")) {break;}
				
				ObjectOutputStream outStream = 
                new ObjectOutputStream(socket.getOutputStream());
				outStream.writeUTF("홍길동이 전달한 메세지 : " + msg + "잘 받았어요.");
				// writeUTF 그냥 두면 buffer 가 찰 때까지 기다린다. 
				
				// 실시간 처리 
				outStream.flush();
              
				// 사용후 close();
				outStream.close();
				InStream.close();
				socket.close();
			}
			serverScoket.close();
		} catch (IOException e) {
			e.printStackTrace();
		}  

ServerSocket serverScoket = new ServerSocket(9001); // 서버로 동작되게 구성하도록 해줍니다. ( ) 안의 숫자는 포트번호로  9001 번으로 셋팅 , 1000~9999 부터는 임의로 번호를 부여해서 사용할 수 있으며, 안정적으로는 5000이후 번호로 셋팅 하는 것이 좋습니다. 9001 포트번호로 이 프로그램을 사용합니다. (정보 전달)
- 운영체지는 포트 번호로 프로그램들을 관리한다.

 

주의) DB 설치할 때 default 값으로 8080으로 되어있으므로 8080을 사용하지 않아야 합니다.

 

Scoket socket = serverScoket.accept();

참조변수를 선언해서 전달 받은 주소값을 저장한다. 메모리에는 클라이언트의 정보가 모두 들어있습니다. 서버는 대기하고 클라이언트가 요청할 때까지 대기하다가 요청해오면 그 정보를 메모리에 담아서(안에서 new) Scoket 단위로 저장하여 그 주소값을 return 해서 socket에 저장해줍니다.

 

outStream.writeUTF("홍길도이 전달한 메세지 : " + msg + "잘 받았어요.");
writeUTF 그냥 두면 buffer 가 찰 때까지 기다립니다 하지만 채팅 프로그램에서는 퍼포먼스보다 속도가 중요하기에

실시간으로 보내는 flush();를 사용합니다.단, flush();는 퍼포먼스가 많이 떨어지므로 상황에 맞춰서 사용하는 것이 좋습니다.   

클라이언트)

public class SocketClient {

	public static void main(String[] args) {
		try {
			Socket socket = new Socket("localhost", 9001);
			
			ObjectOutputStream outStream = 
					new ObjectOutputStream(socket.getOutputStream());
			
			outStream.writeUTF("홍길동");
			outStream.flush();
			
			ObjectInputStream inStream = 
					new ObjectInputStream(socket.getInputStream()); 
			
			String msg = inStream.readUTF();
			
			System.out.println("서버로부터 전송되어진 메세지 :");
			System.out.println(msg);
			
			inStream.close();
			outStream.close();
			socket.close();
			
		} catch (IOException e) {
			e.printStackTrace();
		}

위의 서버와 연동을 하기 위해서  Socket socket = new Socket("localhost", 9001); "localhost" = 내 pc

저의 pc의 서버와 연결하기 위해서 "localhost"를 사용하였고, 다른 pc와 연결해주고 싶을 때는 "localhost" 자리에 pc IP를 넣어주면 됩니다.

 

서버를 실행한 이후 클라이언트를 실행하면 결과 값으로 밑의 결과가 나타납니다.

 

서버로부터 전송되어진 메세지 :
홍길동이 전달한 메세지 : 홍길동 잘 받았어요.

 

 

 

 

'빅데이터 > JAVA' 카테고리의 다른 글

[JAVA] SWING (2)  (0) 2020.05.25
[JAVA] SWING(1)  (0) 2020.05.23
[JAVA] 스트림(Stream)  (0) 2020.05.20
[JAVA] Thread  (0) 2020.05.19
[JAVA] 컬렉션 프레임워크 ( Collection Framework )  (0) 2020.05.18