0_ch4n
기계쟁이\n개발자
0_ch4n
0chn.xxx@gmail.com @0ch._.n
전체 방문자
오늘
어제

공지사항

  • All (282)
    • 🖥 CS (21)
      • 네트워크 (12)
      • 운영체제 (3)
      • 자료구조 (2)
      • Web (4)
    • 🧠 Algorithm (185)
      • [C] BOJ (93)
      • [JAVA] Programmers (91)
    • 📚 Study (69)
      • HTML&CSS (19)
      • MySQL (11)
      • JAVA (22)
      • Servlet&JSP (8)
      • Thymeleaf (2)
      • Spring (5)
      • JPA (2)
    • 📖 Book (1)
    • 📃 Certification (6)
      • 정보처리기사 (6)

인기 글

최근 글

최근 댓글

태그

  • Programmers
  • til
  • 자바
  • 코딩테스트
  • 코테
  • java
  • kakao
  • CSS
  • 프로그래머스
  • 카카오

블로그 메뉴

  • 홈
  • 태그
  • 방명록

티스토리

hELLO · Designed By 정상우.
0_ch4n

기계쟁이\n개발자

[JAVA] 네트워킹
📚 Study/JAVA

[JAVA] 네트워킹

2022. 5. 14. 02:10
반응형

✔️ 네트워킹

  • 두 대 이상의 컴퓨터를 케이블로 연결하여 네트워크를 구성하는 것을 말한다

 

📌 클라이언트/서버

  • 컴퓨터간의 관계를 역할로 구분한 것
    • 서버(server) : 서비스를 제공하는 컴퓨터로 이를 위해 서버프로그램이 있어야 한다
    • 클라이언트(client) : 서비스를 제공받는 컴퓨터로 이를 위해 서버프로그램과 연결할 수 있는 클라이언트 프로그램이 있어야 한다
  • 일반 PC로도 FTP Serv-U, Tomcat과 같은 서버프로그램으로 서버 역할을 수행할 수 있다
  • 네트워크를 구성할 때 전용서버의 유무와 역할에 따라 여러 모델로 나뉜다

 

📌 IP 주소

  • 컴퓨터(호스트)를 구별하는데 사용되는 고유한 값으로 모든 컴퓨터는 IP 주소를 갖는다
  • 4byte(32bit)의 정수로 구성되어 있으며 a.b.c.d는 각각 부호없는 1byte값(0~255)의 정수이다
  • IP 주소는 네트워크 주소와 호스트 주소로 나눌 수 있다

  • &연산자를 통해 마지막 8bit가 0인 것을 통해 a.b.c는 네트워크 주소고 d는 호스트 주소라는걸 알 수 있다
  • 이 때 호스트 주소가 0인 것은 자신을 가리키고 255는 예약된 브로드캐스트 주소기 때문에 실제 호스트 개수는 254개이다

 

📌 InetAddress

  • IP 주소를 다루기 위한 클래스이다

InetAddress의 메서드

InetAddress ip = null;
InetAddress[] ipArr = null;

try {
    ip = InetAddress.getByName("www.naver.com");
    System.out.println(ip.getHostName()); //www.naver.com
    System.out.println(ip.getHostAddress()); //222.122.84.200
    System.out.println(ip.toString()); //www.naver.com/222.122.84.200

    byte[] ipAddr = ip.getAddress();
    System.out.println(Arrays.toString(ipAddr)); //[-34, 122, 84, -56]

    String result = "";
    for(int i = 0; i < ipAddr.length; i++) {
        result += (ipAddr[i] < 0) ? ipAddr[i] + 256 : ipAddr[i];
        result += ".";
    }

    System.out.println(result); //222.122.84.200
} catch (UnknownHostException e) {}

try {
    ip = InetAddress.getLocalHost();
    System.out.println(ip.getHostName()); //chan
    System.out.println(ip.getHostAddress()); //192.168.0.1
} catch (UnknownHostException e) {}

try {
    ipArr = InetAddress.getAllByName("www.naver.com");
    //ipArr[0] : www.naver.com/222.122.84.200
    //ipArr[1] : www.naver.com/222.122.84.250
    //ipArr[2] : www.naver.com/61.247.208.6
} catch (UnknownHostException e) {}

 

📌 URL(Uniform Resource Locator)

  • 인터넷에 존재하는 여러 서버들이 제공하는 자원에 접근할 수 있는 주소를 표현하기 위한 것이다
  • 프로토콜://호스트명:포트번호/경로명/파일명?쿼리스트링#참조 (포트번호, 쿼리, 참조 생략가능)
  • ex) http://www.codechobo.com:80/sample/hello.html?referer=codechobo#index1
    • 프로토콜 : 자원에 접근하기 위해 서버와 통신하는데 사용되는 통신규약
    • 호스트명 : 자원을 제공하는 서버의 이름
    • 포트번호 : 통신에 사용되는 서버의 포트번호 (기본 포트번호 80)
    • 경로명 : 접근하려는 자원이 저장된 서버상의 위치
    • 파일명 : 접근하려는 자원의 이름
    • 쿼리 : URL에서 ?이후의 부분
    • 참조 : URL에서 #이후의 부분

