본문 바로가기
Backend/Java

[자바의 신] 28장 (ongoing)

by unknownomad 2022. 8. 31.

28장 - 다른 서버로 데이터를 보내려면 어떻게 하면 되나요?

 

네트워킹(networking)

사용자들이 바로 옆에 있는 장비와 데이터를 주고 받는 작업

 

p.756

+++ 네트워크의 일반적인 레이어

+++ osi 7 layer

 

TCP (Transmission Control Protocol) UDP (User Datagram Protocol)
연결 기반 프로토콜
상대방이 데이터를 받았는지 확실히 보장해줌
But 내부적으로 처리되는 절차 매우 복잡
UDP보다 비싸고 느리며 무거움
다른 장비가 데이터를 제대로 받았는지에 대한 보장 x
이번에 데이터를 받지 않아도 다음에 받는 데이터를 사용해도 되는 경우에 사용(데이터 유실이 있어도 문제 없을 때)
자바로 TCP 통신 시, 자바에서 제공하는 API 사용
= 애플리케이션 레이어에서 프로그래밍만 하면 트랜스포터 레이어에서의 처리는 자바가 알아서 해줌
자바로 UDP 통신 시, TCP와 마찬가지로 데이터 주고 받기 위한 클래스 필요함
But TCP와는 다르게, 클래스 하나에서 보내는 역할과 받는 역할 모두 수행 가능 = DatagramSocket
통신 시 스트림 객체 얻어 데이터를 주거나 받음 통신 시 스트림 사용 X, DatagramPcket 클래스 사용
애플리케이션 레이어의
* HTTP (Hypertext Transfer Protocol)
* FTP (File Transfer Protocol)
* Telnet
 

 

포트(port)
일반적으로 웹 어플리케이션에는 80이라는 번호의 포트 사용

SSL
웹으로 SSL이라는 안전한 통신 시 443이라는 포트 사용
 
0 ~ 1023까지는 사용에 제한 있음
But 포트는 16비트로 구성되어 65,535까지 사용 가능하니 그 외의 값 임의 사용하면 됨

 

Socket 클래스

자바에서 TCP 통신 수행 시 사용하는 클래스

데이터를 보내는 쪽(보통 클라이언트)에서 객체 생성하여 사용

데이터를 받는 쪽(보통 서버)에서 클라이언트 요청 받으면, 요청에 대한 Socket 객체 생성하여 데이터 처리

= Socket 클래스는 서버 쪽이든, 클라이언트 쪽이든 원격에 있는 장비와의 연결 상태를 보관하고 있는 식임

 

서버에서 데이터 받는 방법

ServerSocket 클래스 사용해 데이터 받음

(이때 별도로 new 키워드 사용해 객체 생성할 필요 X)

ServerSocket 클래스에서 제공하는 메서드에서 클라이언트 요청이 생기면 Socket 객체 생성해 전달해줌

 

생성자 설명
ServerSocket() 서버 소켓 객체만 생성 이 생성자만 별도 연결 작업해야 대기 가능
ServerSocket(int port) 지정된 포트를 사용하는 서버 소켓 생성
backlog 개수 지정 x (이런 경우 backlog 개수 50개)
(애플리케이션 접속이 원활하지 않을 시, 이 개수 적절히 증가시키는 게 좋음)
객체가 생성되자마자 연결을 대기할 수 있는 상태가 됨
ServerSocket(int port, int backlog) 지정된 포트와 backlog 개수 가지는 소켓 생성
ServerSocket(int port, int backlog, InetAddress bindAddr) 지정된 포트와 backlog 개수 가지는 소켓 생성하며,
bindAddr에 있는 주소에서의 접근만 허용
  • backlog
    • 큐의 개수
    • ServerSocket 객체가 바빠서 연결 요청을 처리 못하고 대기시킬 때가 있는데, 그 때의 최대 대기 개수라 보면 됨
리턴 타입 메서드 설명
Socket accept() 새로운 소켓 연결 기다리고,
연결이 되면 Socket 객체 리턴
(객체 생성 후 사용자의 요청을 대기)
void close() 소켓 연결 종료
close() 처리 안 하고 JVM 계속 동작 중이면 해당 포트는 동작하는 서버나 PC에서 다른 프로그램이 사용 X

 

  • 데이터 받는 서버에서는 클라이언트에서 접속 시 Socket 객체를 생성
  • But 데이터를 보내는 클라이언트에서는 Socket 객체를 직접 생성해야 함

java.net 패키지의 Socket 클래스의 생성자

