1cm

자바 프로그래밍_Day_21_네트워크(Network), 스레드(Thread) 본문

국비지원_Java/Java Programming_1

자바 프로그래밍_Day_21_네트워크(Network), 스레드(Thread)

dev_1cm 2021. 9. 24. 22:38
반응형

 



2021.09.14

 


     > 네트워크(Network)
       -> 여러 대의 컴퓨터를 통신 회선으로 연결한 것(홈 네트워크, 지역 네트워크, 인터넷 등이 해당) -> 쉽게 말하자면 공유기를 연결해서 컴퓨터, 스마트폰 등 기계들을 사용하는 것이라고 보면 된다.

       -> *홈 네트워크 : 집에서 공유기로 유선, 무선으로 연결한 것

       -> *지역 네트워크 : 홈 네트워크끼리, 회사와 회사 등 특정한 곳과 통신회선으로 연결한 것

 

 


     > 서버와 클라이언트
       -> 네트워크로 연결된 컴퓨터간의 관계를 역할(role)로 구분한 개념이다.

       -> 서버는 서비스를 제공하는 프로그램(컴퓨터)으로 클라이언트의 연결을 수락하고, 요청 내용을 처리 후 응답을 보내는 역할을 한다. 

       -> 클라이언트는 서비스를 받는 프로그램(컴퓨터)으로 네트워크 데이터를 필요로 하는 모든 어플리케이션이 해당 된다.

 


     > IP주소
       -> 네트워크 상에서 컴퓨터를 식별하는 번호로 네트워크 어댑터(랜카드)마다 할당 되어 있다.

       -> 공유기에서 랜카드를 할당해주고, ip주소는 xxx.xxx.xxx.xxx형식으로 0~255까지의 정수로 설정된다.

       -> ip주소를 다 외울 수 있기 때문에 '도메인 주소'라는 것을 사용해서 도메인이 연결된 ip주소를 통해 서버에 접근할 수 있다.

       -> * DNS(Domain Name System) : 도메인이나 호스트 이름을 숫자로 된 IP주소로 해석해주는 TCP/IP 네트워크 서비스를 통해 도메인 이름을 IP 주소로 변환해주는 역할을 해주고, 인터넷에 연결된 컴퓨터를 구별해 준다.

 

 


     > 포트(Port)
       -> 같은 컴퓨터 내에서 프로그램을 식별하는 번호로 클라이언트는 서버 연결 요청 시 IP주소와 포트 번호를 알아야 한다.

       -> 서버역할을 하는 동시에 실행이 가능하다.(웹서버, DDS) -> 하나의 ip를 가지고 0 ~ 65535까지 설정이 가능하다. 대부분 0 ~ 1023까지는 시스템 포트(시스템에서 쓰는 포트), 그 외 1024 ~ 65535는 우리가 임의로 사용을 해도 되는 포트라고 생각하면 된다.

       -> * 포트 바인딩 : 포트 바인딩은 메시지를 송수신하는 위치와 방법을 결정하는 구성 정보다. 포트 바인딩은 그 유형에 따라 실제 위치, 파이프라인 또는 다른 오케스트레이션을 참조할 수 있다. 

 

 


     > InetAddress 클래스
       -> IP주소를 다루기 위해 자바에서 제공하는 클래스이다.

