'JAVA/자바 네트워크 프로그래밍'에 해당되는 글 8건

JAVA/자바 네트워크 프로그래밍

sha 256 다이제스트 생성(Thread)

package practice1;


import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.security.DigestInputStream;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;


import javax.xml.bind.DatatypeConverter;


public class practice extends Thread{

private String filename;


public practice(String filename){

this.filename = filename;

}

public void run(){

FileInputStream in;

FileOutputStream out;

try{

in= new FileInputStream(filename); //파일 입력 

out = new FileOutputStream(filename+"1");

MessageDigest sha = MessageDigest.getInstance("SHA-256"); //SHA-256 hash값 생성

DigestInputStream din = new DigestInputStream(in, sha); //지정된 입력 Stream과 메세지 다이제스트를 사용해, 다이제스트를 입력하는 Stream을 작성합니다.

din.close();

byte[] digest = sha.digest(); //암호된 다이제스트를 digest byte 배열 안에 삽입

StringBuilder result = new StringBuilder(filename);

result.append(": ");

result.append(DatatypeConverter.printHexBinary(digest)); // byte 배열을 hex 문자열로 형변환

System.out.println(result);

}catch(IOException ex){

ex.printStackTrace();

System.err.println(ex.getMessage());

}catch (NoSuchAlgorithmException ex){

ex.printStackTrace();

System.err.println(ex.getMessage());

}

}

public static void main(String args[]){

Thread t = new practice("practice1.txt");

t.start();

}

}





practice1.txt

- thisiskey



result view


'JAVA > 자바 네트워크 프로그래밍' 카테고리의 다른 글

sha 256 다이제스트 생성(Thread)  (0) 2016.12.24
Runnable을 사용한 MD5 다이제스트 생성방법  (0) 2016.12.24
HTTP  (0) 2016.12.24
URL 그리고 URI, Proxy  (0) 2016.12.24
소켓 통신 (어플리케이션)  (0) 2016.12.24
UDP 통신  (0) 2016.12.24
JAVA/자바 네트워크 프로그래밍

Runnable을 사용한 MD5 다이제스트 생성방법

Runnable을 사용한 MD5 다이제스트 생성방법


package practice1;


import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.security.DigestInputStream;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;


import javax.xml.bind.DatatypeConverter;


public class practice implements Runnable{

private String filename;


public practice(String filename){

this.filename = filename;

}

public void run(){

FileInputStream in; // 해제 패턴

try{

in = new FileInputStream(filename);

MessageDigest sha = MessageDigest.getInstance("MD5"); //MD5 다이제스트 생성

DigestInputStream din = new DigestInputStream(in,sha);

while(din.read() != -1);

din.close();

byte[] digest = sha.digest();

StringBuilder result = new StringBuilder(filename);

result.append(": ");

result.append(DatatypeConverter.printHexBinary(digest));

System.out.println(result);

}catch (NoSuchAlgorithmException ex){

ex.printStackTrace();

System.err.println(ex.getMessage());

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public static void main(String args[]){

practice prac = new practice("practice1.txt");

Thread t = new Thread(prac);

t.start();

}

}


Runnable을 사용하면 


Thread를 사용할때 보다 더 좋은 이유는 다른 서브 클래스를 상속 받을 수 있기 때문이다.


practice1.txt

- thisiskey


result view

'JAVA > 자바 네트워크 프로그래밍' 카테고리의 다른 글

sha 256 다이제스트 생성(Thread)  (0) 2016.12.24
Runnable을 사용한 MD5 다이제스트 생성방법  (0) 2016.12.24
HTTP  (0) 2016.12.24
URL 그리고 URI, Proxy  (0) 2016.12.24
소켓 통신 (어플리케이션)  (0) 2016.12.24
UDP 통신  (0) 2016.12.24
JAVA/자바 네트워크 프로그래밍

HTTP

HTTP 웹클라이언트가 서버와 대화하는 방법과 서버에서 다시 클라이언트로 데이터가 전송되는 방법을 정의한 표준이다.

 

HTTP 일반적으로 HTML파일과  안에 포함된 이미지를 전송하는 수단쯤으로 생각되지만HTTP 데이터 형식을 가리지 않고전송이 가능하다.

 

 

HTTP  브라우저와  서버 사이에 통신을 위한 표준 프로토콜이다.

 

HTML 연결(클라이언트의 서버로의 요청)

  1. 클라이언트가 서버의 HTTP 기본 포트 80 대해 TCP 연결을 연다다른 포트 사용시 URL 명시
  2. 클라이언트가 특정 경로에 위치한 리소스를 요청하는 메시지를 서버로 보낸다요청에는 헤더와 선택적으로  줄로 구분된데이터가 포함된다.
  3. 서버는 클라이언트에게 응답을 보낸다응답은 응답 코드로 시작하며메타데이터의 전체 헤더와   그리고 요청된 문서 또는 에러 메시지가 뒤따라온다.
  4. 연결을 종료한다.

 

요청본문.

  1. 헤더

기본적으로 클라이언트에서 요청시  줄에

전송방식 파일위치 클라이언트가 지원하는 프로토콜 버전이다.

Ex) GET /index.html HTTP/1.1

 

