보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

HEX 클래스 사용을 위한 라이브러리:

commons-codec-1.8.jar

CipherUtils.java

 

MD5/SHA256 을 이용한 해쉬생성 예제

 

 public static String getMD5(String source) {
		  String MD5 = ""; 
			try{
				MessageDigest md = MessageDigest.getInstance("MD5"); 
				md.update(source.getBytes()); 
				byte byteData[] = md.digest();
				MD5=Hex.encodeHexString(byteData);
				System.out.println("원문: "+source+ "   MD5: "+MD5);
			}catch(NoSuchAlgorithmException e){
				e.printStackTrace(); 
				MD5 = null; 
			}
			return MD5;
	  }
	  
	  public static String getSHA256(String source) {
		  String SHA256 = ""; 
			try{
				MessageDigest md = MessageDigest.getInstance("SHA-256"); 
				md.update(source.getBytes()); 
				byte byteData[] = md.digest();
				SHA256=Hex.encodeHexString(byteData);
			    System.out.println("원문: "+source+ "   MD5: "+SHA256);
			}catch(NoSuchAlgorithmException e){
				e.printStackTrace(); 
				SHA256 = null; 
			}
			return SHA256;
	  }

 

AES 128을 이용한 블록 암호화예제

 

public static void testAES(String message) {
		  try {
			  KeyGenerator generator = KeyGenerator.getInstance("AES");
			  SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
			  generator.init(128, random);
			  Key secureKey = generator.generateKey();
			  
			  System.out.println("원문: "+message);
			  
			  Cipher cipher = Cipher.getInstance("AES");
			  cipher.init(Cipher.ENCRYPT_MODE, secureKey);
			  byte[] encryptedData = cipher.doFinal(message.getBytes());
			  System.out.println("암호문: "+Hex.encodeHexString(encryptedData));
			  
			  cipher = Cipher.getInstance("AES");
			  cipher.init(Cipher.DECRYPT_MODE, secureKey);
			  byte[] plainText = cipher.doFinal(encryptedData);
			  System.out.println("복호문: "+new String(plainText));
		  
		  }catch(Exception e){
			  e.printStackTrace();
		  }
	  }

 

java에서 AES 암호화를 이용할 때 키 길이가 긴 경우 JDK버전에 따라 아래와 같은 에러가 나올 수 있다. 

java.lang.SecurityException: Unsupported keysize or algorithm parameters

java.security.InvalidKeyException: Illegal key size or default parameters

이럴 경우 첨부된 파일을 아래의 경로에 복사해주면 해결된다.

%JAVA%\jdk1.7.0_03\jre\lib\security
%JAVA%\jre7\lib\security


UnlimitedJCEPolicyJDK7.zip


 



자바 암호화 패키지

출처: http://web.sihu.org:9080/wordpress/?p=83

JCE 라고 함 javax.crypto 패키지는 JDK 1.4버전 부터 포함 되고 있으며, 보통 JAVA_HOME/jre/lib 아래에 jce.jar라는 파일로 포함 되어 있음

/*
 * 작성된 날짜: 2010. 5. 20.
 */

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

public class AES128 {
 /*
  * AES의 경우 128, 192, 256bit의 키 길이를 지원합니다
  * key 에 해당하는 문자열을 16byte(128) 또는 24byte(192) 또는 32byte(256) 생성
  */

    public static String key = “0123456789123456″;
    /**
     * hex to byte[] : 16진수 문자열을 바이트 배열로 변환한다.
     *
     * @param hex    hex string
     * @return
     */

    public static byte[] hexToByteArray(String hex) {
        if (hex == null || hex.length() == 0) {
            return null;
        }

        byte[] ba = new byte[hex.length() / 2];
        for (int i = 0; i < ba.length; i++) {
            ba[i] = (byte) Integer.parseInt(hex.substring(2 * i, 2 * i + 2), 16);
        }
       return ba;
    }

    /**
     * byte[] to hex : unsigned byte(바이트) 배열을 16진수 문자열로 바꾼다.
     *
     * @param ba        byte[]
     * @return
     */

