JAVA

Network

스물훈 2020. 5. 4. 17:10

Network

- java.net 패키지

1. InetAddress

- IP정보를 사용하기 위한 클래스

- abstract class도 아니고 interface도 아님

- 생성자 없음. 모든 메서드가 static인지 확인 -> 모든 메서드가 static아님

- 자신과 동일한 자료형을 리턴하는 static메서드가 있는지 확인

 

1) 인스턴스 생성

static InetAddress getLocalHost(): 자신의 단말기의 IP정보 리턴

static InetAddress getByName(String hostName): hostName에 해당하는 단말기 1개의 IP정보 리턴

static InetAddress [] getAllByName(String hostname): 전체 IP정보를 배열로 리턴

 

'

2. Socket

- NIC(Network Interface Card - LAN Card)를 프로그래밍에서 사용하기 위해서 추상화한 개념

1) socket에 따른 통신 방식 구현

-> Low Level통신: Socket을 직접 생성해서 사용하는 방식(효율을 좋지만 어려움).

                               

-> High Level통신: 이미 만들어진 프로토콜을 이용해서 Socket을 직접 생성하지 않고 통신하는 방식.

                              (효울을 안좋지만 쉬움, http, https등을 이용하는 웹 통신)

 

2) 전송 방식에 따른 분류

-> 연결형 통신(TCP - Stream): 데이터 주고 받을 연결을 해서 메시지를 주고 받으면서 통신하는 방식

-> 비연결형 통신(UDP - Datagram): 데이터를 보내는 곳에서 데이터를 받는 곳으로 일방적으로

                                                        메시지를 전송하는 방식. push message 전송 등에 적합

-> http는 연결형 통신인데 한번 메시지를 주고 받으면 연결을 해제함.

    채팅 서비스와 같은 것을 구현하고자 하면 http 보다는 하위 수준의 소켓 통신이나 web socket을 이용하는 것이 바람직함.

 

3.TCP 통신 - StreamSocket

1) 소켓 생성

Socket(접속할 단말의 IP, 포트번호): 단말과 접속을 하고 통신을 할 수 있도록 생성

2) 소켓 닫기

close()

 

3) 소켓 주요 메소드

InetAddress getInetAddress(): 상대방 IP 정보 리턴

InetAddress getLocalAddress(): 자신의 IP 정보 리턴

int getPort(): 상대방 포트 번호

int getLocalPort(): 자신의 포트 번호

 

InputStream getInputStream(): 데이터를 읽어오기 위한 스트림 리턴

OutputStream getOutputStream(): 데이터를 전송하기 위한 스트림 리턴

 

 

4.Stream - TCP 통신

1) 서버 역할을 수행하는 소켓 - ServerSocket

=> 클라이언트의 접속을 대기하는 소켓

 

2) 생성자

ServerSocket(int port): 포트번호를 가지고 생성

ServerSocket(int port, int backlog): backlog는 접속할 수 있는 클라이언트의 수 

 

3) 메소드

Socket accept(): 이 메소드를 호출하면 서버는 블락된 상태로 대기하고 있다가 클라이언트가 접속하면

                           클라이언트와 통신에 필요한 Socket을 리턴

 

void close(): 서버 소켓을 닫는 메소드

 

4) 통신과정

- 서버 소켓을 생성해서 클라이언트의 접속 대기

- 클라이언트에서 소켓을 생성해서 서버에 연결

- 데이터를 주고 받기

- 소켓 닫기

 

5) TCP 소켓 통신

 

5.Datagram Socket

- 비연결형 통신, UDP 통신

- 연결하는 과정없이 일방적으로 데이터를 전송하는 방식

- 수신 상태를 확인할 수 없는 방식

 

1) DatagramSocket 생성자

DatagramSocket(int port): 받는 쪽은 port번호를 설정해서 생성

DatagramSocket(int port, InetAddress addr): IP가 2개 이상일 때 직접 IP를 지정

 

