Java #13 - protocol, network (국비25일차)

 

목차

1. TCP : 전화 방식

    1. 서버
    2. 클라이언트

2. UDP : 택배 방식

    1. Sender
    2. Receiver

 

 

오늘은 네트워크에 대해서 알아볼 것이다.

프로토콜은 송신자와 수신자 사이에 메시지나 데이터 등을 주고받기 위해 사전에 정해놓은 규칙을 말한다.

 

여러 가지의 프로토콜 방식이 있지만 2가지 프로토콜에 대해서 공부를 할 것이다.

 

 

통신 : Network

 

TCP : 전화 방식
신뢰성이 있는 통신 방식

UDP : 택배 방식
신뢰성이 결여된 통신 방식

 

 

1. TCP : 전화 방식

 

 TCP 방식은 신뢰성이 있는 통신 방식으로 

인터넷 환경에서 기본적으로 사용하는 프로토콜이라고 한다.

 

1. 서버

etc-image-0
java에서 IP주소 확인하기
etc-image-1

 

IP주소 관련 클래스인 InetAddress를 사용해서

얻은 결과물은 위의 사진과 같다.

hostname은 내 pc의 이름을 말하며

hostaddress는 내 pc의 ip주소를 말한다.

그리고 localhost는 내 pc를 가리키는 말이기도 하다.

 

통신을 하기위해선 이렇게 내 IP주소와

필요하다면 다른 이의 IP주소를 알고 있어야 한다.

(그리고 IP주소를 사용할 땐 try catch문을 작성이 필수다)

 

etc-image-2

통신을 구현하기 위해선 2가지 용어를 꼭 알아야 한다.

 

우선 IP주소는 컴퓨터의 고유한 주소이다.

그리고 port 번호는

컴퓨터 안에서의 프로그램 고유번호이다.
(0~1024번은 이미 다른 프로그램이 대부분 사용 중..)

 

etc-image-3
서버용 main 함수

 

etc-image-4

우선 서버소켓을 만들어야 한다.

기본적으로 ServerSocket이라는 클래스가 이미 존재하기 때문에

포트번호까지 입력해서 서버소켓을 만들어준다.

 

etc-image-5

그리고 클라이언트 쪽에서

접속을 할 때까지 기다려야 한다.

(통신은 양방향이니까...)

여기선 Socket이라는 객체를 만들어주면 되고

클라이언트가 접속할 때까지

스레드가 이 부분에서 대기하게 된다.

etc-image-6

이런 느낌으로 말이다.

 

etc-image-7

 

그다음엔

클라이언트가 접속을 했을 때의 코드를 입력해줘야 한다.

 

클라이언트로부터 데이터를 읽어오는 Stream 객체를 만들어줘야 한다.

위의 사진에 있는 코드는 정말 많이 쓰는 코드

꼭 기억해둬야 한다!!!!

InputStream 객체를 만들고 (바이트 스트림)

이를 InputStreamReader 객체에 다시 넣고 (문자 스트림)

다시 BufferedReader 객체에 넣는 형태이다. (보조 문자 스트림)

 

etc-image-8

 

마지막으로 클라이언트가 보낸 데이터를 읽어주면 된다.

반복문을 사용해서 reader로 읽고

println을 통해 출력을 하면 될 것이고

중간에 msg == null은 클라이언트 쪽에서

연결을 끊으면 null 상태가 되므로 이를 이용해서

무한 반복문에서 탈출하는 방법이다.

그리고 스트림은 닫아줘야 한다.

 

 

2. 클라이언트

 

etc-image-9

 위의 서버는 데이터를 읽어오는 역할이라서

포트번호만 필요했다.

하지만 이제 클라이언트는 데이터를 입력해서 보내는 입장이다 보니

서버의 IP주소와 port번호를 알아야 한다.

지금은 내 pc가 서버이니 내 pc의 IP주소를 입력할 것이다.

 

이때 127.0.0.1 은 내 pc를 말하는 특별한 Ip주소이며

localhost 역시 내 pc를 말하는 주소이다.

 

etc-image-10

 

etc-image-11