    public static String byteArrayToHex(byte[] ba) {
        if (ba == null || ba.length == 0) {
            return null;
        }
        StringBuffer sb = new StringBuffer(ba.length * 2);
        String hexNumber;
        for (int x = 0; x < ba.length; x++) {
            hexNumber = “0″ + Integer.toHexString(0xff & ba[x]);
            sb.append(hexNumber.substring(hexNumber.length() – 2));
        }
        return sb.toString();
    }

    /**
     * AES 방식의 암호화
     *
     * @param message
     * @return
     * @throws Exception
     */

    public static String encrypt(String message) throws Exception {

        // use key coss2
        SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), “AES”);
        // Instantiate the cipher
        Cipher cipher = Cipher.getInstance(“AES”);
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

        byte[] encrypted = cipher.doFinal(message.getBytes());
        return byteArrayToHex(encrypted);
    }

    /**
     * AES 방식의 복호화
     *
     * @param message
     * @return
     * @throws Exception
     */

    public static String decrypt(String encrypted) throws Exception {
        // use key coss2
        SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), “AES”);

        Cipher cipher = Cipher.getInstance(“AES”);
        cipher.init(Cipher.DECRYPT_MODE, skeySpec);
        byte[] original = cipher.doFinal(hexToByteArray(encrypted));
        String originalString = new String(original);
        return originalString;

    }

    public static void main(String[] args)
    {
        try {
            String encrypt = encrypt(“test1234″);
            System.out.println(“origin str = “+”test1234″);
            System.out.println(“encrypt str = “+encrypt);  
            String decrypt = decrypt(encrypt);
            System.out.println(“decrypt str = “+decrypt);        

        } catch (Exception e) {
            e.printStackTrace();
        }    
    }
}


'프로그래밍 > JAVA 프로그래밍' 카테고리의 다른 글

자바를 이용한 암호화  (0) 2013.07.23
자바에서 LDAP 사용하기  (0) 2013.07.07
Java NIO의 ByteBuffer 와 Channel 클래스  (0) 2013.05.16
블로그 이미지

오픈이지 제로킴

시큐어코딩 교육/컨설팅 전문가 그룹

LDAP 이란


Lightweight Directory Access Protocol.

조직이나 개체, 네트웍상에 있는 파일이나 장치들과 같은 자원등의 위치를 찾을 수 있게 해주는 소프트웨어 프로토콜이다. 


LDAP은 DAP의 경량판으로 네트워크내의 디렉토리 서비스 표준인 X.500의 일부이다.

넷스케이프는 자신들의 커뮤니케이터 최신판에 LDAP을 포함하였고, 마이크로소프트는 액치브 디렉토리라고 부르는 제품의 일부로 LDAP을 포함하였다. 노벨 넷웨어 디렉토리 서비스는 LDAP과 상호운영되며, 시스코도 자사의 네트워킹 제품에서 LDAP을 지원하고 있다.



자바에서 LDAP 사용하기



자바는 LDAP에 저장된 데이터를 액세스 하기위한 훌륭한 프레임웍을 제공한다.


LDAP에 연결하기 위해 JNDI(Java Naming and Directory Interface)을 사용하며 다음 4개 클래스 정도가 주로 많이 사용된다.


  1. javax.naming.directory.InitialDirContext
    • 디렉토리 서비스의 Base 가 되는 클래스 이다. 좀 더 이해하기 쉽게 말하면, JDBC의 Connection 인터페이스와 같은 역할을 한다. LDAP 통신을 하기위한 Host 정보나 인증 절차를 위한 계정, 비밀번호와 같은 것들을 설정하여 해당 디렉토리 서버와의 연결을 만들어내는 역할을 한다.

  2. javax.naming.directory.SearchControls
    • 생성된 Context 를 통해서 LDAP 경로 및 필터 문자열을 통해 개체 정보를 검색하는 역할을 한다.

  3. javax.naming.directory.SearchResult
    • 검색된 결과 개체의 데이터 유형이다. 해당 클래스의 getAttributes() 메소드를 이용하여 해당 개체의 정보들을 추출해 낼 수 있다.

  4. javax.naming.directory.Attribute
    • 이는 AD의 개체의 특정 항목 정보를 담고 있다.


LDAP 접속정보는 Properties 객체를 사용하여 설정한다.


Hashtable<String, String> properties = new Hashtable<String, String>();

properties.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");

properties.put(Context.PROVIDER_URL, path);

