소켓에 해당하는 글 4

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

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

데이터 통신을 하다보면 패킷 나누기헤더 만들기수신 측에서 헤더 분석하기손실된 패킷 찾기 등에문제가 발생   있는데 소켓을 사용하게 되면 이를 한번에 해결할  있다.
 
소켓이란  호스트 사이의 연결을 말한다
소켓의 기능
- 원격 장비에 연결하기 (서버클라이언트)
- 데이터 보내기 (서버클라이언트)
- 데이터 받기 (서버클라이언트)
- 연결 닫기 (서버클라이언트)
- 포트 지정하기 (서버)
- 수신 대기하기 (서버)
지정된 포트에 대해 원격 장비의 연결 받아들이기 (서버)
 
해당 기능은 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 > 자바 네트워크 프로그래밍' 카테고리의 다른 글

Runnable을 사용한 MD5 다이제스트 생성방법  (0) 2016.12.24
HTTP  (0) 2016.12.24
소켓 통신 (어플리케이션)  (0) 2016.12.24
UDP 통신  (0) 2016.12.24
Java 소켓 통신(서버)  (0) 2016.12.24
java 소켓 통신 (보안소켓)  (0) 2016.12.24

댓글()

UDP 통신

UDP 통신


UDP소켓은  호스트 사이의 고유의 연결이라는 개념이 없다.


UDP소켓은 또한 TCP처럼 단일 연결을 위해 할당되지 않는다.


TCP소켓은 네트워크 연결을 스트림처럼 다룬다소켓에서 가져온 입출력 스트림을 사용해 데이터를 보내거나 받는다UDP 이러한 방식을 지원하지 않고

항상 개별 데이터그램 패킷으로 작업해야한다단일 데이터 그램에 채워 넣는 모든 데이터는 단일 패킷으로 전송되고덩어리채 유실되기도 한다.

-> 패킷들 사이에 연관성이 없으며누가 먼저 보내져야 하는지에 대한 근거가 없다.

 

UDP에서 전송될 주소를 포함한 데이터그램에 대한 모든 것이 패킷  자체에 저장되어 있기에 소켓은 대기하거나 전송할 로컬 포트만 알고 있으면 된다.

 

자바의 UDP 구현은 DatagramPacket, DatagramSocket으로 나뉜다.

 

DatagramPacket 클래스는 데이터의 바이트를 데이터그램이라고 불리는 UDP 패킷에 채워 놓고 수신 받은 데이터 그램을 꺼낸다.

DatagramSocket UDP 데이터그램을 수신할 뿐만 아니라 전송도 가능하다.

 

데이터를 전송하기 위해서는 데이터를 DatagramPacket 넣고 DatagramSocket 사용하여 패킷을 전송한다.

데이터를 수신하기 위해서는 데이터를 DatagramSocket에서 DatagramPacket 객체를 가져와서 패킷의 내용을 확인한다.

 

 

UDP 클라이언트

TCP 소켓으로 작성하였던 dayTime 반환하는 소켓 서버를 UDP 구현해보자.

 

DatagramSocket socket = new DatagramSocket(0); //포트 0번에 대해 소켓을 연다.

-> TCP 소켓과는 다르게 단지 연결할 로컬 포트만 명시하면 포트번호는 원격 호스트나 주소를 알지 못하지만 자바가 사용가능한 임의의 포트를 선택해 준다.

 

Socket.setTimeout(1000); // 타임아웃을 10 동안 응답이 없을 경우 되도록 설정한다.

 

InetAddress host = InetAddress.getByName("time,dat,net");

DatagramPacket request = new DatagramPacket(new Byte[1], 1, host, 13);

 

Byte[] data = new byte[1024];

DatagramPacket response = new DatagramPacket(data, data.length); //서버의 응답을 수신하는 패킷은 간단히  바이트 배열을 포함한다 버퍼는 전체 응답을 충분히 담을 크기여야 한다버퍼의 크기가 너무 작은 경우 나머지 부분은 잘린다. 1k 충분하다.

 

Socket.send(request);

Socket.receive(response);

 

String daytime = new String(response.getData(), 0, response.getLength(), "US-ASCII");

System.out.println(daytime);

 

 

UDP 서버

Udp 서버는 일반적으로 전송하기 전에 먼저 수신한다는 것과 임의의 포트에 바인드 하지 않는다는 것을 제외하면 UDP클라이언트와 거의 같은 패턴을 따른다.

 

DatagramSocket socket = new DatagramSocket(13); //데이터 그램 소켓을 생성한다.

 

DatagramPacket request = new DatagramPacket(new byte[1024], 0, 1024);  //들어온 데이터를 저장할 바이트 배열과배열에서의 오프셋그리고 저장할 바이트 수를 인자로 제공하는 요청을 수신할 패킷을 만든다.

 