  1. 추가적인 정보가 필요할 때는 키워드value 식으로 전송한다.

Keyword: value

-> 키워드는 대소문자를 가리지 않는다그러나 값은 경우에 따라 대소문자를 가리기도 한다.

-> 헤더의 각줄은 캐리지리턴과 라인피드의 쌍으로 끝난다.

 

  1. 마지막 

마지막줄에 사용되는 키워드 Accept 클라이언트가 처리   있는 데이터의 타입을 알려준다.(서버에서 무조건 참고하는것은 아니다.)

EX) Accept: text/html, text/plain, image/gif, image/jpeg

 

 

 

MIME

MIME타입은  레벨로 구분된다(타입서브타입)

->타입은 매우 일반적인 데이터의 종류(그림인지 텍스트인지)

->서브타입은 구체적인 데이터의 타입을 나타낸다.(GIF이미지JPEG 이미지TIFF 이미지)

타입은  8가지가 있다.

Text/* 사람이 읽을  있는 문자 타입

images/그림 타입

Model/* VRML 파일과 같은 3D모델 타입

Audio/* 소리 타입

Video/* 소리를 포함할  있는 움직이는 그림 타입

Application/* 바이너리 데이터 타입

Message/* 이메일 메시지와 HTTP 응답과 같은 프로토콜에 따른 엔벨로프 타입

Multipart/* 다수의 문서와 리소스의 컨테이너 타입

 

 

서버에서 오는 응답

서버에서  번째 줄은 프로톨콜과 응답 코드를 나타낸다200 OK 가장 일반적으로 성공했다는 의미이다.

100~199까지는 항상 정보를 제공하는 용도로 사용되고, 200에서 299까지는 항상 성공을 의미한다그리고 300~399까지는 항상 전송방향을바꾸는 용도로 사용되고, 400~499까지는 항상 클라이언트의 요청에러가 나타난다마지막으로 500~599까지는 서버 에러이다.

Ex) HTTP/1.1 200 OK

 

추가적인 헤더는 응답이 만들어진 서버 기준의 시간서버 소프트웨어전송 종료  연결의 상태MIME 미디어 타입전송된 문서의 크기를 보내준다.

 

Keep-Alive

HTTP 1.0 요청마다 새로운 연결을 연다.

실제로일반적인 하나의  세션에서 모든 연결을 열고 닫는데 엄청난 시간이 들고 https 경우 SSL이나 TLS 사용하는 암호화된연결의 경우 일반 소켓 보다  많은 작업을 필요로 한다.

 

HTTP1.1에서는 한번열린 소켓을 닫지 않는다.

클라이언트는 HTTP 요청 헤더의 Connection 필드의 값을 Keep-Alive 설정하여 소켓을  사용할 것임을 표시한다.

Connection:Keep-Alive

 

 URL 클래스는 명시적으로 해제하지 않는  투명하게 HTTP 연결 유지(Keep-Alive) 기능을 지원한다URL 클래스는 서버가 해당 연결을 종료하기 전에 같은 서버에 다시 연결할 경우 소켓을 재사용한다.

 

 

 

HTTP 메소드

HTTP 서버와의 통신은 요청-응답 패턴을 따른다.

각각의 HTTP 요청은 다음  또는  요소로 구성된다.

->  번째 줄은 HTTP 메소드와 메소드가 실행될 리소스의 경로를 포함하고 있다.

-> 이름- 필드로 구성된 헤더는 인증 자격과 선호하는 데이터 타입과 같은 메타정보를 제공한다.

-> 요청 본문은 요청된 리소스의 실제 데이터를 포함하고 있다.(POST, PUT 한정)

 

HTTP 메소드에는 아래와 같은 4가지 주요 메소드가 있다.

-> GET, POST, PUT, DELETE

4개의 메소드는 모두 일정의 규칙을 가지고 있어아무때나 사용할  있는 것은 아니다.

 

  1. GET메소드

-> GET 메소드는 요청한 리소스를 읽어 들인다GET메소드는 요청에 실패해도 추가적인 부작용이 발생하지 않기 때문에 반복적으로 보내도 된다.  GET 미리 요청을   있어 필요한 페이지를 미리 로드 요청할  있다.

 

  1. PUT 메소드

-> PUT 메소드는 URL 명시된 서버로 리소스를 업로드 한다PUT 메소드는 부작용에서 자유롭지 않지 않지만실패 여부에 상관없이 반복 요청이 가능하다.

 

  1. DELETE 메소드

-> 지정된 URL 리소스를 삭제한다 메소드 역시 부작용으로 부터 자유롭지는 않지만삭제 요청의 성공 여부가 확실하지 않을경우 요청을 다시 보내기만 하면 된다. (반복 요청이 가능)

 

  1. POST 메소드

-> URL 명시된 서버로 리소스를 업로드 하지만새로 업로드된 리소스로 서버가 해야할 일을 명시하지 않는다서버는 업로드된리소스에 대해 해당 URL 반드시 접근 가능하도록 만들어야 하는 것은 아니다대신 다른 URL 이동시키거나완전히 다른 리소스의 상태를 변경하는데 업로드된 리소스를 사용할 수도 있다POST 구매하기와 같이 반복 요청에 대해 안전하지 않는 동작에 사용해야한다.

 

 메소드들의 차이점

-> GET 요청은 URL 안에 필요한 모든 정보를 포함하고 있기 때문에미리 로드가 가능하다그리고 변화를 일으키지 않는 동작을 수행한다.

-> 다른 3가지 메소드들은 북마크하거나 링크를 만드는 등에 동작에 사용할  없으며변화를 일으키는 동작을 수행한다.

Ex0 쇼핑카트에 아이템 추가는 서버에 변경 요청을 하지 않기에 GET으로 보낸다그러나 주문을  때는 변경 요청이 발생하므로POST 보내야하 한다.

 

데이터를 전송할때 Header  개의 필드는 필수이다.

Content-length 필드는 본문의 바이트 수를 명시.

Content-type 필드는 바이트의 MIME 미디어 타입을 명시한다.

 

쿠키

많은  사이트는 연결들 사이에서 지속적인 클라이언트 측의 상태를 저장하기 위해 쿠키라는 알려진 텍스트의 작은 문자열을 사용한다.

쿠키는 서버에서 클라이언트로 전달되고 HTTP 요청과 응답의 헤더를 통해 다시 전달된다.

-> 쿠키는 세션 ID, 쇼핑 카트로그인 자격 정보사용자 설정과 같은 것들을 표시하기 위해 서버에 의해 사용된다.

-> 서버는 클라이언트의 부라우저에 쿠키를 설정하기 위해 HTTP 헤더에 Set-Cookie 헤더를 포함시킨다.

Ex) Set-Cookie: cart=ATVPDKIKX0DER

서버는 하나 이상의 쿠키를 설정할  있다.

쿠키는 이름=값을 지정하는  이외에도 유효기간경로 도메인포트버전 그리고 보안옵션과 같은 쿠키 자신의 범위를 제어하는 다양한 속성을 가질  있다.

 

쿠키는 비밀번호와 같은 민감 정보를 가질  있기네 secure라는 보안 속석을 설정해야한다.

Set-Cookie: key=etrogl7*;Domain=.foo.example.com; secure

브라우저는 이와 같은 쿠키에 대해 안전하지 않은 채널로 전송되지 않게 해야한다.

XSRF 같이 쿠키를 훔치는 공격에 대응하기 위해쿠키에 HttpOnly 속성을  정할  있다.

->  속성은 브라우저에게 HTTP HTTPS 통해서만 쿠키 값을 반환하도록 말한다특히 JavaScript에서 접근하지 못하도록 한다.

Set-Cookie: key=etrogl7*;Domain=.foo.example.com; secure; Httponly

'JAVA > 자바 네트워크 프로그래밍' 카테고리의 다른 글

sha 256 다이제스트 생성(Thread)  (0) 2016.12.24
Runnable을 사용한 MD5 다이제스트 생성방법  (0) 2016.12.24
HTTP  (0) 2016.12.24
URL 그리고 URI, Proxy  (0) 2016.12.24
소켓 통신 (어플리케이션)  (0) 2016.12.24
UDP 통신  (0) 2016.12.24
JAVA/자바 네트워크 프로그래밍

URL 그리고 URI, Proxy

URL 그리고 URI, Proxy


URI = URL + URN 관계

URN은 urn:isbn:0451450523 과같이 사용된다.

 

https://www.google.co.kr/search?q=uri

위의 링크에서 q 값에 따라서 값이 변경된다해당 주소에서 URL https://www.google.com/search 까지 이고 내가 원하는 정보를 얻기 위해서 q=uri라는 식별자가 필요하므로 위의 주소는 URI이다.

쿼리 문자열(query string) 서버에 추가적인 정보를 제공하는데 사용되며 일반적으로 서버상에서 실행 중인 프로그램에 인자를 제공하기 위한 form data 포함하고 있는 http URL에서만 사용된다.

 

URL 인터넷상에 있는 리소스의 위치를 명확하게 식별하는데 사용되며 URL 통합 리소스 식별자인 URI 가장 널리 사용중인 종류  한다.

 

URI

URI 특별한 구문으로 구성된 문자열이며 리소스를 식별하는데 사용된다.

URI 의해 식별되는 대상을 리소스라고 하고 리소스를 식별하는 문자열을 URI라고 한다.

 

URI 구문은 스킴(scheme) 스킴에 따라 달라지는  부분(scheme-specific-part)으로 구성 된다.,

->스킴

data 링크에 직접 포함된 Base64 인코딩된 데이터

File  로컬 디스크에 있는 파일

Ftp ftp 서버

Http http 사용햐는 서버

Magnet BitTorrent 같은 P2P 네트워크를 통해 다운로드가 가능한 리소스

Telnet 텔넷 기반 서비스 연결urn 통합 리소스 이름.

-> 추가적으로 자바에서는 rmi, jar, jndi, doc 등을 사용한다.

 

 

URL

-> URL 리소스를 식별하는  이외에도 클라이언트가 해당 리소스를 찾을  있는 네트워크상의 위치도 함께 제공하는 URI이다.

URI 클래스는 리소스를 식별하는 용도로만 사용되지만 URL 클래스는 리소스 식별 외에도 획득하는 목적으로도 사용된다.

 

URL 표현 형식 : 프로토콜://사용자 정보@호스트:포트/경로?쿼리#부위

프로토콜은 URI 스킴과 비슷한 의미이다.

 

Java.net.URL 클래스는 Object 확장한 것이며  이상 서브 클래스할수 없는 final 클래스이다.

URL 클래스는 불변 클래스이기 때문에 객체가 생성된  변경   없다.

 

URL 객체 생성하기

Try {

URL u = new URL("http://www.audubon.org"); //다양한 방식의 생성자가 제공되므로 사용 유형에 맞게 사용하길

} catch (MalformedURLException ex) {

System.err.println(ex);

}

지원하지 않는 프로토콜의 경우 malformedURLException 일으킨다.

 

 

상대적인 URL 객체 생성하기

try{

URL u1 = new URL("http://querybox.pnpsecure.com");

URL u2 = new URL(u1, "/ddd00");

} catch(MalformedURLException ex){

System.err.println(ex);

}

 

URL 객체의 제공 메소드

Public final InputStream openStream() throws IOException //openStream 메소드는 URL 의해 참조된 리소스에 연결하고 서버와 클라이언트의 연결에 필요한 작업을 처리한 다음데이터를 읽을  있는 InputStream 반환한다.

반환된 InputStream 통해서 읽은 데이터는 URL 참조하는 원본 그대로의 데이터(아스키 텍스트 파일을 읽고 있다면 아스키, HTML 파일을읽고 있다면 원본 HTML 반환)이다. ->  데이터에는 통신에 필요한 http 헤더나 다른 프로토콜 관련된 어떠한 정보도 포함되지 않는다반환된 InputStream 기존에 다른 InputStream 사용해서 읽던 방식과 동일한 방식이다.

 

public class Test {

public static void main(String args[]) throws IOException{

try{

URL u1 = new URL("http://querybox.pnpsecure.com");

InputStream in = u1.openStream();

int c;

while ((c = in.read()) != -1) System.out.write(c);

in.close();

System.out.println(c);

} catch(MalformedURLException ex){

System.err.println(ex);

}

}

}

 

URL openConnection 파일을 읽을 수있는 InputStream 반환한다.

 

URL에서 파일을 다운로드 할경우

URL url = new URL("주소");

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

Conn.connect();

 

In = new BufferedInputStream(conn.getInputStream()); //getInputStream 데이터를 받을 Stream 반환한다.

Out = new BufferedInputStream(new FileOutPutStream(filepath));

Byte[] buffer = new bye[1024];

While((byteRead = in.read(buffer)) != -1 ) {

Out.write(buffer, 0, bytesRead)

}

 

URL에서 참좀하는 데이터터를 getContent() 메소드를 이용하여 다운로드 하는 방법

URL u = new URL(args[0]);

Object o = u.getContent();

-> 받은 데이터의 유형을 알수 있는 방법이 instanceof 사용하는 방법밖에 없다.

 

URL 구성요소 받기

URL 구성하는 구성요소는

스킴 또는 프로토콜기관경로부위 지정자 또는 섹션 또는 참조쿼리문자열로 구분된다.

해당 데이터들은 입력된 URL 생성된 URL 객체의 getProtocoal, getPort등을 통해서 해당부분에 대한 정보를 받아올  있다.

 

URL 비교하기

URL 클래스는 일반적인 클래스에서 제공하는 equals hashCode()메소드를 제공한다.

Equals 실제로 해당 호스트에 대한 DNS 쿼리를 시도한다그래서 예를들어 www.ibiblio.org ibiblo.org 같다고 판단한다.

 

그러나 http://www.oreilly.com http://www.oreilly.com/index.html 같지않다. equals() 메소드는  URL 의해

식별된 리소스를 실제로 비교조차 하지 않는다.

이러한 리소스 비교를 시항하기 위해서는

Public boolean sameFile(URL other) 사용한다.

해당 메소드는 DNS 쿼리 역시 포함하지만, 부위 지정자는 고려하지 않는다.

 

URL u1 = new URL("http://www.ncsa.uiuc.edu/HTMLPrimer.html#GS");

URL u2 = new URL("http://www.ncsa.uiuc.edu/HTMLPrimer.html#HD");

System.out.println(u1.sameFile(u2));

-> true

 

URL URI 사용 차이

URI 순수한 문자열 분석과 조작을 위한 객체고 URL 네트워크 전송을 위한 애플리케이션 계층 프로토콜을 표현하는 객체이다.

URI에는 네트워크 전송에 대한 메소드 자체가 없다URL 문자열 분석이 일부 되기는 하지만 정확하게 동작하지는 않는다.

 

 

openConnection()메소드는 지정된 URL 소켓을 열고 URLConnection 객체를 반환한다.

URLConnection 네트워크 리소스에 대한 열린 연결을 의미한다.

 

연속적인 문자를 읽기 위해 InputStreamReader read() 메소드를 사용한다.

 

public class Test {

public static void main(String args[]) throws IOException{

try{

URL u1 = new URL("http://querybox.pnpsecure.com");

InputStream in = u1.openStream();

in = new BufferedInputStream(in);

// 입력 성능을 높이기 위한 버퍼

// InputStream을 Reader에 연결

Reader r = new InputStreamReader(in);

int c;

while ((c = r.read()) != -1)

System.out.println((char)c);

in.close();

} catch(MalformedURLException ex){

System.err.println(ex);

}

}

}

상단의 경우는 해당 URL 내용이 텍스트라는 전재이다. GIF, MP3, 또는 인코딩이 다른경우에는 정상적으로 출력이 되지 않을  있다.

 

 

프록시(Proxy)

  • 프록시 서버는 로컬 클라이언트로부터 원격 서버에 대한 요청을 받는다그리고 프록시 서버는 원격 서버에 요청하고 결과를 다시

로컬 클라이언트로에게 전달한다.

  • Java.net.Proxy 클래스의 인스턴스로 표현한다.
  • HTTP, SOCKS 그리고 직접 연결(프록시 사용않함) 포함한  종류의 프록시만 존재하며enum 타입인 Proxy.Type안에 세가지 상수로표현된다.

Proxy.Type.Direct, Proxy.Type.HTTP, Proxy.Type.SOCKS

  • 타입 이외에프록시 서버의 주소와 포트 같은 추가적인 정보들은 SocketAddress 객체로 제공된다.

SocketAddress address = new InetSocketAddress("Proxy.example.com", 80);

Proxy proxy = new Proxy(Proxy.Type.HTTP, address);

-> proxy.example.com 호스트의 80 대한HTTP 프로시 서버를 나타내는 Proxy 객체를 생성

 

 

GET 메소드를 사용하여 서버  프로그램과 통신하기

String target="";

For (int i = 0; i < args.length; i++) {

Target += args[i] + " ";

}

Target=target.trim();

 

QueryString query = new QueryString(); // URL에서 query부분에 값을 삽입할  사용한다Get메소드 방식에서 q 입력 필드의 값을 사용자에게 입력받은 값으로 지정

Query.add("q",target);

 

Try {

URL u = new URL("http://www.dmoz.org/search/q? + query);

Try( InputStream in = new BufferedInputStream(u.openStream()) {

InputStreamReader theHTML = new InputStreamReader(in);

Int c;

While ((c = theHTML.read()) != -1) {

 

}

}

 

 

}

'JAVA > 자바 네트워크 프로그래밍' 카테고리의 다른 글

Runnable을 사용한 MD5 다이제스트 생성방법  (0) 2016.12.24
HTTP  (0) 2016.12.24
URL 그리고 URI, Proxy  (0) 2016.12.24
소켓 통신 (어플리케이션)  (0) 2016.12.24
UDP 통신  (0) 2016.12.24
Java 소켓 통신(서버)  (0) 2016.12.24
JAVA/자바 네트워크 프로그래밍

소켓 통신 (어플리케이션)

소켓 통신 (어플리케이션)

데이터 통신을 하다보면 패킷 나누기헤더 만들기수신 측에서 헤더 분석하기손실된 패킷 찾기 등에문제가 발생   있는데 소켓을 사용하게 되면 이를 한번에 해결할  있다.
 
소켓이란  호스트 사이의 연결을 말한다
소켓의 기능
- 원격 장비에 연결하기 (서버클라이언트)
- 데이터 보내기 (서버클라이언트)
- 데이터 받기 (서버클라이언트)
- 연결 닫기 (서버클라이언트)
- 포트 지정하기 (서버)
- 수신 대기하기 (서버)
지정된 포트에 대해 원격 장비의 연결 받아들이기 (서버)
 
해당 기능은 ServerSocket 클래스에 의해 제공된다.
 
연결이 되면 서버와 클라이언트는 서로 입력 스트림과 출력스트림을 얻게 되어 full-duplex 통신을 하게된다그리고 둘은 handshake 동작도 진행한다.
 
클라이언트 소켓
 
Socket 생성자  기본 설정.

1. Socket 클래스는4개의 생성자를 제공하는데 하단에 사용된 생성자는 InetAddress 연결할 소켓이있는 주소와 포트번호를 입력받는다.
-> 다양한 이유로 소켓에 연결할  없는 경우에는 IOException 또는 UnKnownHostException 예외가 발생한다.
 
2. 또 다른 생성자는 로컬 인터페이스와 포트 주소를 인자로 전달 받는데이는 로컬 주소를 명시적으로지정해야 하는 상황의 한가지 예로 이중 이더넷 포트를 사용하는 라우터/방화벽이 있다.라우터/방화벽은 하나의 인터페이스를 통해 외부의 연결을 받아들이고처리한 다음 다른 인터페이스를 통해 로컬 네트워크로 전달한다.
Ex) 
InetAddress inward = InetAddress.getByName("router");
Socket socket = new Socket("mail", 25, inward, 0); 
// 로컬 호스트 네임 router 연결된 네트워크 인테페이스를 사용할 것임을 요청.
 
3. 또 다른 생성자는 Proxy 객체를 받는다
특정 프록시 서버를 사용하기 위해서는 해당 서버의 주소를 지정하면 된다예를 들어다음 코드는 특정호스트에 접속하기 위해 기재된 다른 호스트에 SOCKS 프로시 서버에 사용한다.
EX)
SocketAddress proxyAddress = new InetSocketAddress("host주소", 1080);
Proxy proxy = new Proxy(Proxy.Type.SOCKS, proxyAddress);
Socket s = new Socket(proxy);
SocketAddress remote = new InetSocketAddress("host주소", 25);
S.connect(remote);
 
 
Socket socket = new Sockint("time.nist.gov", 13); // "time.nist.gov" 13 포트로 대화하는 소켓을 생성.
-> 생성에 실패할 경우 IOException 에러가 발생한다.
 
//타임아웃 설정하기
Sockiet.setSoTimeout(15000); // 15 동안 응답이 없으면 타임 아웃
 
//InputStream 반환받아 데이터 읽기
InputStream in = socket.getInputStream();
 
 
 
소켓으로 서버에 쓰기
 
//OutputStream 생성
OutputStream out = socket.getOutputStream();
 
OutputStream DataOuputStream이나 OutputStreamWriter 같이 쓰기 편한 클래스로 연결한다.
 
//그리고 전송한다.
Writer writer = OutPutStreamWriter(out, "UTF-8");
Writer.write("dfdfdfaf");
Writer.flush();
 
//보내고 바로 데이터를 inputstream으로 받아서 출력   있다.
BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
Reader.readLine
 
 
출력 닫기
Close() 메소드를 실행하게되면 ,출력 스트림이 모두 닫히게 된다.
그렇기에 한쪽  닫고 싶을 때는
Public void shutdownInput, public void shutdownOutput() 메소드를 사용하여 특정 스트림만
닫을  있다
닫은  해당 스트림을 사용하려고  경우에  -1 받환 받게 되고  IOException 발생한다.
 
Ex)
Try (Socket connection = new Socket("host주소", 80)) {
Writer out = new OutputStreamWriter(connection.getOutputStream(), "8859_1");
Out.write("GET /HTTP 1.0\r\n\r\n");
Out.flush();
Connection.shutdownOutput();
}
 
 
소켓 생성과 연결
Java.net.Socket 클래스는 클라이언트 측의 TCP 기는ㅇ을 수행하기 위한 자바의 기본 클래스다그리고 URL, URLConnection, Applet, JEditorPane 같은 TCP 네트워크 연결에서 사용되는 대부분의 클라이언트 클래스는 Socket 클래스를 호출하며해당 Socket클래스는 운영체제의 로컬 TCP 스택과 통신을위한 네이티브 코드를 사용한다.
 
연결되지 않은 소켓 생성하기
상황에 따라 맞는 소켓을 사용하기 위해 해당 생성자를 사용한다.
 
Socket socket = new Socket();
SocketAddress address = new InetSocketAddress(SERVER, PORT);
Try {
Socket.connect(address);
} catch(IOException ex) {
Ex.printstack();
}
 
Socket Addrress (소켓 주소)
SocketAddress 클래스는 연결 끝점을 나타낸다해당 클래스는 기본 생성자 이외에 어떤 메소드도 제공하지 않는다.
 
해당 Socket Address 클래스는 원본 소켓의 연결이 끊어지거나 가비지 콜렉터에 의해 사라진 경우에도새로운 소켓을 생성 하기 위해 IP 주소와 port등을 보관할 저장소로서 사용한다.
->이를 위해 Socket SocketAddress 객체를 반환하는  개의 메소드를 제공한다
 
Public SocketAddress getRemoteSocketAdress()
Public SocketAddress getLocalSocketAddress()
 
사용 )
Socket socket = new Socket("host주소", 80);
SocketAddress yahoo = socket.getRemoteSocketAddress();
Socket.close();
 
Socket socket2 = new Socket();
Socket2.connect(yahoo);
 
기본적으로 생성할  다음과 같이 생성이 가능하다.
SocketAddress address = new InetSocketAddress("host주소", 80);
 
 
 
소켓 정보 얻기
소켓 객체는 get 메소드를 사용하여 접근   있는  가지 속성을 제공한다.
- 원결 주소 public InetAddress getInetAddress()
- 원격 포트 public int getPort()
- 로컬 주소 public InetAddress getLocalAddress()
- 로컬 포트 public int getLocalPort()
 
Set 메소드는 제공되지 않으며 해당 속성들은 소켓이 생성될  고정되어 있다.
 
 
소켓의 옵션 설정하기
소켓 옵션은 자바 Socket 클래스 내부의 네이티브 소켓이 데이터를 보내거나 받는 방법을 지정한다
자바는 클라이언트  소켓에 대해 다음 9가지 옵션을 제공한다.
- TCP_NODELAY
- SO_BINDADDR
- SO_TIMEOUT
- SO_LINGER
- SO_SNDBUF
- SORCVBUF
- SO_KEEPALIVE
- OOBINLINE
- IP_TOS
 
TCP_NODELAY
Public void setTcpNoDelay(boolean on)
Public boolean getTcpNoDelay()
TCP_NODELAY 설정을 true 하면 ㅠㅐ킷의 크기에 상관없이 가능한 빨리 패킷을 전송한다.
네이글 알고리즘을 사용할  사용된다.
네이글 알고리즘은 이전에 보낸 패킷에 대한 응답 신호를 받아야 새로운 패킷 신호를 전송한다.
답이 느리면  다음 행동이 느려진다.
setTcpNoDelay(true) 지정하면 버퍼링이 종료되어 빠르게ㅐ 전송 된다.
 
SO_LINGER
Public void setSoLinger(boolean on, int seconds)
Public int getSoLinger() throws SocketException
SO_LINGER 옵션은 소켓이 닫힐 전송하지 않은 데이터그램을 어떻게 처리할지 결정한다.
SO_LINGER 옵션이 0으로 되어있으면 패킷이 종료되고 전송된 패킷 자체가 사라진다.
SO_LINGER 옵션이 켜져 있으면close()명령어 뒤에 지정된 상수  시간 만큼 패킷을 전송하고 종료된다.
 
SO_TIMEOUT
Public void setSOTimeout(int milliseconds)
Public int getSoTimeout()
일반적으로 소켓에서 데이터를 읽으려고   read() 호출은 충분한 바이트를 읽을  까지 블록된다.
설정된 시간 만큼 블록되지 않고 InterruptedIOException 예외가 발생한다예외가 발생하여도연결은 유지된다.
 
SO_RCVBUF
Public void setReciveBuuferSize(int size)
Public int getReciveBufferSize()
Public void setSendBufferSize(int size)
Public int getSendBufferSize()
인터넷 속도가 느릴 수록 버퍼가 작을 수록 좋고빠르면 클수록 좋다.
버퍼사이즈를 제한   있다.
 
SO_KEEPALIVE
Public void setKeepAlive(boolean on)
Public boolean getKeepAlive()
SO_KEEPALIVE 옵션이 설정되어 있는 경우클라이언트는 이따금씩 유휴 연결을 통해 데이터 패킷을보내어 서버와의 연결을 유지한다.
 
OOBINLINE
Public void sendUrgentData(int Data)
네트워크에서 갑작스럽게 긴급하게 처리해야 하는 데이터가 있을  있다.
긴급한 데이터를 전송하는 것이 해당 메소드이다.
 
SO_REUSEADDR
Public void setReuseAddress(boolean on)
Public boolean getReuseAddress()
해당 옵션이 켜져있으면 해당 소켓에 데이터가 전송되기 전에 다른 소켓에서 해당 소켓이 사용하는 포트를 바인딩 하여 사용할  있다.


'JAVA > 자바 네트워크 프로그래밍' 카테고리의 다른 글

HTTP  (0) 2016.12.24
URL 그리고 URI, Proxy  (0) 2016.12.24
소켓 통신 (어플리케이션)  (0) 2016.12.24
UDP 통신  (0) 2016.12.24
Java 소켓 통신(서버)  (0) 2016.12.24
java 소켓 통신 (보안소켓)  (0) 2016.12.24
 [ 1 ]  [ 2 ] 

푸터바

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.

카운터

  • Today : 36
  • Yesterday : 651
  • Total : 55,511