properties.put(Context.SECURITY_AUTHENTICATION, "simple");

properties.put(Context.SECURITY_PRINCIPAL, userId);

properties.put(Context.SECURITY_CREDENTIALS, passwd);



properties.put(Context.SECURITY_AUTHENTICATION, "simple"); 
// 여기는 simple 대신에 none 을 써주면 아래 userId 나 passwd 를 설정해주지 않아도 된다. 단 해당 LDAP 호스트에서 익명 조회가 가능하도록 설정 해 두었을때 이야기다.

properties.put(Context.SECURITY_PRINCIPAL, userId); 
// userId 값은 foo@mycompany 혹은 foo@ds.mycompany.com 형식을 사용한다.
// 패스워드 부분이 null 이거나 공백없는 문자열 ("") 일 경우에는 인증 과정이 이루어지지 않는다



LDAP 사용예

import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;

public class Test {
	private static String userId = "test";
	private static String passwd = "pass";
	private static String ldapDomain = "ds.mycompany.com";
	private static String ldapPathFormat = "LDAP://%s/";

	public static void main(String[] args) {
		String path = String.format(ldapPathFormat, ldapDomain);
		System.out.println(path);

		String filterString = "(cn=mrtint)";

		// LDAP Context
		DirContext context = null;

		// LDAP property 설정
		Hashtable properties = new Hashtable();
		properties.put(Context.INITIAL_CONTEXT_FACTORY,
				"com.sun.jndi.ldap.LdapCtxFactory");
		properties.put(Context.PROVIDER_URL, path);
		properties.put(Context.SECURITY_AUTHENTICATION, "simple");
		properties.put(Context.SECURITY_PRINCIPAL, userId);
		properties.put(Context.SECURITY_CREDENTIALS, passwd);

		try {
			context = new InitialDirContext(properties);
			SearchControls searcher = new SearchControls();
			// 
			searcher.setSearchScope(SearchControls.SUBTREE_SCOPE);
			NamingEnumeration results = context.search(
					"OU=Employee,DC=ds,DC=mycompany,DC=com", filterString, searcher);
			while (results.hasMore()) {
				SearchResult result = results.next();
				Attributes attrs = result.getAttributes();
				System.out.println(attrs.get("displayName"));
			}
		} catch (NamingException e) {
			e.printStackTrace();
		}

		System.out.println(isAuthenticatedUser("mrtint@ds.mycompany.com",
				"test123"));

	}


	public static boolean isAuthenticatedUser(String userId, String password) {
		boolean isAuthenticated = false;
		String path = String.format(ldapPathFormat, ldapDomain);
		if (password != null && password != "") {
			Hashtable properties = new Hashtable();
			properties.put(Context.INITIAL_CONTEXT_FACTORY,
					"com.sun.jndi.ldap.LdapCtxFactory");
			properties.put(Context.PROVIDER_URL, path);
			properties.put(Context.SECURITY_AUTHENTICATION, "simple");
			properties.put(Context.SECURITY_PRINCIPAL, userId);
			properties.put(Context.SECURITY_CREDENTIALS, password);
			try {
				DirContext con = new InitialDirContext(properties);
				isAuthenticated = true;
				con.close();
			} catch (NamingException e) {
			}
		}
		return isAuthenticated;
	}
}


'프로그래밍 > JAVA 프로그래밍' 카테고리의 다른 글

자바를 이용한 암호화  (0) 2013.07.23
자바에서 LDAP 사용하기  (0) 2013.07.07
Java NIO의 ByteBuffer 와 Channel 클래스  (0) 2013.05.16
블로그 이미지

오픈이지 제로킴

시큐어코딩 교육/컨설팅 전문가 그룹

Java NIO란?


jdk 1.3 이후 자바IO의 속도를 개선하기 위해 만들어진 클래스들이다. java.nio.channels 패키지는 7개의 인터페이스와 13개의 클래스로 구성되어 있다.


(1) JAVA NIO의 특징

  • 기본 데이터형용 버퍼를 클래스로 제공해 준다.
  • Character-set 인코더들과 디코더.
  • 패턴과 어울린 기능은 Perl-style 정규식들로 설정.
  • 채널, 새로운 I/O 추상화.
  • 메모리 매핑과 파일의 lock(잡금장치)를 지원해주는 인터페이스.
  • non-blocking 입출력이 가능.