Socket.receive(request); //패킷을 수신한다 메소드는 포트 13번으로 UDP 패킷이 도착할  까지 무한히 대기한다.

 

String daytime = new Date().toString() +"\r\n";

Byte[] data = daytime.getBytes("US-ASCII");

InetAddress host = request.getAddress();

Int port = request.getPort();

DatagramPacket response = new DatagramPacket(data, data.length, host, port);

 

Socket.send(response);

 

UDP 자체가 담을  있는 데이터의 최대량은 이론적으로 6 5507바이트이지만실제로는  작다.

-> 따라서 8K 이상의 데이터를 가진 UDP 패킷을 주고 받는 임의의 프로그램은 조심스럽게 다뤄야 한다

-> 나머지 데이터가 잘라서 보내질 수 있다.

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

Runnable을 사용한 MD5 다이제스트 생성방법  (0) 2016.12.24
HTTP  (0) 2016.12.24
소켓 통신 (어플리케이션)  (0) 2016.12.24
UDP 통신  (0) 2016.12.24
Java 소켓 통신(서버)  (0) 2016.12.24
java 소켓 통신 (보안소켓)  (0) 2016.12.24

태그 : java, tcp ip, UDP, 소켓, 통신

댓글()

Java 소켓 통신(서버)

Java 소켓 통신(서버) 


서버 소켓은 서버에서 실행되며들어오는 TCP 연결을 기다린다.

자바는 본질적으로 ServerSocket 클래스를 제공한다,

 

서버 소켓 생성하기 (기본 생성방법)

4개의 생성자를 제공한다상황에 따라port, 요청  길이InetAddress 받아 생성   있고아무 정보가 없는 ServerSocket 파일도 생성이 가능하다.


-> 특정 InetAddress 객체를 전달 받았을 경우 입력받은 지정된 주소로 들어오는 연결에 대해서만 서버 소켓을 대기한다.

->포트번호를 0으로 설정할 경우 시스템은 사용할  있는 포트를 임의로 선택한다.

   사용자에게 임의로 선택된 포트는 미리 알수 없기에 익명 포트라고 한다익명 포트는 FTP 같은 다수의 소켓을 사용하는 프로토콜에 종종 사용된다.

 

해당 생성자에서 발생하는 예외는 IOException BindException이다.

해당 예외는 요청한 예외가 이미 사용 중이거나루트 권한이 없는 1 ~ 1023 사이의 포트에 바인딩을 시도한 경우다.

 

아무런 포트 바인딩이 되지 않은 경우에는 생성  bind()메소드를 통해 바인딩을 해주지 않으면 사용할  없다.

 

 

실행 흐름

  1. ServerSocket() 생성자를 사용하여 특정 포트 대한 새로운 ServerSocket 생성한다.
  2. ServerSocket() 자신의 accept()메소드를 사용하여 특정 포트로 들어오는 연결요청을 대기한다Accept() 클라이언트가연결을 시도할  까지 블로킹되며연결을 맺어진  클라이언트와 서버를 연결하는 Socket 객체를 반환한다.
  3. 서버 유형에 따라 Socket getInputStream() 메소드나  getOutputStream() 메소드를 호출하여 클라이언트와 통신에 필요한 입출력 스트림을 얻을  있다.
  4. 서버와 클라이언트는 연결을 종료하기 전까지 미리 정의된 프로토콜에 따라 대화한다.
  5. 서버나 클라이언트가 또는 둘다 연결을 종료한다.
  6. 서버는 다시 2번으로 돌아가 다음 연결을 기다린다.

 

시간을 반환하는 소켓 만들기

ServerSocket server = new ServerSocket(13); // 13 포트에서 대기하는 서버 소켓 생성

Socket connection = server.accept(); //accept() 호출되면 실행이 블록킹 된다클라이언트와 연결  때까지 무한 대기

OutputStream out = connection.getOutputStream();

Writer writer = new OutputStreamWriter(out, "ASCII");

 

Date now = new Date();

Out.write(now.toString +"\r\n"); // 캐리지 리턴과 라인피드의 쌍의 사용법에 주의하라.

Out.flush();

Connection.close();

 

위에 작업을 계속 반복적으로 수행하고 싶을 경우에

 

ServerSocket server = new ServerSocket(13); // 13 포트에서 대기하는 서버 소켓 생성

Try (Socket connection = server.accept(); //accept() 호출되면 실행이 블록킹 된다클라이언트와 연결  때까지 무한 대기) {

While(true) {

OutputStream out = connection.getOutputStream();

Writer writer = new OutputStreamWriter(out, "ASCII");

 

Date now = new Date();

Out.write(now.toString +"\r\n"); // 캐리지 리턴과 라인피드의 쌍의 사용법에 주의하라.

Out.flush();

Connection.close();

}

} catch (IOException ex) {}

 