첫 번째로 서버와 연결하기 위한

socket을 만들어야 한다.

socket객체를 이용해 서버 IP주소와 port번호를 입력해 준다.

 

etc-image-12

그 후 데이터를 전달하기 위해 Stream을 사용해야 한다.

OutputStream 객체를 우선 만들고

보조문자스트림인 PrintWriter를 만들어준다.

 

etc-image-13

그리고 scanner를 이용해

메시지를 입력받아

writer를 통해 데이터를 전송해 준다.

 

그리고

flush와 close는 잊지 말자.

 

 

etc-image-14

자 그리고 cmd(명령 프롬프트)를

이용해서 java 워크스페이스 폴더를 찾아가

지금 사용 중인 자바프로젝트 폴더에

bin 폴더로 간다.

그리고 java ServerTest파일을 입력해서 실행시킨다.

 

그럼 위의 사진처럼 서버소켓이 생성되며

클라이언트의 접속을 기다리게 된다.

etc-image-15

그 후 클라이언트로 돌아가서

컨트롤 f11을 눌러주면

서버와 연결이 되었다고

메시지를 입력하고 뜬다.

etc-image-16

위의 사진처럼 메세지를 입력하고 나서 

cmd를 보면

etc-image-17

메시지가 잘 보내진 것을 

확인할 수 있다.

 

 

2. UDP : 택배 방식

 

UDP 방식은 신뢰성이 없지만 

매우 빠른 응답속도를 가지고 있어서

서버 - 게임 클라이언트 환경에서 많이 이용하는 방식이다.

etc-image-18

UDP 방식을 간단하게 말해서

우체국 같다고 생각하면 된다.

우체통을 통해서 정해진 주소의 우체통에 

바로 보내는 느낌이다.

 

 

1. Sender

etc-image-19

위의 설명과 같이 UDP는 빠른 속도를 가졌고

User Datagram Protocol의 약자이다.

 

etc-image-20

 

etc-image-21

우선 우편을 보낼 수 있는 우체통이 필요하니

DatagramSocket 객체를 만들어주자.

 

etc-image-22

그리고 보낼 메시지를 보내기 위해

받는 사람의 주소를 입력해야 한다.

이를 InetAddress 객체를 사용해서 만들고

DatagramPacket 객체를 만들어 넣어줘야 한다.(socket이 아님_

이 객체의 매개변수의 첫 번 짼

어떤 메시지를 보낼 것인지 적는 것이다.

그리고 두 번째

몇 바이트의 문자를 보내는가 적는 칸인데

쉽게 length를 사용해서 적어주자.

그리고 세 번째는 받는 사람의 주소를 입력한 객체 참조변수를 적어주며

마지막은 받는 사람의 port번호를 입력해 준다.

 

etc-image-23

그리고 send를 입력해 전송을 완료해 준다.

 

 

 

2. Receiver

etc-image-24

이제 데이터를 받는 측에서

메인 함수를 만들어야 한다.

 

etc-image-25

우선 DatagramPacket을 이용해서

받을 우체통 객체를 만들어준다.

그리고 포트번호도 넣어준다.

 

etc-image-26

그리고 내용물을 담을 수 있는 빈 박스를 준비해둬야 한다.

byte [] 배열을 이용해서 빈 상자를 만들고

DatagramPacket 객체를 만들어준다.

매개변수엔 바이트 배열과 바이트 배열의 길이를 입력해 준다.

 

etc-image-27

그리고 메시지가 올 때까지 기다리는 상황과

데이터를 받으면

이를 문자열로 바꿔서

출력해 주면 된다.

 

 

etc-image-28

이제 Receiver 쪽에서 코드를 실행하면

메시지를 기다리게 되고

 

etc-image-29

명령프롬프트를 이용해서 

Sender을 켜준다.

etc-image-30

그리고 보낼 메세지를 입력하면

etc-image-31

콘솔창에 내가 보낸 메시지가 입력이 된다.

 

 

 

오늘은 간단하게 network를 이용해

데이터를 주고받는 것을 공부했다.

 

내일은 GUI에 대해서 조금 ㅇ라아볼 것이다.