(2) 채널(channel)이란?

     서버와 클라이언트간의 통신 수단이다. 파일, 네트워크소켓, 프로그램 컴포넌트간의 입출력 작업을 수행할 수 있는 개방된 연결을 의미한다.

<그림출처: http://blog.naver.com/PostView.nhn?blogId=specialcase&logNo=80092963677>


(3) 채널의 특징

     1. 읽기, 쓰기를 동시에 할 수 있다.

     2. Buffer클래스를 사용하여 데이터형에 맞는 전용 메모리 공간을 가진다.

     3. 블로킹된 스레드를 깨우거나 중단 시킬 수 있다.

     4. 채널은 비동기적으로 닫히거나 중단될 수 있다. 



(4) NIO의 Non-Blocking 입출력 메커니즘

     서버와 클라이언트간의 통신 메커니즘은 Channel클래스로, 클라이언트로 부터 들어오는 클라이언트 요청을 나누어 각 요처에 해당하는 각각의 처리자에게 보내기위한 Selector 클래스를 사용한다. 



(5) java.nio.Channels인터페이스 계층도


<그림출처: http://blog.naver.com/PostView.nhn?blogId=specialcase&logNo=80092963677>

 

- Channel                       : 모든 Channel 클래스류의 최상위 인터페이스.

- InterruptibleChannel      : 채널 입출력 중 다른 스레드에 의해 채널이 중단될 수 있다.

ReadableByteChannel   : 읽기를 위한 인터페이스이다.

- WritableByteChannel     : 쓰기를 위한 인터페이스이다.   
ScatteringByteChannel  : 모아서 쓰기 위한 인터페이스
- GatheringByteChannel  : 모아서 읽기 위한 인터페이스
ByteChannel                : 데이터 읽기/쓰기를 지원하는 인터페이스
    

(6) java.nio.channels 클래스

<그림출처: http://blog.naver.com/PostView.nhn?blogId=specialcase&logNo=80092963677>




ByteBuffer 클래스


채널의 기본 입출력 버퍼는 ByteBuffer 이다.

ByteBuffer클래스는 커널 버퍼에 직접 접근할 수 있는 DirectBuffer를 지원한다.

image0

그림출처: http://eincs.net/2009/08/java-nio-bytebuffer-channel/


 

(1) ByteBuffer 생성

ByteBuffer bb1=ByteBuffer.allocate(256);           // 일반 버퍼 생성

ByteBuffer bb1=ByteBuffer.allocateDirect(256);   // 커널버퍼에 직접 접근하는 버퍼 생성

 

(2) ByteBuffer의 네가지 위치 포인터

- position: 현재 읽기나 쓰기를 할 위치를 가르킨다. 읽기나 쓰기가 진행될때 position값도 자동 이동된다.

- limit: 현재 ByteBuffer의 에 읽기/쓰기를 할 수 있는 위치의 한계값

- capacity: ByteBuffer의 용량(항생 버퍼의 마지막을 가르킴)

- mark: 사용자가 지정한 위치.

 

Java NIO: Buffer capacity, position and limit in write and read mode.

 

(3) ByteBuffer의 읽기/쓰기

- get()과 put() 메서드를 이용하여 바이트배열에 읽기/쓰기 수행

  int bytesRead = inChannel.read(buf); //read into buffer.

  int bytesWritten = inChannel.write(buf); //read from buffer into channel.

  buf.put(127);  
  byte aByte = buf.get(); 

 

- getInt()/putInt() 와 같이 타입에 대한 읽기/쓰기 메서드도 제공됨

- order() 메섣로 빅엔디안/리틀엔디안 방식을 지정

 

 

 

(4) ByteBuffer의 주요 메서드들

- rewind() : 버퍼의 데이터를 다시 읽기 위해 position값을 0으로 설정한다.

                   데이터 삭제 X, position = 0, mark = 제거

- flip() : Buffer를 쓰기모드에서 읽기 모드로 스위칭한다. limit = position, position = 0, mark = 제거

- clear() : position을 0으로 설정하고, limit값을 capacity로 설정한다.

                데이터 삭제 X, position = 0, limit = capacity, mark = 제거