메소드 설명
byte[] getAddress() IP주소를 byte배열로 리턴한다.
static InetAddress[] getAllByName(String host) 도메인 명에 지정된 모든 호스트의 IP주소를 배열에 담아 반환한다.
static InetAddress getByAddress(byte[] addr) byte배열을 통해 IP주소를 얻는다.
static InetAddress getByName(String host) 도메인 명을 통해 IP주소를 얻는다.
String getCanonicaHostName() FQDN(Full Qualified Domain Name)을 얻는다.
String getHostAddress() 호스트의 IP주소를 반환한다.
String getHostName() 호스트의 이름을 반환한다.
static InetAddress getLocalHost() 지역호스트의 IP주소를 반환한다.
boolean isMulticastAddress() IP주소가 멀티캐스트 주소인지 알려준다.
boolean isLoopbackAddress() IP주소가 loopback 주소(127.0.0.1)인지 알려준다.

 

 


     > 소켓 프로그래밍
       -> 소켓을 이용한 통신 프로그래밍

 


     > 소켓
       -> 네트워크 상에서 컴퓨터와 서버를 연결해서 데이터를 주고 받을 수 있는 소프트웨어 장치로, 프로세스(프로그램) 간의 통신에 사용되는 양쪽 끝 단(접속 끝 부분)을 말한다.

 


     > TCP
       -> 데이터 전송 속도가 느리지만 정확하고 안정적으로 전달할 수 있는 연결 지향적 프로토콜이다.

       -> 통신 프로토콜 : 데이터를 주고받을 때 정해진 약속

       -> 인터넷 상에서 데이터를 메세지의 형태로 보내기 위해 IP와 함께 사용하는 프로토콜

 


     > UDP
       -> 데이터 전송 속도가 빠르지만 신뢰성 없는 데이터를 전송하는 비연결 지향적 프로토콜

       -> 일방적으로 통신하는 방식 : ex.Streaming

       -> 데이터를 데이터그램 단위로 처리하는 프로토콜


     > TCP 소켓 프로그래밍
       -> 클라이언트와 서버간의 1:1 소켓 통신 (각자 소켓을 생성해서 그 소켓으로 데이터를 서로 주고받는다)

       -> 서버가 먼저 실행 되어 클라이언트의 요청을 기다려야 하고, 서버용 프로그램과 클라이언트용 프로그램을 따로 구현해야 한다.

       -> 자바에서는 TCP 소켓 프로그래밍을 위해 java.net 패키지에서 ServerSocket과 Socket클래스를 제공해준다.




     > 서버용 TCP 소켓 프로그래밍 순서
       -> 1. 서버의 포트번호 정하기
       -> 2. 서버용 소켓 객체 생성
       -> 3. 클라이언트 쪽에서 접속 요청이 오길 기다림
       -> 4. 접속 요청이 오면 요청 수락 후 해당 클라이언트에 대한 소켓 객체 생성
       -> 5. 연결된 클라이언트와 입출력 스트림 생성
       -> 6. 보조 스트림을 통해 성능 개선
       -> 7. 스트림을 통해 읽고 쓰기
       -> 8. 통신 종료

     > 클라이언트용 TCP 소켓 프로그래밍 순서
       -> 1. 서버의 IP주소와 서버가 정한 포트번호를 매개변수로 하여 클라이언트용 소켓 객체를 생성
       -> 2. 서버와의 입출력 스트림 오픈
       -> 3. 보조 스트림을 통해 성능 개선
       -> 4. 스트림을 통해 읽고 쓰기
       -> 5. 통신 종료

 

       -> * 통신의 오류가 생기면 ConnectException이 발생할 수 있음

 

 

 

     > 네트워크(Network) 코드 실습과 출력 결과

 

     > Network_Client.tcp.Clinet

 

 

     > Network_Client.Application

 

 

     > Network_Server.tcp.Server

 

 

     > Network_Server.Application

       -> 서버 시작 후 클라이언트에서 내용을 보내면 아래처럼 통신 메세지가 기록된다.

       -> 127.0.0.1은 내 컴퓨터의 ip주소.

 

 

     > 프로세스(Process)

       -> 간단한 의미로 실행중인 프로그램을 말한다.

       -> 프로세스는 프로그램이 실행될 때 마다 개별적으로 생성된다.

       -> 하나의 프로세스는 프로그램을 수행함에 있어 필요한 데이터와 메모리 등의 할당 받은 자원, 그리고 하나 이상의 스레드로 구성된다.

       -> * 다중 프로세스 : 두 개 이상의 작업을 하는 것, 멀티태스킹은 사용자로 하여금 다수의 프로세스가 동시에 실행되는 것 처럼 보이게 한다.

 

 

     > 스레드(Thread)

       -> 순차적으로 실행하는 코드(프로그램 실행 흐름)

       -> 프로세스 내에서 할당된 자원을 이요해 실제 작업을 수행하는 작업 단위로, 모든 프로세스는 하나 이상의 스레드를 가지며 각각 독립적인 작업 단위를 가진다.

       -> 메인 흐름에서 추가적으로 다른 실행 흐름을 만드는 것.

 

     > 메인 스레드(main thread)

       -> 모든 자바 프로그램은 메인 스레드가 main() 메소드를 실행하며 시작된다.

       -> main() 메소드의 첫 코드부터 아래로 순차적으로 실행되고, return을 만나면 종료된다.

       -> 필요에 의해 작업 스레드들을 만들어서 병렬 코드를 실행이 가능하다.(멀티 스레드를 이용한 멀티 태스킹)

 

 

     > 프로세스 종료

       -> 싱글 스레드의 경우 메인 스레드가 종료되면 프로세스도 종료되지만, 멀티 스레드의 경우 실행중인 스레드가 하나라도 있다면 프로세스가 종료되지는 않는다.

 

 

     > 멀티 프로세스 VS 멀티 스레드

       -> 멀티 프로세스 : 각각의 프로세스를 독립적으로 실행하는 것.

       -> 멀티 스레드 : 하나의 프로세스 내에서 여러 스레드가 동시에 작업을 수행하는 것.(동시에 병렬적으로 수행함)

 

 

     > 싱글 스레드와 멀티 스레드

       -> 싱글 스레드 : 메인 스레드 하나만 가지고 작업을 처리한다. -> 한 작업씩 차례대로 처리해 나간다.

       -> 멀티 스레드 : 메인 스레드 외의 추가적인 스레드를 이용하여 병렬적으로 작업을 처리한다.

 

 

 

     > 멀티 쓰레드(Multi Thread) 장점

 

       -> 자원을 보다 효율적으로 사용 가능

       -> 사용자에 대한 응답성 향상

       -> 애플리케이션의 응답성 향상

       -> 작업이 분리되어 코드가 간결해짐

       -> CPU 사용률 향상

 

 

     > 멀티 쓰레드(Multi Thread) 단점

       -> 동기화(Synchronization)에 주의해야 함

            -> * 동기화(Synchronization) : 시스템의 한정적인 자원에 여러 쓰레드가 동시에 접근해서 사용하려고 하면 문제가 발생할 수 있다. 이런 문제를 방지하기 위해 쓰레드들에게 하나의 자원에 대한 처리 권한을 주거나 순서를 조정해주는 기법 -> 여러 개의 스레드가 공통적으로 작업해야될 경우 동기화를 통해서 같은 형태의 객체를 사용할 수 있다.

 

       -> 교착상태(dead-lock)가 발생하지 않도록 주의해야 함

            -> * 교착상태(膠着狀態, dead-lock) : 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태 (대기가 끝나지 않는 상태)

       -> 프로그래밍 시 고려해야 할 사항이 많음

 

 

     > 스레드(Thread) 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