URL의 메서드

URL url = new URL("http://www.codechobo.com:80/sample/"
                        +"hello.html?referer=codechobo#index1");

System.out.println(url.getAuthority()); // www.codechobo.com:80
System.out.println(url.getContent()); // sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@c17164
System.out.println(url.getDefaultPort()); // 80
System.out.println(url.getPort()); // 80
System.out.println(url.getFile()); // /sample/hello.html?referer=codechobo
System.out.println(url.getHost()); // www.codechobo.com
System.out.println(url.getPath()); // /sample/hello.html
System.out.println(url.getProtocol()); // http
System.out.println(url.getQuery()); // referer=codechobo
System.out.println(url.getRef()); // index1
System.out.println(url.getUserInfo()); // null
System.out.println(url.toExternalForm()); // http://www.codechobo.com:80/sample/hello.html?referer=codechobo#index1
System.out.println(url.toURI()); // http://www.codechobo.com:80/sample/hello.html?referer=codechobo#index1

 

📌 URLConnection

  • 어플리케이션과 URL간의 통신연결을 나타내는 클래스의 최상위 클래스로 추상 클래스이다
메서드 설명
void addRequestProperty(String key, String value) 지정된 키와 값을 RequestProperty에 추가한다
기존에 같은 키가 있어도 값을 덮어쓰지 않는다
void connect() URL에 저장된 자원에 대한 통신연결을 연다
boolean getAllowUserInteraction() UserInteraction의 허용여부를 반환한다
int getConnectTimeout() 연결종료시간을 천분의 일초로 반환한다
Object getContent() content객체를 반환한다
Object getContent(Class[] classes) content객체를 반환한다
String getContentEncoding() content의 인코딩을 반환한다
int getContentLength() content의 크기를 반환한다
String getContentType() content의 type을 반환한다
long getDate() 헤더(header)의 date필드의 값을 반환한다
boolean getDefaultAllowUserInteraction() defaultAllowUserInteraction의 값을 반환한다
String getDefaultRequestProperty(String key) RequestProperty에서 지정된 키의 디폴트값을 얻는다
boolean getDefaultUseCaches() useCache의 디폴트 값을 얻는다
boolean getDoInput() doInput필드값을 얻는다
boolean getDoOutput() doOutput필드값을 얻는다
long getExpiration() 자원(URL)의 만료일자를 얻는다 (천분의 일초단위)
FileNameMap getFileNameMap() FileNameMap(mimetable)을 반환한다
String getHeaderField(int n) 헤더의 n번째 필드를 읽어온다
String getHeaderField(String name) 헤더에서 지정된 이름의 필드를 읽어온다
long getHeaderFieldDate(String name, long Default) 지정된 필드의 값을 날짜값으로 변환하여 반환한다
필드값이 유효하지 않을 경우 Default값을 반환한다
int getHeaderFieldInt(String name, long Default) 지정된 필드의 값을 정수값으로 변환하여 반환한다
필드값이 유효하지 않을 경우 Default값을 반환한다
int getHeaderFieldKey(int n) 헤더의 n번째 필드를 읽어온다
Map getHeaderFields() 헤더의 모든 필드와 값이 저장된 Map을 반환한다
long getIfModifiedSince() ifModifiedSince(변경여부) 필드의 값을 반환한다
InputStream getInputStream() URLConnection에서 InputStream을 반환한다
long getLastModified() LastModified(최종변경일) 필드의 값을 반환한다
OutputStream getOutputStream() URLConnection에서 OutputStream을 반환한다
Permission getPermission() Permission(허용권한)을 반환한다
int getReadTimeout() 읽기제한시간의 값을 반환한다 (천분의 일초)
Map getRequestProperties() RequestProperty에 저장된 (키,값)을 Map으로 반환
String getRequestProperty(String key) RequestProperty에서 지정된 키의 값을 반환한다
URL getURL() URLConnection의 URL을 반환한다
boolean getUseCaches() 캐쉬의 사용여부를 반환한다
String guessContentTypeFromName(String fname) 지정된 파일(fname)의 content-type을 추측하여 반환한다
String guessContentTypeFromStream(InputStream is) 지정된 입력스트림(is)의 content-type을 추측하여 반환한다
void setAllowUserInteraction(boolean allowuserinteraction) UserInteraction의 허용여부를 설정한다
void setConnectTimeout(int timeout) 연결종료시간을 설정한다
void setContentHandlerFactory(boolean ContentHandlerFactory fac) ContentHandlerFactory를 설정한다
void setDefaultAllowUserInteraction(boolean defaultallowuserinteraction) UserInteraction 허용여부의 기본값을 설정한다
void setDefaultRequestProperty(String key, String value) RequestProperty의 기본 키쌍(key-pair)을 설정한다
void setDefaultUseCaches(boolean defaultusecaches) 캐쉬 사용여부의 기본값을 설정한다
void setDoInput(boolean doinput) DoInput 필드의 값을 설정한다
void setDoOutput(boolean dooutput) DoOutput 필드의 값을 설정한다
void setFileNameMap(FileNameMap map) FileNameMap을 설정한다
void setIfModifiedSince(long ifmodifiedsince) ModifiedSince 필드의 값을 설정한다
void setReadTimeout(int timeout) 읽기제한시간을 설정한다 (천분의 일초)
void setRequestProperty(String key, String value) RequestProperty에 (key, value)를 저장한다
void setUseCaches(boolean usecaches) 캐쉬의 사용여부를 설정한다
URL url = null;
BufferedReader input = null;
String address = "http://www.naver.com";
String line = "";