- reset() : position값을 mark로 되돌린다.

                데이터 삭제 X, position = mark, (단, mark < position 일때만 가능하면 그외에는 오류 발생)

remaining() : (limit - position) 값 리턴

position() : 현재 position 값 리턴

- position(int pos) : position 지정

limit() : 현재 limit 값 리턴

mark() : 현재 position 을 mark 로 지정

- compact() : 현재 position 부터 limit 의 사이에 있는 데이터들을 buffer의 가장 앞으로 이동시키고,

position은 데이터의 마지막 부분을 가리키고, limit = capacity , mark = 제거

(앞으로 이동시키고 남은 뒤부분 데이터들은 0으로 초기화하지 않기 때문에 쓰레기 데이터가 남음)

 

 

Channel 클래스


Buffer에 있는 내용을 송신/수신한다.

Socket을 통해 들어온 내용을 ByteBuffer에 저장하거나 Buffer의 내용으로 Packet을 생성하여 Socket을 통해 송신 하는 기능을 제공한다.

ServerSocketChannel 이나 SocketChannel 클래스는 Selector를 이용하여 Non-Blocking하게 입출력을 수행할 수 있다.

하지만 FileChannel은 Blocking만 가능하다.

 

 

ServerSocketChannel/ SocketChannel 클래스


1. Channel을 이용한 통신 처리 순서

 

 서버

 클라이언트

 s-1. open()로 ServerSocketChannel 객체 생성

 s-2. bind()로 Port Binding

 s-3. accept()로 클라이언트 연결 대기

 

 

  c-1. open()로 SocketChannel객체 생성

  c-2. connect()로 서버에 접속

 s-4. 클라이언트가 연결되면 해당 클라이언트와

        통신하는 SocketChannel 객체 반환

 

 

 s-5. SocketChannel에 read/write

 c-3. SocketChannel에 read/write

 s-6. close()

 c-4. close()

 


>> Server측 WorkFlow


 



>> Client측 WorkFlow




SocketChannel을 이용한 데이터 송수신예


(1) Opening a SocketChannel

SocketChannel socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress("http://sample.com", 80));


(2) Closing a SocketChannel

socketChannel.close();   

(3) Reading from a SocketChannel

ByteBuffer buf = ByteBuffer.allocate(48); int bytesRead = socketChannel.read(buf);

 

First a Buffer is allocated. The data read from the SocketChannel is read into the Buffer.

socket에서 읽은 데이터를 ByteBuffer에 저장. read()는 읽을 바이트 수를 반환한다.

반환값이 -1 이면 end-of-stream(connection종료) 이다.

 

(4) Writing to a SocketChannel

String newData = "New String to write to file..." + System.currentTimeMillis();

ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes());

buf.flip();

while(buf.hasRemaining()) {
    channel.write(buf);
}

 



 Selector 클래스와 SelectionKey 클래스



java.nio.channels.Selector 클래스는 SelectableChannel(채널)들을 관리하는 클래스로서 SelectionKey의 인스턴스로 관리한다. 


java.nio.channels.SelectionKey 클래스는 SelectableChannel 을 선택하는데 기준이 되는 동작(ops)과 부가적인 정보 객체(att)와 이에 연결된 Selector를 함께 표현하는 클래스로 SelectableChannel를 다루는데 있어 기본적인 정보 클래스이다.


[출처] New I/O(java.nio) |작성자 미래













SocketChannel을 이용한 Non-Blocking 모드 통신


SocketChannel을 Non-Blocking Mode로 설정하여 connect(), read(), write()를 비동기로 처리할 수 있다.

 

(1) connect()

socketChannel.configureBlocking(false);
socketChannel.connect(new InetSocketAddress("http://sample.com", 80));

while(! socketChannel.finishConnect() ){
    //wait, or do something else...   
}


(2) write()

Non-blocking mode의 write()에는 아무것도 쓰지 않아도 return될 수 있다. 그래서 write() 메소드를 loop안에 쓰기를 체크하도록 작성한다.


(3) read()

Non-blocking mode의  read()는 아무것도 읽지 않아도 return될 수 있다. 그래서 반환되는 int값을 체크하여 처리해야 한다.

 

 