스레드(Thread) 생성
 
1. Thread 클래스를 상속받는 방법
 
public class 클래스명 extends Thread{
    // 상속 처리 후, run() 메소드 오버라이딩
 
    @Override
    public void run(){
        // 작업하고자 하는 코드 작성
    }
}
----------------------------------------
public class Run{
    public static void main(String[] args){
        클래스명 레퍼런스 =  new 생성자();    //Thread를 상속한 객체 생성
 
        레퍼런스.start();
    }
}
 
 
2. Runnable 인터페이스를 구현하는 방법
 
public class 클래스명 implements Thread{
    // 상속 처리 후, run() 메소드 오버라이딩
 
    @Override
    public void run(){
        // 작업하고자 하는 코드 작성
    }
}
----------------------------------------
public class Run{
    public static void main(String[] args){
        클래스명 레퍼런스 =  new 생성자();    //Thread를 상속한 객체 생성
        
        Thread thread = new Thread(레퍼런스);
        레퍼런스.start();
    }
}
cs

 

 

 

     > run(), start()

 

       -> 1. run() 호출

 

       -> 2. start() 호출

 

 

     > 스레드(Thread) 실습 코드와 출력 결과

 

     > com.kh.chap1.thread.Thread1

 

 

     > com.kh.chap1.thread.Thread2

 

 

     > com.kh.chap1.Application

 

 

 

 

반응형
Comments