1. 통신

서킷 스위칭

: A와 B 사이에 통신을 할 때, 전용 선을 이용해 1:1로 통신하는 방법. 단순하지만 전용 선을 만들어야 하기 때문에 비용이 많이 든다.
데이터를 전송하면 안정적이지만, 전용 회선을 계속 사용하기 때문에 효율성이 떨어지고, 많은 양의 데이터를 전송하는 데에는 비효율적

패킷 스위칭

: 통신 회선을 공유해서 여러 장치가 통신할 수 있는 방법.
전송되는 데이터를 작은 패킷 단위로 쪼개서 네트워크를 통해 전송하는 방법.
비용이 적게 든다.
하나의 회선을 공유하기 때문에 통신중인(정보를 전송중인) 경우 다른 장치가 통신할 수 없다.

동기화 상태 : 일에 순서가 있다. 멍 때린다!

  • 통신할 정보를 패킷 단위로 쪼갠다
    쪼갠 정보는 payLoad, 헤더에는 정보를 전달할 목적지 IP를 담는다

  • 동기화를 피하기 위해 라운드로빈 방식을 사용한다

라운드로빈

  • 패킷단위로 쪼갠 정보들을 각각 라우터로 보낸다

    라우터는 컴퓨터 네트워크 간에 데이터 패킷을 전송하는 네트워크 장치다. 패킷의 위치를 추출하여, 그 위치에 대한 최적의 경로를 지정하며, 이 경로를 따라 데이터 패킷을 다음 장치로 전달한다.

  • 목적지까지 도달한 패킷들의 순서는 기존과 다를 수 있고, payload와 header를 보고 순서와 메시지로 조립한다.

2. 프로세스와 통신

직렬화

: 사람의 언어를 기계가 이해하는 언어로 변환하는 과정

  1. 하드웨어의 프로그램을 실행시키면 RAM에 올라가 프로세스 상태가 된다
  2. 각 프로세스는 통신하는 포트를 갖는다. 이 포트로 통신할 경우, 헤더에 목적지, 순번 뿐만이 아니라 해당 포트번호를 포함한다.
  3. 컴퓨터의 애플리케이션으로 메시지를 입력하고 BW하여 소켓으로 만든다
  4. 소켓으로 메시지를 OS단으로 전달한다
  5. TCP에서 소켓을 BR해서 읽으면서 세그먼트를 만들어 IP로 전달한다
  6. IP에서 랜카드(프로세스로 가는 길~~)로 패킷을 만들어 보낸다

    사람의 언어를 애플리케이션으로 입력하여 랜카드의 프로세스로 보내는 것!

역직렬화

: 기계의 언어를 사람이 이해하는 언어로 변환하는 과정

  • 컴퓨터는 애플리케이션을 사용하고 있는 사용자에게 바이너리 데이터를 보낸다
  • 역직렬화 과정 : 전송 -> 패킷 -> 세그먼트 -> 소켓 -> 애플리케이션에 도착

버퍼

통신에서의 버퍼(Buffer)는 데이터를 일시적으로 저장하는 메모리 공간

  1. 위 과정에서 정보를 전달하는 사람은 BufferedWrite로 정해진 크기의 버퍼에 정보를 저장하고, flush로 버퍼를 비우며 소켓을 보낸다
  2. 소켓이 세그먼트와 패킷으로 변환되고 다시 세그먼트와 소켓으로 만들어진 후,
  3. 다시 목적지에서 BufferedRead로 버퍼가 채워진다
  4. 채워진 버퍼는 애플리케이션에서 사용되면서 버퍼를 비운다
  5. 애플리케이션에서 버퍼를 소비하는데 \n까지 소비한다. \n없으면 readLine() 못함!

3. 스레드

프로세스

: 실행중인 프로그램

스레드

: 프로세스에서 실제로 일하는 주체, 프로세스에는 한 개 이상의 스레드가 존재하고 이를 멀티스레드 프로세스라고 한다

  • 두 가지 일을 할 때 스레드가 하나라면 하나의 일은 동기화가 발생한다
  • 두 가지 일을 동시에 하는 것처럼 보이기 위해 멀티 스레드 프로세스를 사용하는데, 일을 작은 단위로 쪼개서 처리하던 중간에 다른 일을 처리하고 반복하는 과정이다

    하나의 스레드에 sleep()을 설정하지 않으면 다른 스레드의 일이 끼어들 수 없어서 스위칭이 일어나지 않는다! sleep()설정 필수!

4. 통신의 종류

단방향

: A에서 B로 정보를 전달할 때 A는 보내는 역할만, B는 받는 역할만 한다
클라이언트에서 서버로 메시지를 보내지만, 서버는 클라이언트에게 메시지를 보낼 수 없는 것

반이중

: 클라이언트에서 서버로, 서버에서 클라이언트로 메시지의 통신이 가능하다
하지만 통신선이 하나이기 때문에 한쪽이 메시지를 전송하고 있는 경우 다른 한쪽은 메시지를 전송할 수 없다

전이중

: 두 장치를 연결하는 통신선이 두 개(송신선, 수신선)
채팅 기능의 경우 전이중

서버가 되는 조건!
1. 반이중 (채팅은 전이중)
2. 데몬 스레드가 존재해야 한다(항상 리스닝하는 스레드 존재!)
3. 클라이언트의 동시 접속 허용

5. 통신 언어

  • 통신하려는 장치가 해석할 수 있는 언어가 각각 다르기 때문에 통신할 때마다 그에 맞춰 바꿔서 할 수는 없을 것이다
    (자바로 만들어진 프로세스와 파이썬으로 만들어진 프로세스 통신 불가!)
  • 중간 언어로 변환하여 전송하고 수신한 장치에서는 중간언어로 작성된 메시지를 자기 언어로 변환하여 사용한다
  • 주로 json을 이용한다

과제1. JSON 파싱

  1. 자바 클래스를 만든다
package parser;

class User{
    private int id;
    private String name;
    private String address;

    public User(int id, String name, String address) {
        this.id = id;
        this.name = name;
        this.address = address;}
        
    public int getId() {return id;}
    public void setId(int id) {this.id = id;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public String getAddress() {return address;}
    public void setAddress(String address) {this.address = address;}
}    
  1. 자바 클래스를 GSON 라이브러리를 이용해서 json 문자열로 만든다
    -> toJson
public class ToJsonTest {
    public static void main(String[] args) {
        User user = new User(1, "홍길동", "서울시");
        Gson gson = new Gson();
        String json = gson.toJson(user); //json 문자열 생성
        System.out.println(json);
    }
}
  1. 해당 문자열(json)을 자바 클래스의 객체로 만든다
    -> fromJson
public class ToUserTest {
    public static void main(String[] args) {
        String json = "{\"id\":1,\"name\":\"홍길동\",\"address\":\"서울시\"}";
        Gson gson = new Gson();
        User user = gson.fromJson(json, User.class);
        System.out.println(user);
    }
}
profile
안녕하세요. Chat JooPT입니다.

0개의 댓글