다음과 같이 처리할  있다이런 서버를 반복서버라고 한다.

-> 하지만 이런 서버는 느린 클라이언트 하나가 서버 자체를 느리게   있는 단점이 있다.

-> 해당 서버는 수동으로 멈추기 전까지 무한 대기 상태에 빠져있다.

 

 

멀티스레드 서버

운영체제는 특정 포트를 통해 들어오는 연결 요청을 FIFO 큐에 저장한다.


자바는 기본 적으로  큐의 길이를 50으로 설정하지만운영체제마다 다르다.큐는 아직 처리가 되지 않은 연결로 가득  경우 호스트는 해당 포트의 큐에 빈자리가  때까지 추가적인 연결을 거부한다.


->ServerSocket 생성자는 큐의 기본길이를 변경할  있는 기능을 제공하지만 운영체제가 지원하는 최대 길이 이상을 증가  없기에

많은 연결이 맺어 질때 어려움이 발생한다.

 

위의 증상의 해결 방법은 큐에 추가되는 새로운 연결을 수용하는 스레드와 분리된 별도의 스레드를  연결마다  당하는 것이다.

 

위의 작성한 예제를  스레드로 분리해 보자.

Ex) 멀티 스레드 daytime 서버

Try(ServerSocket server = new ServerSocket(PORT)) {

While(true) {

Try {

Socket connection = server.accept();

Thread task = new DaytimeThread(connection);

Task.start();

} catch (IOException ex) {}

}

} catch (IOException ex) {

}

}

 

Private static class DayTimeThread extends Thread {

Private Socket connection;

 

DaytimeThread(Socket connection) {

This.connection = connection;

}

 

Public void run() {

Try {

Writer out = new OutputStreamWriter(connection.getOutputStream());

Date now = new Date();

Out.write(now.toString() +"\r\n");

Out.flush();

} catch (IOException ex) {

System.err.println(ex);

} finally {

Connection.close();

} catch (IOException e) {

}

}

}

}

 

-> 이런 방식으로 들어오는 연결에 대해 처리하는 비즈니스 로직을 쓰레드로 처리하게 되면서  연결마다 처리되는 로직이 쓰레드로 관리되어 서로의 동작이 영향을 받지 않느다.


-> 하지만 다음과 같은 방식은 무제한의 쓰레드를 생성하기에 메모리 이슈가 발생할  있다이를 해결 하기 위해 쓰레드 풀을 사용한다.

 

ExecutorService pool = Executors.newFixedThreadPool(50);

Try(ServerSocket server = new ServerSocket(PORT)) {

While(true) {

Try {

Socket connection = server.accept();

Callable<Void> task = new DaytimeTask(connection);

Pool.submit(task);

} catch (IOException ex) {}

}

} catch (IOException ex) {

}

}

 

Private static class DayTimeTask implements Callable<Void> {

 

Private Socket connection;

 

DaytimeThread(Socket connection) {

This.connection = connection;

}

 

Public void run() {

Try {

Writer out = new OutputStreamWriter(connection.getOutputStream());

Date now = new Date();

Out.write(now.toString() +"\r\n");

Out.flush();

} catch (IOException ex) {

System.err.println(ex);

} finally {

Connection.close();

} catch (IOException e) {

}

}

}

}

 

 

 

서버 소켓은 Serversocket.close() 메소드를 통해 연결을 종료한다.

종료된 소켓은 어떠한 방식으로도  연결을   없다Java 7에서 소개된 방식을 사용하여 try resource catch 문장을 사용하여자동으로 자원을 해제   있다.

 


로그 남기기

일반적으로  가지의 내용을 로그에 남긴다.

  1. 요청
  2. 서버 에러

 

감사로그(요청) 연결마다 남기거나연결에서 다수의 동작이 있을 경우 연결의 동작마다 로그를 남긴다.

에러 로그는 서버 운영 중에 발생하는 예측되지 않은 예외를 기록한다.

클라이언트와의 연결 종료와 같은 동작에 관련된 예측이 예상되는 에러는 감사로그에 남긴다.

 

일반적으로 1.3 이후부터는 java.util.logging 패키지를 사용한다.

Private final static Logger auditLogger = Logger.getLogger("request");

이와 같은 문장을 사용하여 Logger 선언한다.

-> Logger 스레드 환경에서 안전하다.

 

생성된 Logger 파일에서 log() 메소드를 활용하여 로그를 남길  있다.

Log()메소드에서 파라미터로 사용되는 로그의 레벨은 7 가지이다 심각성에 따라 설정   있다.

 

소켓 옵션