DatagramSocket(): 보내는 쪽에서 생성

 

2) 메소드

void close()

 

void receive(DatagramPacket dp): 받는 메서드

void send(DatagramPacket dp): 보내는 메서드

 

3) DatagramPacket의 생성자

DatagramPacket(byte[] buf, int length): 받는쪽에서 생성 - 바이트 배열을 만들어서 대입

DatagramPacket(byte[] buf, int length, InetAddress addr, int port): 보내는쪽에서 생성

 

4) 문자열과 바이트 배열

문자열을 바이트 배열로 만들 때는 문자열.getByte()

바이트 배열을 문자열로 만들 때는 new String(바이트 배열)

 

5) Multicast

- 그룹 내에 있는 모든 단말기에서 메시지를 전송하는 통신 방식

- UDP방식을 이용해서 해야 하고 IPv4의 경우는 224.0.0.0 ~. 39.255.255.255 사이의 ip를 이용해야 하고

   IPv6는 ff00::으로 시작하는 ip를 이용해야 함.

   Windows는 IPv4, IPv6 둘 다 되는데 Mac은 IPv6만 가능

- 보내고 받는 방식은 UDP와 동일하고 클래스가 MulticastSocket으로 변경되고 그룹에 참여할 때는

   joinGroup을 호출해야 하고 빠져나갈때는 leaveGroup이라는 메소드를 호출하면 됨.

 

URL

- 웹 서버에 데이터를 요청하고 전송받는 통신

- 고레벨 통신 방식이라서 소켓을 직접 생성할 필요가 없음.

- 웹상에서 자원의 고유한 위치

- 구성: 프로토콜://도메인 or ip: 포트번호/경로?이름=값&이름=값.....

- 프로토콜은 대부분 http나 https로 시작하는데 //로 시작하는 경우가 있는데 이 경우는

   상황에 따라 http 또는 https로 접속함 

- 포트번호는 생략이 가능한 경우가 있는데 이 경우는 기본적으로 설정된 포트를 이용해서 서버를 만든 경우.

- 경로도 생략이 가능한 경우가 있는데 이 경우는 서버 설정에서 없으면 어떤 파일을 출력하라고 되어있기 때문

- 이름=값 형태를 query string이라고 하기도 하고 parameter라고 하기도 함.

   서버에게 전송하는 데이터, 없는 경우도 있음.

 

2. Java에서의 URL통신

1) URL을 생성

URL(String url): url이 잘못될 수 있어서 예외처리를 반드시 해주어야 함

 

2) URLConnection을 생성

연결은 URL인스턴스.openConnection()을 호출하면 되는데 리턴되는 인스턴스는

URLConncection타입인데 HttpYRLConnection 타입으로 강제 형변환해서 사용

 

3) HttpURLConnection을 가지고 옵션을 설정

setConnectionTimeout(int 초단위시간): 최대 접속 시간 설정

setUseCashes(boolean 캐시 사용 여부)

setRequestProperty(String name, String value)

addRequestProperty(String name, String value)

 

4) 데이터 주고받기

HttpURLConnection 객체의 getInputStream()이나 getOutputStream()을 호출해서 스트림을 받아서 사용

 

문자열 받기

new BufferedReader(new InputStreamReader(con.getInputStream()))

 

파일 다운로드

new BufferedInputStream(con.getInputStream())

 

데이터를 받아와서 사용하는 경우 이전 데이터와 동일하다면 바로 사용을 하고 이전 데이터가 존재하지 않거나 업데이트 된 경우

다운로드 받는것이 좋다

 

- 네트워크 입출력은 불확실성이 높은 작업이다.

   네트워크 입출력 작업은 스레드를 이용해서 하도록 권장함.

   안드로이드의 경우 네트워크 입출력을 하는 경우 스레드를 이용하지 않으면 실행되지 않음

   ios의 경우 마켓에서 reject됨.