ServerSocketChannel을 이용한 서버 예제



package kr.co.openeg;

import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;

public class MainClass {

  public final static int PORT = 2345;

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

    ServerSocketChannel serverChannel = ServerSocketChannel.open();
    SocketAddress port = new InetSocketAddress(PORT);
    serverChannel.socket().bind(port);
    
    while (true) {
      System.out.println("연결 대기중.....");
      SocketChannel clientChannel = serverChannel.accept();

      String response = "Hello " + clientChannel.socket().getInetAddress() + " on port "
          + clientChannel.socket().getPort() + "\r\n";
      response += "This is " + serverChannel.socket() + " on port "
          + serverChannel.socket().getLocalPort() + "\r\n";

      byte[] data = response.getBytes("UTF-8");
      ByteBuffer buffer = ByteBuffer.wrap(data);
      while (buffer.hasRemaining())
        clientChannel.write(buffer);
      clientChannel.close();
      System.out.println("연결종료");
    }
  }
}

ServerSocketChannel과 Selectors를 이용한 서버 예제


package kr.co.openeg;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;

public class MainClass2 {

  private static byte[] data = new byte[255];

  public static void main(String[] args) throws IOException {
    for (int i = 0; i < data.length; i++)
      data[i] = (byte) i;

    ServerSocketChannel server = ServerSocketChannel.open();
    server.configureBlocking(false);

    server.socket().bind(new InetSocketAddress(9000));
    Selector selector = Selector.open();
    server.register(selector, SelectionKey.OP_ACCEPT);

    while (true) {
      selector.select();
      Set readyKeys = selector.selectedKeys();
      Iterator iterator = readyKeys.iterator();
      while (iterator.hasNext()) {
        SelectionKey key = (SelectionKey) iterator.next();
        iterator.remove();
        if (key.isAcceptable()) {
          SocketChannel client = server.accept();
          System.out.println("Accepted connection from " + client);
          client.configureBlocking(false);
          ByteBuffer source = ByteBuffer.wrap(data);
          SelectionKey key2 = client.register(selector, SelectionKey.OP_WRITE);
          key2.attach(source);
        } else if (key.isWritable()) {
          SocketChannel client = (SocketChannel) key.channel();
          ByteBuffer output = (ByteBuffer) key.attachment();
          if (!output.hasRemaining()) {
            output.rewind();
          }
          client.write(output);
        }
        key.channel().close();
      }
    }
  }
}



SocketChannel을 이용한 클라이언트 예제



package kr.co.openeg;

import java.io.UnsupportedEncodingException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;

public class MainClient {

	/**
	 * @param args
	 */
	private final static String HOST="localhost";
	private final static int PORT=2345;

	
	public static void main(String[] args)throws Exception {
		
		SocketChannel channel=SocketChannel.open(new InetSocketAddress(HOST,PORT));
		//channel.configureBlocking(false);
		ByteBuffer buff=ByteBuffer.allocate(100);
		buff.clear();
		channel.read(buff);
		buff.rewind();
		System.out.println(toString(buff));
		channel.close();
		
	}
	
	private static  String toString(ByteBuffer buffer) throws UnsupportedEncodingException {
	        byte[] bytes = new byte[buffer.remaining()];
	        buffer.get(bytes);
	        return new String(bytes, "UTF-8");
	}
	private static  ByteBuffer toByteBuffer(String value) throws UnsupportedEncodingException {
	     return ByteBuffer.wrap(value.getBytes("UTF-8"));
	 } 

}

자바캔의 NIO API 정리



자바 1.4의 새로운 입출력, NIO API 1부 - 버퍼와 채널

자바 1.4의 새로운 입출력, NIO API 2부 - Charset을 이용한 인코딩/디코딩처리

자바 1.4의 새로운 입출력, NIO API 3부 - 논블러킹 I/O와 Selector





'프로그래밍 > JAVA 프로그래밍' 카테고리의 다른 글

자바를 이용한 암호화  (0) 2013.07.23
자바에서 LDAP 사용하기  (0) 2013.07.07
Java NIO의 ByteBuffer 와 Channel 클래스  (0) 2013.05.16
블로그 이미지

오픈이지 제로킴

시큐어코딩 교육/컨설팅 전문가 그룹

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

티스토리 툴바