생성자 설명
Socket() 소켓 객체만 생성
Socket(Proxy proxy) 프록시 관련 설정과 함께 소켓 객체만 생성
Socket(SocketImpl impl) 사용자가 지정한 SocketImpl 객체 사용해 소켓 객체만 생성
Socket(InetAddress address, int port) 소켓 객체 생성 후 address와 port 사용하는 서버에 연결
Socket(InetAddress address, int port, InetAddress localAddr, int localPort) 소켓 객체 생성 후 address와 port 사용하는 서버에 연결하며,
지정한 localAddr와 localPort에 접속
Socket(String host, int port) 소켓 객체 생성 후 host와 port를 사용하는 서버에 연결
(가장 편한 방법)
Socket(String host, int port, InetAddress localAddr, int localPort) 소켓 객체 생성 후 host와 port를 사용하는 서버에 연결하며,
지정된 localAddr와 localPort에 접속

ServerSocket과 Socket 클래스에서는 많은 메서드 제공하니 API 참고하기

소켓 연결에 문제가 있을 경우 끊어주는 Timeout 관련 메서드 꼭 직접 확인하기(운영용 시스템 개발 시 Timeout 매우 중요!)

 

p.759 ~ 765

+++ 소켓 대기하는 서버 예제

 

 

 

UDP

TCP와 달리, 데이터가 제대로 전달되었다는 보장 X

UDP 관련 프로그램은 데이터 유실 있어도 문제 없을 때에만 사용하기

DatagramSocket DatagramPacket
클래스 하나에서 보내는 역할과 받는 역할 모두 수행 가능 데이터 주고 받을 때 스트림 사용 X, 이 클래스 사용

 

DatagramSocket 생성자

생성자 설명
DatagramSocket() 소켓 객체 생성 후 사용 가능한 포트로 대기
DatagramSocket(DatagramSocketImpl impl) 사용자가 지정한 SocketImpl 객체 사용해 소켓 객체만 생성
DatagramSocket(int port) 소켓 객체 생성 후 지정된 port로 대기
DatagramSocket(int port, InetAddress address) 소켓 객체 생성 후 address와 port 사용하는 서버에 연결
DatagramSocket(SocketAddress address) 소켓 객체 생성 후 address에 지정된 서버로 연결
  • 더 사용할 필요 없을 때를 위해 close() 메서드 제공
리턴 타입 메서드 설명
void receive(DatagramPacket packet) 메서드 호출 시 요청 대기
데이터 받았다면 packet 객체에 데이터 저장
void send(DatagramPacket packet) packet 객체에 있는 데이터 전송

위 두 개 메서드의 매개 변수로 제공되는 DatagramPacket 생성자

생성자 설명
DatagramPacket(byte[] buf, int length) length 크기 갖는 데이터를 "받기" 위한 객체 생성 데이터 받기 위한 생성자
DatagramPacket(byte[] buf, int length, InetAddress address, int port) 지정된 address와 port로 데이터 전송하기 위한 객체 생성 데이터 전송하기 위한 생성자
DatagramPacket(byte[] buf, int offset, int length) 버퍼의 offset이 할당된 데이터 전송하기 위한 객체 생성
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) 버퍼의 offset 할당되어 있고,
지정된 address와 port로 데이터 전송하기 위한 객체 생성
DatagramPacket(byte[] buf, int offset, int length, SocketAddress address) 버퍼의 offset이 할당되어 있고,
지정된 소켓 address로 데이터 전송하기 위한 객체 생성
DatagramPacket(byte[] buf, int length, SocketAddress address) 지정된 소켓 address로 데이터 전송하기 위한 객체 생성
  • 여기서의 byte 배열 = 전송되는 데이터
  • offset = 전송되는 byte 배열의 첫 위치
  • length = 데이터의 크기(byte 배열의 크기 > length ➡ java.lang.IllegalArgumentException 발생)

 

  • DatagramPacket 클래스 메서드에서 중요한 메서드
getData() getLength()
byte[]로 전송받은 데이터 리턴 전송받은 데이터 길이를 int 타입으로 리턴

 

p.767 ~

+++ UDP 통신 예제

'Backend > Java' 카테고리의 다른 글

[Java] 기본 자료형 & 참조 자료형  (0) 2023.12.05
[자바의 신] 29장 (ongoing)  (0) 2022.08.31
[자바의 신] 27장 (ongoing)  (0) 2022.08.18
[자바의 신] 26장 (ongoing)  (0) 2022.08.18
[자바의 신] 25장 (ongoing)  (0) 2022.08.18

댓글