Socket 옵션은 ServerSocket 클래스가 의존하는 네이티브 소켓이 데이터를 주고받는 방법을 명시한다서버 소켓을 위해 자바는 3가지 옵션을 제공한다.

 

- SO_TIMEOUT

- SO_REUSEADDR

- SO_RCVBUF

 

SO_TIMEOUT

Public void setSoTimeout(int timeout)

Public int getSoTimeout()

SO_TIMEOUT accept() 메소드가 들어오는 연결을 대기하는 시간이다.

-> 0으로 설정된 경우 하염없이 기다린다기본값이 0이다.

 

RE_USEADDR

Public boolean getReuseAddress()

Public void setReuseAddress(boolean on)

RE_USEADDR 새로운 소켓이 바인딩하려는 포트에 대해 이전에 바인딩된 소켓으로 전송 중인 데이터가 있는 경우에도 해당 포트를 바인딩

  있는지 여부를 결정한다.

 

SO_RCVBUF

Public int getReciveBufferSize()

Public void setReceiveBufferSize()

SO_RCVBUF 옵션은 서버 소켓에 의해 수용된 클라이언트 소켓의 기본 수신 버퍼의 크기를 설정한다.

인터넷 트래픽에 따라 버퍼를 설정한다.

 

 

 

 

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

Runnable을 사용한 MD5 다이제스트 생성방법  (0) 2016.12.24
HTTP  (0) 2016.12.24
소켓 통신 (어플리케이션)  (0) 2016.12.24
UDP 통신  (0) 2016.12.24
Java 소켓 통신(서버)  (0) 2016.12.24
java 소켓 통신 (보안소켓)  (0) 2016.12.24

댓글()

java 소켓 통신 (보안소켓)


java 소켓 통신 (보안소켓)

수누핑 공격에 방어하기 위해 인터넷 연결에 대한 근본적인 보안을 강화하기 위한 방법으로 소켓을 암호화   있다.

 방법은 트랜잭션에 대한 기밀성과 인증무결성을 제공한다.

 

보안소켓을 생성하는 것은 JSSE 사용하여 보안통신을 위한 통신협상과 필요한 암호화를 투명하게 처리하는 소켓과 서버 소켓을만들  있다.

소켓과 스트림을 통해 데이터를 보내기만 하면 된다JSSE(Java Secure Socket Excetion) 4개의 패키지로 나뉜다.

 

Javax.net.ssl 보안 네트워크 통신을 위한 자바 API 정의하는 추상 클래스.

Javax.net 보안 소켓을 생성하기 위해 생성자 대신 사용되는 추상 소켓 팩토리 클래스.

Java.security.cert SSL 필요한 공개키 인증서를 다루는 클래스

Com.sun.net.ssl JSSE 대한  마이크로시스템즈의 참조 구현 안에 있는 암호화 알고리즘과 프로토콜을 구현한 구상 클래스이다.

 

보안 클라이언트 소켓 만들기

Java.net.Socket 객체를 생성하는 대신javax.net.ssl.SSLSocketFactory 부터 createSocket() 메소드를 사용하여 소켓 객체를얻을  있다.

SSLSocketFactory 추상 팩터리 패턴을 따르는 추상 클래스이다.

정적 SSLSocketFactory.getDefault() 메소드를 호출하면 SSLSocketFactory 인스턴스를 얻을  있다.

SocketFactory factory = SSLSocketFactory.getDefault();

Socket socket = factory.createSocket("login.ibibloio.org", 7000);

 

CreateSocket 파라미터에 따라 5섯개의 createSocket 메소드를 제공한다.

->host, port, InetAddress, localPort, InetAddress, autoClose 상황에 따라 부여하여 생성할  있다.

->autoClose 인자는  소켓이 닫힐 내부 프록시 소켓에 대한 연결을 닫을지 여부를 결정

-> 데이터를 주고 받는 것은 기존의 소켓의 동작과 동일하다.

 

암호화 조합 사용하기

getSuppertedCipherSuites() 메소드는 가능한 알고리즘 조합을 알려준다.  하지만 가능한 알고리즘이  사용할  있는것은 아니고 일부를 제한될  있다.

getEnabledCipherSuites() 메소드는 실제로 해당 소켓에서 적용할  있는 암호화 조합을 알려준다.

 

setEnabledCipherSuites(String[] suites) 통해 조합을 설정할  있다.


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

Runnable을 사용한 MD5 다이제스트 생성방법  (0) 2016.12.24
HTTP  (0) 2016.12.24
소켓 통신 (어플리케이션)  (0) 2016.12.24
UDP 통신  (0) 2016.12.24
Java 소켓 통신(서버)  (0) 2016.12.24
java 소켓 통신 (보안소켓)  (0) 2016.12.24

댓글()