try {
    url = new URL(address);
    input = new BufferedReader(new InputStreamReader(url.openStream()));

    while((line = input.readLine()) != null) {
        System.out.println(line);
    }
    input.close();
} catch (Exception e) {}

 

✔️ 소켓 프로그래밍

  • 프로세스 간의 통신을 위한 소켓을 이용한 통신 프로그래밍으로 java.net 패키지를 통해 구현할 수 있다

 

📌 TCP와 UDP

  • TCP/IP 프로토콜은 이기종 시스템 간의 통신을 위한 표준 프로토콜로 프로토콜의 집합이다
  • TCP와 UDP는 TCP/IP 프로토콜에 포함되어 있으며 OSI 7계층 중 전송계층에 해당한다
항목 TCP UDP
연결방식 연결기반(connection-oriented)
- 연결 후 통신 (전화기)
- 1:1 통신방식
비연결기반(connectionless-oriented)
- 연결없이 통신 (소포)
- 1:1, 1:n, n:n 통신방식
특징 데이터의 경계를 구분안함 (byte-stream)
신뢰성 있는 데이터 전송
- 데이터의 전송순서가 보장됨
- 데이터의 수신여부를 확인함
  (데이터가 손실되면 재전송됨)
- 패킷을 관리할 필요가 없음
UDP보다 전송속도가 느림
데이터의 경계를 구분함 (datagram)
신뢰성 없는 데이터 전송
- 데이터의 전송순서가 바뀔 수 있음
- 데이터의 수신여부를 확인안함
  (데이터가 손실되어도 알 수 없음)
- 패킷을 관리해주어야 함
TCP보다 전송속도가 빠름
관련 클래스 Socket
ServerSocket
DatagramSocket
DatagramPacket
MulticastSocket

 

📌 TCP 소켓 프로그래밍

  • 통신과정
    1. 서버 프로그램에서는 서버소켓을 사용해서 서버 컴퓨터의 특정 포트에서 클라이언트의 연결요청을 처리할 준비를 한다
    2. 클라이언트 프로그램은 접속할 서버의 IP주소와 포트 정보를 가지고 소켓을 생성해서 서버에 연결을 요청한다
    3. 서버소켓은 클라이언트의 연결요청을 받으면 서버에 새로운 소켓을 생성해서 클라이언트의 소켓과 연결되도록 한다
    4. 이제 클라이언트의 소켓과 새로 생성된 서버의 소켓은 서버소켓과 관계없이 일대일 통신을 한다
  • 통신은 포트 정보로 이루어지는데 서버 소켓은 클라이언트 소켓과 연결을 위해 포트를 독점해야 한다
  • 소켓은 입력/출력스트림을 가지고 있으며 연결된 소켓과 서로 교차하여 연결된다

  • 자바에서는 TCP 소켓 프로그래밍을 위한 클래스를 제공한다
    • Socket : 프로세스 간의 통신을 담당하며 InputStream/OutputStream을 통해 프로세스 간 입출력이 이루어진다
    • ServerSocket : 포트와 연결되어 연결요청이 오면 소켓을 생성해 통신한다 (한 포트에 한 소켓)

 

📌 UDP 소켓 프로그래밍

  • TCP 소켓 프로그래밍과 마찬가지로 UDP 소켓 프로그래밍을 위한 클래스를 제공한다
    • DatagramSocket : 데이터를 DatagramPacket에 담아서 전송한다
    • DatagramPacket : 헤더(호스트의 주소와 포트)와 데이터로 구성되어있다

 

📄 참고

자바의 정석 3rd Edition

반응형
저작자표시 (새창열림)

'📚 Study > JAVA' 카테고리의 다른 글

[JAVA] 직렬화(Serialization)  (0) 2022.05.13
[JAVA] 표준 입출력과 파일 입출력  (0) 2022.05.13
[JAVA] 입출력과 스트림  (0) 2022.05.13
[JAVA] 스트림(Stream)  (0) 2022.05.12
[JAVA] 람다와 함수형 인터페이스  (0) 2022.05.11
    0_ch4n
    0_ch4n
    while(true) { study(); }

    티스토리툴바