[JDBC] 05 ResultSet

프로그래밍/DB 2007. 11. 27. 13:58 Posted by galad

★ ResultSet

DB에 JDBC 드라이버를 이용하여 SQL의 수행을 요청하고 결과를 받아 내는 인터페이스이다.
JDBC 2.0 API에는 SQL 수행 결과를 스크롤되는 ResultSet으로도 저장할 수 있도록 한다.
 
next() - 다음 데이터
previous() - 이전 데이터
first() - 맨 처음 데이터
last() - 맨 마지막 데이터
beforeFirst()  - 제일 처음 위치
afterLast() - 맨 마지막 위치
absolute(int row) - 절대 위치로 간다. 시작부터 계산해서 row행으로.
relative(int row)  - 현재 위치를 기준으로 이동한다.
                                    현재 위치 + row행으로.
deleteRow()
insertRow()
  updateRow()
……
……
 
ScrollableResultSet :
     ResultSet을 스크롤 가능하게 만들어 커서를 원하는 레코드로 옮길 수도 있다.(JDBC 2.0)

UpdateableResultSet :
     ResultSet에서의 데이터 변경을 데이터베이스에 반영하도록 하는 기능을 제공.(JDBC 2.0)
 
 ■ ResultSet.TYPE_SCROLL_SENSITIVE
     ResultSet스크롤 가능하며 업데이트가 발생하면 바로 데이터베이스에 반영된다.

 ■ ResultSet.TYPE_SCROLL_INSENSITIVE
     ResultSet스크롤 가능하며 업데이트가 발생해도 데이터베이스에 반영되지 않는다.

 ■ ResultSet.TYPE_FORWARD_ONLY
     ResultSet 스크롤이 되지 않으며 다음 Row만 진행된다.
        Default값.

 ■ ResultSet.CONCUR_UPDATABLE
     ResultSet에서 데이터 변경을 가능하도록 설정한다.

 ■ ResultSet.CONCUR_READ_ONLY
     ResultSet에서 데이터 변경을 불가능하고 조회만 가능하도록 설정한다.
        Default값.
 
 


/******************************************************************************
*   파일      : RS_Scroll.java
*   용도      : ResultSet 을 Scroll 가능하게 해서 테스트하는 예제
*   작성자   : 성홍제
*   작성일   : 2006. 07. 27
*   Version : 1.0
******************************************************************************/

package ResultSet;

import java.sql.*;

import ConnectionPool.DBConnectionMgr;

public class RS_Scroll
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        DBConnectionMgr mgr = DBConnectionMgr.getInstance();
       
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        String sql = "select * from test10_tbl";
       
        try
        {
            conn = mgr.getConnection();
            pstmt = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE,

                                                         ResultSet.CONCUR_UPDATABLE);
            /*
             * ResultSet_Type                       ResultSet_Concurrency
             * TYPE_FORWARD_ONLY              CONCUR_READ_ONLY
             * TYPE_SCROLL_INSENSITIVE       CONCUR_UPDATABLE
             * TYPE_SCROLL_SENSITIVE
             */
           
            rs = pstmt.executeQuery();
           
            // rs를 맨 위에서부터 순차적으로 탐색한다.
            while(rs.next())
            {
                String s = "num: " + rs.getInt("num") + "\t" + "id: " + rs.getString("id") + "\t"

                             + "name: " + rs.getString("name") + "\t" + "age: " + rs.getInt("age");
                System.out.println(s);
            }
            System.out.println("순차탐색 끝");
           
            // rs가 afterLast에 있지않으면 - afterLast로 보낸다.
            if(rs.isAfterLast())
                rs.afterLast();
           
            // rs를 맨 밑에서부터 역순으로 탐색한다.
            while(rs.previous())
            {
                String s = "num: " + rs.getInt("num") + "\t" + "id: " + rs.getString("id") + "\t"

                             + "name: " + rs.getString("name") + "\t" + "age: " + rs.getInt("age");
                System.out.println(s);
            }
           
            System.out.println("역순탐색 끝");
           
            // rs를 5번째 행으로 보낸다. 절대위치로 이동
            rs.absolute(5);
           
            // 5번으로 이동한 후, 그 이전 것 즉, 4번부터 출력한다.
            while(rs.previous())
            {
                String s = "num: " + rs.getInt("num") + "\t" + "id: " + rs.getString("id") + "\t"

                             + "name: " + rs.getString("name") + "\t" + "age: " + rs.getInt("age");
                System.out.println(s);
            }
            System.out.println("절대위치로 이동후, 역순으로 탐색 끝");
           
            // 맨 위로 이동해 있는 rs를 상대적으로 이동시키려 했으나, 오류 발생
            // java.sql.SQLException: 현재 행이 아닙니다: relative - 맨 위로 이동해서 현재 위치가

            // beforeFirst라서 데이터가 없으므로 상대적으로 이동불가
            // 따라서 rs.next를 해서 데이터가 있는 곳으로 간 뒤, 상대적으로 이동시킨다.
            rs.next();           // 현재 위치 1번.
            rs.relative(7);     // 상대적으로 7칸 이동. 현재 위치 8번
            rs.relative(-3);    // 다시 위로 3칸 이동. 현재 위치 5번.
           
            // 5번 다음 것부터 출력하므로 6번부터 나온다.
            while(rs.next())
            {
                String s = "num: " + rs.getInt("num") + "\t" + "id: " + rs.getString("id") + "\t"

                             + "name: " + rs.getString("name") + "\t" + "age: " + rs.getInt("age");
                System.out.println(s);
            }
           
            pstmt.close();
            conn.close();
            mgr.freeConnection(conn);
        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}


★ ResultSet의 TYPE_SCROLL_INSENSITIVE, TYPE_SCROLL_SENSITIVE, 

    CONCUR_UPDATABLE에 대해서


① stmt1(Statement개체)이 ResultSet을 INSENSITIVE, UPDATABLE로 생성한 후, 사용하는 경우

stmt1은 rs를 통해서 DB를 업데이트 할 수 있다.

하지만, stmt2(즉 다른 사용자라고도 볼 수 있는)가 DB를 바꾸었을 때, 그 바뀐 내용을 가져오지는못한다.

그래서

② SENSITIVE 옵션이 필요하다.

SENSITIVE 옵션을 주어 생성한 rs는 변경된 DB의 내용을 가져올 수 있다.

하지만, refreshRow() 메소드는 각 행별로 변경된 내용을 가져오므로, 미리 가져와서 사용하고 있는 rs의 행의 수와 변경된 DB의 행의 수가 다를 경우에는 문제가 생긴다.



/******************************************************************************
*   파일      : RS_InDel.java
*   용도      : ResultSet을 Update가능하게 해서 테스트하는 예제
*   작성자   : 성홍제
*   작성일   : 2006. 07. 27
*   Version : 1.0
******************************************************************************/

package ResultSet;

import java.sql.*;

import ConnectionPool.DBConnectionMgr;

public class RS_InDel
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        DBConnectionMgr mgr = DBConnectionMgr.getInstance();
       
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        String sql = "select num, id, name, age from test10_tbl";
       
        try
        {
            conn = mgr.getConnection();
            pstmt = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE,

                                                         ResultSet.CONCUR_UPDATABLE);
            /*
             * ResultSet_Type                       ResultSet_Concurrency
             * TYPE_FORWARD_ONLY              CONCUR_READ_ONLY
             * TYPE_SCROLL_INSENSITIVE       CONCUR_UPDATABLE
             * TYPE_SCROLL_SENSITIVE
             */
           
            rs = pstmt.executeQuery();
       
            // String sql = "select * from test10_tbl";

            // - 데이터를 추가하기 위해서는 컬럼명을 직접 입력해줘야 한다.
            // 이렇게 *로 하면 인식 못한다.
            // 데이타 추가 ------------------------------------------------------

            // 데이터를 추가하기 위해서 데이터 추가가 가능한 ROW로 이동. 맨 밑.
            rs.moveToInsertRow();      
            rs.updateInt (1, 1001);
            rs.updateString (2, "ID44");
            rs.updateString (3, "JUNG");
            rs.updateInt (4, 71);
            rs.insertRow();     // 데이터를 추가한다. DB도 변경된다.
           
            rs.moveToInsertRow();
            rs.updateInt (1, 1002);
            rs.updateString (2, "ID66");    // 2번까지만 넣어주면, 나머지는 이전에 사용했던 것들,
                                                     // 즉 (3, JUNG), (4, 71) 값이 들어가게 된다.
            rs.insertRow();
                   
            //rs.close ();  // 여기서 close 해버리면 밑에서 rs를 다시 얻기 전에는 사용불가.
            //------------------------------------------------------------------
           
            System.out.println ("데이타 추가 후 =============");
           
            System.out.println ("지금 쓰고 있는 rs의 내용-----");
            rs.beforeFirst();
            while(rs.next())
            {
                String s = "num: " + rs.getInt("num") + "\t" + "id: " + rs.getString("id") + "\t"

                           + "name: " + rs.getString("name") + "\t" + "age: " + rs.getInt("age");
                System.out.println(s);
            }
            // rs는 변경되었고 UPDATABLE 옵션이 있었으므로 DB도 변경되었다.
           
            rs.close ();
           
            System.out.println ("DB의 내용을 다시 받아온다.-----");
            rs = pstmt.executeQuery();
            while(rs.next())
            {
                String s = "num: " + rs.getInt("num") + "\t" + "id: " + rs.getString("id") + "\t"

                           + "name: " + rs.getString("name") + "\t" + "age: " + rs.getInt("age");
                System.out.println(s);
            }
            // DB의 내용이 변경된 것을 볼 수 있다.
           
            // 데이타 삭제 -----------------------------------------------------
            if (!rs.isBeforeFirst())   
            {
                rs.beforeFirst();
            }
           
            while (rs.next())  
            {
                if (rs.getInt(1) == 1001)
                {
                    rs.deleteRow();
                    break;
                }
            }
            //rs.close ();
            //-----------------------------------------------------------------
           
            System.out.println ("데이타 삭제 후============ ");
           
            System.out.println ("지금 쓰고 있는 rs의 내용-----");
            rs.beforeFirst();
            while(rs.next())
            {
                String s = "num: " + rs.getInt("num") + "\t" + "id: " + rs.getString("id") + "\t"

                            + "name: " + rs.getString("name") + "\t" + "age: " + rs.getInt("age");
                System.out.println(s);
            }
            // 역시 마찬가지로 rs는 변경되었고 UPDATABLE 옵션이 있었으므로 DB도 변경되었다.
           
            //rs.close ();
           
            System.out.println ("DB의 내용을 다시 받아온다.-----");
            rs = pstmt.executeQuery();
            while(rs.next())
            {
                String s = "num: " + rs.getInt("num") + "\t" + "id: " + rs.getString("id") + "\t"

                            + "name: " + rs.getString("name") + "\t" + "age: " + rs.getInt("age");
                System.out.println(s);
            }
            // DB의 내용이 변경된 것을 볼 수 있다.
           
            // 테이블 원상태로 복원 -------------------------------------------
            // 새롭게 생성한 stmt1이 DB의 내용을 변경한다.
            // 이렇게 변경된 DB의 내용은 지금은 rs에 반영할 수 없다. SENSITIVE 옵션이 없으므로.
            // 하지만 stmt가 사용하던 rs의 내용이 변경되지 않았다고 하더라도

            // DB는 이미 변경된 상태이므로
            Statement stmt1 = conn.createStatement ();
            stmt1.execute("DELETE FROM test10_tbl WHERE num=1001 OR num=1002");
            //stmt1.execute("COMMIT");
            stmt1.close();
           
            System.out.println ("데이타 복원 후============ ");

            System.out.println ("지금 쓰고 있는 rs의 내용-----");
            rs.beforeFirst();
            while(rs.next())
            {
                String s = "num: " + rs.getInt("num") + "\t" + "id: " + rs.getString("id") + "\t"

                            + "name: " + rs.getString("name") + "\t" + "age: " + rs.getInt("age");
                System.out.println(s);
            }
            // stmt가 사용하던 rs의 내용은 그대로이다.
           
            rs.close ();
           
            System.out.println ("DB의 내용을 다시 받아온다.-----");
            rs = pstmt.executeQuery();
            while(rs.next())
            {
                String s = "num: " + rs.getInt("num") + "\t" + "id: " + rs.getString("id") + "\t"

                            + "name: " + rs.getString("name") + "\t" + "age: " + rs.getInt("age");
                System.out.println(s);
            }
            // stmt1이 변경한 이후의 DB의 내용이 새롭게 rs에 들어간다.
            // stmt1이 변경한 값이 DB에 반영되어 있는 것을 알 수 있다.
           
            pstmt.close();
            conn.close();
            mgr.freeConnection(conn);
        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

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

[Oracle/펌] PL/SQL 01  (0) 2007.11.27
[JDBC] 06 PL/SQL  (0) 2007.11.27
[JDBC] 04 JDBC - Connection Pool...  (0) 2007.11.27
[JDBC] 03 3일째  (0) 2007.11.27
[JDBC] 02 2일째  (0) 2007.11.27

[JDBC] 04 JDBC - Connection Pool...

프로그래밍/DB 2007. 11. 27. 13:55 Posted by galad

★ 처음에 DB에 접속하는 과정이 가장 부하가 많이 걸린다.

getConnection() 할 때 부하가 가장 크다. 그래서 나온게 Connection Pool.


Connection Pool 이란, DB에 접근할 때마다 연결을 했다 끊었다 하는게 아니라,

자바 프로그램에서 미리 몇 개의 연결을 해 놓은 후 - 이게 Connection Pool -

필요할 때마다 Pool에서 연결을 빌려와서 사용한 후, 다시 돌려준다. - 끊는게 아니다.


Pool을 너무 크게 해놓으면 - 연결을 너무 많이 해 놓으면 - 메모리의 소모가 크고,

너무 적게 해놓으면 대기하는 시간이 길어진다.

적당한 크기로 설정해야 한다. 웹사이트에 걸리는 부하에 따라 조정해야 한다.


★ Connection Pool 을 사용하는 방법

① 인터넷 상에 공개된 소스

  DBConnectionMgr.java - 별로라는데...?

② Oracle Connection Pool

  오라클에서 제공하는 드라이버에만 있는 것. 오라클에 쓰기에는 좋다.

③ Tomcat WAS - DBCP


/*******************************************************************************************
*   파일        : DBConnectionPoolClient.java
*   용도        : 오라클이 제공하는 ConnectionPool을 사용한 예제
*   작성자     : 성홍제
*   작성일     : 2006. 07. 25
*   Version   : 1.0
*******************************************************************************************/

package ConnectionPool;

import java.sql.*;

import javax.sql.*; // 오라클의 Connection Pool 기능은 여기에 들어있다.
import oracle.jdbc.driver.*;
import oracle.jdbc.pool.*;

public class DBConnectionPoolClient
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        try
        {
            OracleConnectionPoolDataSource ocpds = new OracleConnectionPoolDataSource();
           
            ocpds.setURL("jdbc:oracle:thin:@61.109.232.128:1521:ora92");
            ocpds.setUser("scott");
            ocpds.setPassword("tiger");
           
            // Connection Pool 생성
            PooledConnection pc = ocpds.getPooledConnection();
           
            Connection con = null;
            PreparedStatement pstmt = null;
            String sql = "select * from emp";
            ResultSet rs = null;
           
            // 강제로 무한루프 - Connection Pool을 테스트한다.
            while(true)
            {
                // Pool 에서 하나 빌려온다.
                con = pc.getConnection();
                pstmt = con.prepareStatement(sql);
                rs = pstmt.executeQuery(); //질의문 수행
               
                while (rs.next())
                {
                    String str = "empno: " + rs.getInt("empno") + "\t"

                                  + "ename: " + rs.getString("ename");
                   
                    System.out.println(str);
                }
               
                // close지만 실제로 연결을 끊는게 아니라 Pool에 돌려준다.
                con.close();
            }
        }
        catch(Exception e)
        {}

    }

}



/*******************************************************************************************
*   파일        : DBConnectionPoolClient.java
*   용도        : 오라클이 제공하는 ConnectionPool을 사용한 예제와
*                   인터넷에서 구할 수 있는 Connection Pool을 관리해주는 클래스인 DBConnectionMgr을 이용한 예제
*   작성자     : 성홍제
*   작성일     : 2006. 07. 25
*   Version   : 1.0
*******************************************************************************************/

package ConnectionPool;

import java.sql.*;
import javax.sql.*; // 오라클의 Connection Pool 기능은 여기에 들어있다.
import oracle.jdbc.driver.*;
import oracle.jdbc.pool.*;

public class DBConnectionPoolClient
{
    // Oracle Connection Pool을 쓸 것인가 DBConnectionMgr Class를 쓸 것인가
    public static final boolean IsUsedOCPDS = false;

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        OracleConnectionPoolDataSource ocpds = null;
        PooledConnection pc = null;
       
        DBConnectionMgr mgr = null;
       
        Connection conn = null;
        PreparedStatement pstmt = null;
        String sql = "select * from member";
        ResultSet rs = null;
       
        try
        {
            if(IsUsedOCPDS)
            {
                ocpds = new OracleConnectionPoolDataSource();
               
                ocpds.setURL("jdbc:oracle:thin:@61.109.232.128:1521:ora92");
                ocpds.setUser("lonelycat");
                ocpds.setPassword("ora123");
               
                // Connection Pool 생성
                pc = ocpds.getPooledConnection();
            }
            else
            {
                mgr = DBConnectionMgr.getInstance();
            }
           
            // 강제로 무한루프 - Connection Pool을 테스트한다.
//            while(true)
//            {
                if(IsUsedOCPDS)
                {

                    // Pool 에서 하나 빌려온다.
                    conn = pc.getConnection();
                }
                else
                {
                    conn = mgr.getConnection();
                }
               
                pstmt = conn.prepareStatement(sql);
                rs = pstmt.executeQuery(); //질의문 수행
               
                while (rs.next())
                {
                    String str = "ID: " + rs.getString("id") + "\t" + "Name: " + rs.getString("name");
                   
                    System.out.println(str);
                }
               
                // close지만 실제로 연결을 끊는게 아니라 Pool에 돌려준다.
                conn.close();
               
                if(!IsUsedOCPDS)
                    mgr.freeConnection(conn);
//            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

    }

}


★ 파일명이 이상하게 들어갔지만, 원래 이름은

Pool.properties

DBConnectionMgr.java

이다.

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

[JDBC] 06 PL/SQL  (0) 2007.11.27
[JDBC] 05 ResultSet  (0) 2007.11.27
[JDBC] 03 3일째  (0) 2007.11.27
[JDBC] 02 2일째  (0) 2007.11.27
[JDBC] 01 JDBC 시작  (0) 2007.11.27

[JDBC] 03 3일째

프로그래밍/DB 2007. 11. 27. 13:55 Posted by galad

★ 다음과 같이 하지 말 것!!!

SQL> select * from emp;

SQL> SELECT * from emp;

SQL> Select * from Emp;


-> 결과는 모두 같다. 그러나, 오라클 서버에 걸리는 부하가 커진다.


SQL> select * from emp;

-> 이걸 실행하면 오라클 서버는 임시 메모리 버퍼에 이 명령에 대한 결과를 저장한다.

-> 그래서 다음번에 같은 명령이 내려오면

SQL> select * from emp;

-> 원래 갖고 있던 결과를 보여준다.


그러나 위의 경우와 같이 대소문자가 섞이면, 각각 다른 명령으로 인식하여 부하가 커지게 된다.


★ createStatement, prepareStatement

최근에는 createStatement 를 사용하지 않는다.

prepareStatement 를 사용하면 오라클에 이미 저장되어 있는 명령어의 경우에는 그 결과를 가져오고 없을 경우에는 새로 결과를 만들어내므로, 항상 결과를 새로 만들어내는 createStatement 보다 오라클 서버에 걸리는 부하가 적다.


PreparedStatement 클래스의 객체는 Statement 클래스와는 다르게 객체를 생성하면서 기준 Query를 만들어 둔다. 이것은 동적 Query의 기초가 되는 것임과 동시에 하나의 특정 Query에 대해 조건만 바뀐 상태의 빠른 실행을 만들어 줄 수 있다. 필요한 부분을 "?"로 체크한 후 원하는 값을 해당 위치에 배치할 수 있다.


/*******************************************************************************************
*   파일        : BatchTest.java
*   용도        : addBatch, executeBatch 의 테스트
*   작성자     : 성홍제
*   작성일     : 2006. 07. 25
*   Version     : 1.0
*******************************************************************************************/

import java.sql.*;

public class BatchTest
{
 /**
  * @param args
  */
 public static void main(String[] args)
 {
  // TODO Auto-generated method stub
        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;
       
        // 실제 현장에서는 url, id, pw 등을 텍스트 파일로 저장해 놓고,
        // 그걸 읽어와서 사용하는 방식으로 한다.
        String url = "jdbc:oracle:thin:@61.109.232.128:1521:ora92";
        String id = "lonelycat";
        String pw = "ora123";
       
        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            con = DriverManager.getConnection(url, id, pw);
            stmt = con.createStatement();
           
            rs = stmt.executeQuery("select * from test10_tbl");
            while(rs.next())
            {
                String strTemp = rs.getInt("num") + "\t";
                strTemp += rs.getString("id") + "\t";
                strTemp += rs.getString("name") + "\t";
                strTemp += rs.getInt("age");
               
                System.out.println(strTemp);
            }
           
            // Batch에 실행할 SQL문을 저장한다. 실행은 하지 않는다. 할 작업만 모아 놓는다.
            stmt.addBatch("insert into test10_tbl values(11, 'test01', '김종식', 20)");
            stmt.addBatch("insert into test10_tbl values(21, 'test02', '이종식', 21)");
            stmt.addBatch("insert into test10_tbl values(31, 'test03', '삼종식', 22)");
            stmt.addBatch("insert into test10_tbl values(41, 'test04', '사종식', 23)");
           
            // 위에서 모아놓은 작업을 한꺼번에 실행한다.
            // int[] batchCnt 에는 변경된 행의 수가 차례로 저장된다. 여기서는 1, 1, 1, 1.
            int[] batchCnt = stmt.executeBatch();
           
            System.out.println("-----------------배치 작업 이후의 테이블 정보-------------");
           
            rs = stmt.executeQuery("select * from test10_tbl");
            while(rs.next())
            {
                String strTemp = rs.getInt("num") + "\t";
                strTemp += rs.getString("id") + "\t";
                strTemp += rs.getString("name") + "\t";
                strTemp += rs.getInt("age");
               
                System.out.println(strTemp);
            }
           
            for(int i =0; i < batchCnt.length; i++)
                System.out.println(batchCnt[i]);
           
            stmt.close();
            con.close();           
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
 }

}


/*******************************************************************************************
*   파일        : ExecuteTest.java
*   용도        : execute 의 테스트
*   작성자     : 성홍제
*   작성일     : 2006. 07. 25
*   Version     : 1.0
*******************************************************************************************/

import java.sql.*;
import java.io.*;
import java.net.*;

public class ExecuteTest{
  public static void main (String args [])  {
   Connection conn = null;
   Statement stmt = null;
   ResultSet rs = null;
   String url = "jdbc:oracle:thin:@61.109.232.128:1521:ora92";
   String id = "tikle00";
   String pw = "tikle1234";
 try{
  Class.forName ("oracle.jdbc.driver.OracleDriver");
  conn = DriverManager.getConnection(url,id,pw);  
  stmt = conn.createStatement ();

  System.out.println("다음 중 작업을 선택하세요.");
  System.out.println("1. select * from test10_tbl;");
  System.out.println("2. insert into test10_tbl values(11,'test99','김종식',22);");

        // System.in 만으로는 1byte만 받으므로, 한글 등의 입력이 불가
        // InputStreamReader 가 1byte로 입력받은 것을 2bytes로 바꿔주므로, 한글 입력도 가능
        // BufferedReader 는 데이터를 모아서 한꺼번에 처리해준다. 속도의 비약적인 향상
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  String choice = br.readLine();

  String sql=null;

  if(choice.equals("2")){
   sql="insert into test10_tbl values(11,'test99','김종식',22)";
  }
  else {
   sql="select * from test10_tbl";
  }

        // insert, create 등은 executeUpdate() 를 통해서 실행해야하고,
        // select 문은 executeQuery() 를 통해서 실행해야 하므로,
        // 어떤게 실행될 지 모르는 지금은 둘 다 실행할 수 있는 execute() 를 통해서 실행한다.
  boolean result = stmt.execute(sql);
        // execute() 의 결과로는, select 문이 실행되었을 경우 true,
        // 그 외의 문이 실행되었을 경우에는 false 가 반환된다.
  // 따라서 result 가 true 면 select 문이 실행되어 그 결과가 있으므로 rs를 통해서 결과를 출력한다.
  if(result) {
   System.out.println("조회 결과는 다음과 같습니다.");
   rs = stmt.getResultSet();
   while (rs.next()) {//ResultSet의 각 레코드행 이동
    String s=rs.getString("num")+"\t";
    s += rs.getString("id")+"\t";
    s += rs.getString("name")+"\t";
    s += rs.getString("age");

    System.out.println(s);
      }
     }else {
   System.out.println("변경된 행의 수는 : " + stmt.getUpdateCount());
  }
 }catch(SQLException e){
  e.printStackTrace();
 }catch(Exception e){
  e.printStackTrace();
 }
  }
}


/*******************************************************************************************
*   파일        : SelectPreTest.java
*   용도        : preparedStatment 의 테스트
*   작성자     : 성홍제
*   작성일     : 2006. 07. 25
*   Version   : 1.0
*******************************************************************************************/

import java.sql.*;

public class SelectPreTest{
 public static void main (String args []) {
  if(args.length < 1){
   System.out.println("검색할 num 조건을 입력하세요.");
   return;
  }

  Connection conn = null;
  PreparedStatement pstmt = null;
  ResultSet rs = null;
  String url = "jdbc:oracle:thin:@61.109.232.128:1521:ora92";
  String id = "lonelycat";
  String pw = "ora123";
  try{
   Class.forName ("oracle.jdbc.driver.OracleDriver");
        conn = DriverManager.getConnection(url,id,pw);
   
   pstmt = conn.prepareStatement( "select * from test10_tbl where num >= ?");
   pstmt.setInt(1,Integer.parseInt(args[0]));
   
   rs=pstmt.executeQuery();

   while(rs.next()){
    System.out.println(rs.getInt("num") + " : " + rs.getString("id") + " : " + rs.getString("name") + " : " + rs.getInt("age"));
   }
   pstmt.close();
   conn.close();
  } catch (SQLException e){
   e.printStackTrace();
  } catch (ClassNotFoundException e){
   e.printStackTrace();
  } catch (Exception e){
   e.printStackTrace();
  }
 }
}


/*******************************************************************************************
*   파일        : Exam04_01.java
*   용도        : preparedStatment 의 테스트
*   작성자     : 성홍제
*   작성일     : 2006. 07. 25
*   Version   : 1.0
*******************************************************************************************/

import java.sql.*;
 
public class Exam04_01 {
    public static  void main(String[] args){
        Connection conn = null;
     PreparedStatement pstmt = null;
     String url = "jdbc:oracle:thin:@61.109.232.128:1521:ora92";
     String user = "lonelycat";      
     String passwd = "ora123";
 
     try {
        Class.forName("oracle.jdbc.driver.OracleDriver");  
        conn = DriverManager.getConnection(url, user, passwd);
                   
        String sql = "insert into test10_tbl values( ?, ?, ?, ?)";
        pstmt = conn.prepareStatement(sql); //SQL문 전송 객체 생성

        pstmt.setInt(1, 100 ); //데이타 인덱스별 설정
        pstmt.setString(2, "id_temp");
        pstmt.setString(3, "작업맨" );
        pstmt.setInt(4, 30 );

        int result = pstmt.executeUpdate(); //질의문 수행
            
        System.out.println(result + "개의 Data 입력 성공!!");
     }catch(Exception e) {
        System.out.println(e.getMessage());
     }finally {
        try{  if(pstmt != null) pstmt.close();
              if(conn != null)  conn.close();
        }catch(Exception ex) {}
     }
  }    
}// class end



/*******************************************************************************************
*   파일        : SearchZipcode.java
*   용도        : 우편번호 검색 프로그램
*   작성자     : 성홍제
*   작성일     : 2006. 07. 25
*   Version   : 1.0
*******************************************************************************************/

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.*;

public class SearchZipcode
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
       
        String url = "jdbc:oracle:thin:@61.109.232.128:1521:ora92";
        String id = "lonelycat";
        String pw = "ora123";
       
        String dong = "";
        String result = "";
        String result2 = "";
        int i = 0;  // vector 용
        Vector dongList = new Vector();
       
        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");           
            conn = DriverManager.getConnection(url,id,pw);
           
            pstmt = conn.prepareStatement( "select * from zipcode where dong like ?");
           
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
           
            while(true)
            {
                System.out.print("동 이름을 입력해주세요>>  ");
                dong = br.readLine();
               
                if(dong.length() > 0)
                    break;
            }
           
            pstmt.setString(1,"%" + dong + "%");
           
            rs=pstmt.executeQuery();
           
            // 1차 결과 출력
            while(rs.next())  
            {//ResultSet의 각 레코드행 이동
                result = rs.getInt("SEQ") + "\t"
                        + rs.getString("ZIPCODE").trim() + " "
                        + rs.getString("SIDO").trim() + " "
                        + rs.getString("GUGUN").trim() + " "
                        + rs.getString("DONG").trim() + " "
                        + rs.getString("RI").trim() + " "
                        + rs.getString("BLDG").trim() + " "
                        + rs.getString("ST_BUNJI").trim() + " "
                        + rs.getString("ED_BUNJI").trim();
               
                result2 =   rs.getString("ZIPCODE").trim() + " "
                            + rs.getString("SIDO").trim() + " "
                            + rs.getString("GUGUN").trim() + " "
                            + rs.getString("DONG").trim() + " ";
               
                if(rs.getString("RI") != null)
                    result2 += rs.getString("RI").trim() + " ";
               
                if(rs.getString("BLDG") != null)
                    result2 += rs.getString("BLDG").trim() + " ";
               
                if(rs.getString("ST_BUNJI") != null)
                    result2 += rs.getString("ST_BUNJI").trim() + " ";
               
                if(rs.getString("ED_BUNJI") != null)
                    result2 += rs.getString("ED_BUNJI").trim() + " ";
               
                dongList.add(result2);
               
                System.out.println("" + (++i) + ": " + result);
            }
           
            // 동 선택
            while(true)
            {
                System.out.print("살고 있는 곳을 선택해주세요>>  ");
                dong = br.readLine();
               
                if(dong.length() > 0)
                    break;
            }
           
            // 선택한 동 주소
            i = Integer.parseInt(dong);
           
            // 나머지 주소
            while(true)
            {
                System.out.println("나머지 주소를 입력해주세요>>  ");
                dong = br.readLine();
               
                if(dong.length() > 0)
                    break;
            }
           
            String str = (String)dongList.get(i-1);
            str = str + dong;
           
            System.out.println(str);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

}


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

[JDBC] 06 PL/SQL  (0) 2007.11.27
[JDBC] 05 ResultSet  (0) 2007.11.27
[JDBC] 04 JDBC - Connection Pool...  (0) 2007.11.27
[JDBC] 02 2일째  (0) 2007.11.27
[JDBC] 01 JDBC 시작  (0) 2007.11.27

[JDBC] 02 2일째

프로그래밍/DB 2007. 11. 27. 13:54 Posted by galad

★ 오라클 서버 설치된 컴퓨터에서 방화벽 설정하기

오라클 서버 기본 포트: 1521

방화벽에서 1521 포트를 열어주더라도 작동을 하지 않는다.

오라클은 기본적으로 1521을 사용하나, 클라이언트가 접속하면 랜덤하게 포트를 설정해서
클라이언트에게 할당한다. 따라서 이 임의의 포트는 방화벽에 막히므로 접속 불가.

그렇다고 방화벽을 열 수도 없는 노릇.

따라서 방화벽 설정 중에서 포트 단위가 아니라, 프로그램 단위로 접속을 허용하게 해 준다.
oracle.exe, tnslsnr.exe(? 암튼 이거 비슷한거)를 열어주면 된다.


★ JDBC에서 내리는 모든 명령어는 Auto Commit 이다.

Create든 Insert든...

Auto Commit 을 막는 설정도 있다고 한다.


/*******************************************************************************************
* 파일  : Exam03_01.java
* 용도  : 오라클 DB에 연결한 후, 테이블을 생성한다.
* 작성자 : 성홍제
* 작성일 : 2006. 07. 24
* Version : 1.0
*******************************************************************************************/


// ① 관련 패키지 임포트
import java.sql.*;


public class Exam03_01
{
    // Fields
    // Constructor
    // Method
    // Main Method
    public static void main (String args[])
    {  
      Connection conn = null;
      Statement stmt = null;
      String url = "jdbc:oracle:thin:@61.109.232.128:1521:ora92";


      // ② 드라이버 로딩  
      try
      {
         Class.forName("oracle.jdbc.driver.OracleDriver");
      }
      catch(ClassNotFoundException ex1)
      {
         System.out.println("드라이버 로딩 에러 : "+ ex1.toString());
         return;
      }
      catch(Exception ex2)
      {
         System.out.println("DB 접속 실패 : "+ ex2.toString());
         return;
      }


      String sql=
"CREATE TABLE member(id CHAR(10) CONSTRAINT mb_id_pk PRIMARY KEY, pw CHAR(10) CONSTRAINT mb_pw_nn NOT NULL, name VARCHAR2(10) CONSTRAINT mb_name_nn NOT NULL, sex CHAR(1) CONSTRAINT mb_sex_ck CHECK (sex IN ('F', 'M')), ssn NUMBER(13) CONSTRAINT mb_ssn_uk UNIQUE)";
 
      try
      {
         // ③ 오라클 연결
         conn = DriverManager.getConnection(url, "lonelycat", "ora123");
         System.out.println("DB연결 성공");


         // ④ sql 명령문 구문 객체 생성
         stmt=conn.createStatement();
         // ⑤ sql query 실행
         stmt.executeUpdate(sql);

      }
      catch(Exception ex3)
      {
         System.out.println("SQL 문 수행 오류 : "+ ex3.toString());
         return;
      }
      finally
      {
         // ⑥ 연결 객체 반납
         try
         {
            stmt.close();
            conn.close();
         }
         catch(Exception ex4)
         {}
      }
       
   System.out.println("DB 접속 및 SQL 문 수행 성공!");
   }// main end
}//class end



/*******************************************************************************************
* 파일  : Exam03_02.java
* 용도  : 오라클 DB에 연결한 후, Exam03_01에서 생성한 테이블에 데이터를 넣는다.
* 작성자 : 성홍제
* 작성일 : 2006. 07. 24
* Version : 1.0
*******************************************************************************************/

import java.sql.*;


public class Exam03_02
{
    // Fields
    // Constructor
    // Method
    // Main Method
    public static  void main(String[] args)
    {
        Connection conn = null;
        Statement stmt = null;
        String url = "jdbc:oracle:thin:@61.109.232.128:1521:ora92";


        try
        {
           Class.forName("oracle.jdbc.driver.OracleDriver");
        }
        catch(ClassNotFoundException ex1)
        {
            System.out.println("드라이버 로딩 에러 : "+ ex1.toString());
            return;
        }
        catch(Exception ex2)
        {
            System.out.println("DB 접속 실패 : "+ ex2.toString());
            return;
        }
       
        try
        {
            conn = DriverManager.getConnection(url, "lonelycat", "ora123");
            System.out.println("DB연결 성공");
           
            stmt = conn.createStatement();
            String sql =

                  "insert into member values( 'lonelycat', 'ora123', '성홍제', 'M', 7901161069111)";
            System.out.println("SQL : " + sql);
           
            int result = stmt.executeUpdate(sql);
            System.out.println(result + "개의 Data 입력 성공!!");
        }
        catch(Exception e)
        {
            System.out.println("Data 입력 실패!! : " + e.getMessage());
        }
        finally
        {
            try
            {
               if(stmt != null)
                  stmt.close();


               if(conn != null)
                  conn.close();

            }
            catch(Exception ex)
            {}
        }
    }

   
    /*static String toDB(String str) throws UnsupportedEncodingException{
        return new String(str.getBytes("KSC5601"), "8859_1");
    }
   
    static String fromDB(String str) throws UnsupportedEncodingException{
        return new String(str.getBytes("8859_1"), "KSC5601");
    }*/
}// class end



/*******************************************************************************************
* 파일  : Exam03_03.java
* 용도  : 오라클 DB에 연결한 후, Exam03_01에서 생성한 테이블의 데이터를 확인한다.
* 작성자 : 성홍제
* 작성일 : 2006. 07. 24
* Version : 1.0
*******************************************************************************************/

import java.sql.*;

public class Exam03_03
{
    public static  void main(String[] args)
    {
        Connection conn = null;
        Statement stmt = null;
        String url = "jdbc:oracle:thin:@61.109.232.128:1521:ora92";

        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            conn = DriverManager.getConnection(url, "lonelycat", "ora123");
        }
        catch(ClassNotFoundException ex1)
        {
            System.out.println("드라이버 로딩 에러 : "+ ex1.toString());
            return;
        }
        catch(Exception ex2)
        {
            System.out.println("DB 접속 실패 : "+ ex2.toString());
            return;
        }

        try{
            stmt = conn.createStatement();
            String sql = "SELECT * FROM member";
            ResultSet rs = stmt.executeQuery(sql);

            while(rs.next())
            {
                String s = rs.getString("id")+ "\t";
                s += rs.getString("pw")+"\t";
                s += rs.getString("name")+"\t";
                s += rs.getString("sex")+"\t";
                s += rs.getLong("ssn");
                System.out.println(s);
            }
        }
        catch(Exception e)
        {
            System.out.println("SELECT 실패! : " + e.getMessage());
        }
        finally
        {
            try
            {   
                if(stmt != null)
                    stmt.close();

                if(conn != null)
                    conn.close();
            }
            catch(Exception ex)
            {
            }
        }
    } // main end
}// class end



/*******************************************************************************************
* 파일  : Exam03_04.java
* 용도  : 오라클 DB에 연결한 후, 입력 받은 id를 이용해서 테이블을 검색한다.
* 작성자 : 성홍제
* 작성일 : 2006. 07. 24
* Version : 1.0
*******************************************************************************************/

// ① 관련 패키지 임포트
import java.io.*;
import java.sql.*;

public class Exam03_04
{
    // Fields
    // Constructor
    // Method
    // Main Method
    public static void main (String args[])
    {  
        Connection conn = null;
        Statement stmt = null;
        String url = "jdbc:oracle:thin:@61.109.232.128:1521:ora92";

        // id 입력받기
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String id = "";

        try
        {

            System.out.print("ID를 입력해주세요>> ");
            id = in.readLine();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        //System.out.println(id);

        // ② 드라이버 로딩  
        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            conn = DriverManager.getConnection(url, "lonelycat", "ora123");
        }
        catch(ClassNotFoundException ex1)
        {
            System.out.println("드라이버 로딩 에러 : "+ ex1.toString());
            return;
        }
        catch(Exception ex2)
        {
            System.out.println("DB 접속 실패 : "+ ex2.toString());
            return;
        }

        String sql=
        "SELECT * FROM member WHERE id = '" + id.trim() + "'";

        System.out.println(sql);

        try
        {
            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);

            while(rs.next())
            {
                String s = rs.getString("id")+ "\t";
                s += rs.getString("pw")+"\t";
                s += rs.getString("name")+"\t";
                s += rs.getString("sex")+"\t";
                s += rs.getLong("ssn");
                System.out.println(s);
            }
        }
        catch(Exception e)
        {
            System.out.println("SELECT 실패! : " + e.getMessage());
        }
        finally
        {
            // ⑥ 연결 객체 반납
            try
            {
                stmt.close();
                conn.close();
            }
            catch(Exception ex4)
            {}
        }

        System.out.println("DB 접속 및 SQL 문 수행 성공!");
    }// main end
}//class end

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

[JDBC] 06 PL/SQL  (0) 2007.11.27
[JDBC] 05 ResultSet  (0) 2007.11.27
[JDBC] 04 JDBC - Connection Pool...  (0) 2007.11.27
[JDBC] 03 3일째  (0) 2007.11.27
[JDBC] 01 JDBC 시작  (0) 2007.11.27

[JDBC] 01 JDBC 시작

프로그래밍/DB 2007. 11. 27. 13:53 Posted by galad

DB : Oracle 9i

JAVA : Sdk 1.5.0_06


1. 오라클 설치 후 환경 설정


시스템의 환경변수 설정 화면에서


---\Oracle\jre\1.3.1\bin;

---\Oracle\jre\1.1.8\bin;


을 삭제한다.

오라클 설치 시 인스톨 되는 jre 버젼과 우리가 자바를 설치했을 때 인스톨 한 jre 버젼이

맞지 않아서 생기는 문제를 없앤다.


2. JDBC로 DB에 접속하는 4가지 타입

① Type 1 : JDBC-ODBC Bridge Plus ODBC Driver
  ■ Bridge 방식은 현존하는 DB의 ODBC driver를 그대로 이용하여 JDBC access를 지원하는 module
  ■ ODBC는 각 database client에 install되어 있는 Native code를 사용
  ■ Failure Point 발생 가능성


② Type 2 : Native API
  ■ Native database client library를 이용하여 작성
  ■ Driver는 JDBC 호출을 번역하여 database client library의 API로 변경
  ■ Library는 DBMS provider에 의해 제공
  ■ 플랫폼에 독립적이지 못하므로 플랫폼에 맞는 곳에서만 사용가능


③ Type 3 : JDBC-Net
  ■ Client와 Server사이의 중간에서 통신을 수행
  ■ 중간 Server의 Protocol에 특정적으로 동작 해야 함. JDBC 메소드를 호출해서 DBMS에 독립적인 네트웍 프로토콜로 전환해 주는 드라이버
  ■ No native code model
  ■ DB를 바꾸더라도 Middleware만 교체해주면 된다.
  ■ 주로 규모가 큰 회사에서 사용 - Middleware가 필요하므로 비용이 많이 들어서.


④ Type 4 : Native Protocol
  ■ JDBC 호출을 DBMS에서 사용하는 Network protocol로 곧바로 번역 함
  ■ Client에서 Database로의 direct 호출이 가능
  ■ Best Performance
  ■ 사용하는 DBMS를 변경할 때는 유연하지 못함
  ■ 가장 많이 사용하는 방식.


3. Oracle에서 JDBC를 사용하기 위해서 해주어야 할 일

① 환경변수 - 클래스패스에 D:\Java\jdk1.5.0_06\lib\classes12.zip; 를 추가해주어야 한다.

 classes12.jar 는 JSP에서 사용하고, zip은 자바 응용 프로그램에서 사용하므로 주의!!!


/*******************************************************************************************
* 파일  : Test.java
* 용도  : JDBC 시작
* 작성자 : 성홍제
* 작성일 : 2006. 07. 21
* Version : 1.0
*******************************************************************************************/


// ① 패키지 임포트
import java.sql.*;


public class Test
{
  // Fields
  // Constructor
  // Methods
  // Main

  public static void main(String[] args)
  {
    Connection con = null; // DB가 연결될 때 그 정보를 받는다
    Statement stmt = null; // SQL 명령어를 사용하기 위한 변수
    ResultSet rs = null;  // SQL 명령을 실행한 후, 그 결과를 받기 위한 변수


    System.out.println("지금부터 시작합니다");


    // ② 드라이버 로딩 - 드라이버 로딩에 실패할 경우에 대비하여 try-catch
    try
    {
      Class.forName("oracle.jdbc.driver.OracleDriver");  // 글자 틀리지 말 것
      System.out.println("오라클 드라이버 로딩 성공");
    }
    catch(Exception e)
    {
      System.out.println(e);
    }

 

    // thin: Type4 방식을 사용하여 접속
    // 서버 IP, 1521: 포트 번호 - default: 1521
    // ora92: DB 이름
    String url = "jdbc:oracle:thin:@61.109.232.128:1521:ora92";  // 글자 틀리지 말 것


    try
    {
      // ③ 오라클 데이터베이스 연결
      con = DriverManager.getConnection(url, "scott", "tiger"); // 임시로 scott으로 접속

      System.out.println("오라클 데이터베이스 연결 성공");
    }
    catch(Exception e)
    {
      System.out.println("오라클 데이터베이스 연결 실패");
    }


    try
    {
      // ④ Statement 객체 생성
      stmt = con.createStatement();


      // ⑤ SQL 구문 실행

      // DB에서 실행할 뿐, 결과는 ResultSet으로 받는다.
      rs = stmt.executeQuery("select * from emp");


      // ⑥ ResultSet 결과 사용하기
      while(rs.next()) // 다음 데이터가 없을 때 까지 무한루프
      {

        // rs의 결과중 1번째 것: empno. empno는 number이므로 getInt로 가져온다.
        //String empno = rs.getInt(1);  
       int empno = rs.getInt("empno"); // rs의 결과중 컬럼 이름이 empno인 것.


       // 마찬가지로 결과중 2번째 것: ename. varchar2이므로 getString으로 가져온다.
       //String ename = rs.getString(2);  

       // 숫자로 몇 번째 것: 보다는 이렇게 컬럼명을 사용하는게 좋다.
       String ename = rs.getString("ename");


       System.out.print("empno: " + empno + "\t");
       System.out.println("ename: " + ename);
     }
   }
   catch(Exception e)
   {
      e.printStackTrace();
   }
   finally  // 예외가 발생하든 안하든 반드시 자원을 반납해주어야 서버가 다운되지 않는다.
   {
      try
      {
        // ⑦ 자원 반납
        stmt.close();
        con.close();
      }
      catch(Exception e)
      {
        e.printStackTrace();
      }


      System.out.println("객체 반납");
    }
  }
}

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

[JDBC] 06 PL/SQL  (0) 2007.11.27
[JDBC] 05 ResultSet  (0) 2007.11.27
[JDBC] 04 JDBC - Connection Pool...  (0) 2007.11.27
[JDBC] 03 3일째  (0) 2007.11.27
[JDBC] 02 2일째  (0) 2007.11.27

04 UDP

프로그래밍/Java 2007. 11. 27. 13:49 Posted by galad


/******************************************************************************
*   파일      : UDPTimeClient.java
*   용도      : UDP Client
*   작성자   : 성홍제
*   작성일   : 2006. 08. 10
*   Version : 1.0
******************************************************************************/

package Client;

import java.net.*;  
   
public class UDPTimeClient
{  
    public static void main(String[] args)
    {  
        /*if(args.length != 2)
        {
            System.out.println("사용법 : java UDPEchoClient ip port");
            System.exit(1);
        }
       
        String ip = args[0];
        int port = 0;
       
        try
        {
            port = Integer.parseInt(args[1]);
        }
        catch(Exception ex)
        {
            System.out.println("port 번호는 양의 정수로 입력하여 주세요.");
            System.exit(1);
        }*/
       
        String ip = "61.109.232.157";   
        int port = 9999;
       
        InetAddress inetaddr = null;
       
        try
        {  
            inetaddr = InetAddress.getByName(ip);
        }
        catch (UnknownHostException e)
        {  
            System.out.println("잘못된 도메인이나 ip입니다.");
            System.exit(1);
        }
       
        DatagramSocket dsock = null;
       
        try
        {
            // 클라이언트의 데이터그램소켓은 패킷에 서버의 주소와 포트를 넣어주므로

            // 생성자에 아무런 인자가 필요없다.
            dsock = new DatagramSocket();
            String line = null;
           
            // 전송
            // 일단 아무런 내용도 없는 패킷을 보내서

            // 서버가 클라이언트의 위치를 알 수 있게 해준다.
            DatagramPacket sendPacket = new DatagramPacket("".getBytes(),
                                                                                    "".getBytes().length,
                                                                                    inetaddr,
                                                                                    port);
            dsock.send(sendPacket);
             
            byte[] buffer = new byte[200];
            DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);
            dsock.receive(receivePacket);
           
            // 받은 결과 출력.
            String msg = new String(receivePacket.getData(),
                                                0,
                                                receivePacket.getData().
                                                length);
           
            System.out.println("서버로 부터 전달받은 시간 :" + msg.trim());
        }
        catch(Exception ex)
        {  
            System.out.println(ex);
        }
        finally
        {  
            if(dsock != null)
            dsock.close();
        }  
    } // main  
} // class




/******************************************************************************
*   파일      : UDPTimeServer.java
*   용도      : UDP Server
*   작성자   : 성홍제
*   작성일   : 2006. 08. 10
*   Version : 1.0
******************************************************************************/

package Server;

import java.net.*;  
import java.util.*;  
   
   
public class UDPTimeServer
{  
    public static void main(String[] args)
    {  
        /*if(args.length != 1)
        {
            System.out.println("사용법 : java UDPEchoServer port");
            System.exit(1);
        }
       
        int port = 0;
       
        try
        {
            port = Integer.parseInt(args[0]);
        }
        catch(Exception ex)
        {
            System.out.println("port 번호는 양의 정수로 입력하여 주세요.");
            System.exit(1);  
        }*/
       
        int port = 9999;
       
        DatagramSocket dsock = null;
       
        try
        {  
            System.out.println("접속 대기상태입니다.");
           
            dsock = new DatagramSocket(port);  
            String line = null;  
           
            while(true)
            {  
             // 받기
                byte[] buffer = new byte[1024];
               
                // TCP와는 다르게 소켓으로 계속 연결되어있는 것이 아니므로
                // 일단 클라이언트의 정보를 얻기 위해서 먼저 받아야 한다.
                DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);
                dsock.receive(receivePacket);
               
                java.text.SimpleDateFormat format

                     = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
                String sdate = format.format(new Date());
               
                System.out.println(receivePacket.getAddress().getHostAddress()

                                           + " 에 현재시간 " + sdate + " 을 전송합니다.");

                // 비연결성이므로 보내는 데이터마다 주소와 포트가 필요하다.
                // 위에서 먼저 받은 패킷을 이용해서 클라이언트의 주소와 포트 번호를 알아낸다.
                DatagramPacket sendPacket = new DatagramPacket(sdate.getBytes(),
                                                                                        sdate.getBytes().length,
                                                                                        receivePacket.getAddress(),
                                                                                        receivePacket.getPort());
               
                // getBytes() - 스트링을 바이트 배열로 바꾸어준다. 스트림으로 전송하기 위해서는
                // 바이트 단위로 바꿀 필요가 있다.
               
                dsock.send(sendPacket);
            } // while  
        }
        catch(Exception ex)
        {  
            System.out.println(ex);  
        }
        finally
        {  
            if(dsock != null)  
                dsock.close();
        }  
    } // main    
} // class




/******************************************************************************
*   파일      : RadioClient.java
*   용도      : UDP 라디오 클라이언트
*   작성자   : 성홍제
*   작성일   : 2006. 08. 10
*   Version : 1.0
******************************************************************************/

package Client;

import java.io.*;
import java.net.*;

public class RadioClient
{
    final static int MAXBUFFER = 80;
   
    public static void main(String[] args)
    {
        /*if (args.length != 1)
         * {
        System.out.println("사용법: java RadioClient port");
        System.exit(0);
        }*/
         
        byte buffer[] = new byte[MAXBUFFER];
        //int port = Integer.parseInt(args[0]);
        int port = 163;
       
        try
        {
            DatagramSocket socket = new DatagramSocket(port);
            DatagramPacket recv_packet;// 수신용 데이터그램 패킷
           
            while (true)
            {
                recv_packet = new DatagramPacket (buffer, buffer.length);
                socket.receive (recv_packet);
                // 화면 출력
                String result = new String(buffer, 0, recv_packet.getLength());
                System.out.println(port + "방송: " + result);
            }
        }
        catch(IOException e)
        {
            System.out.println(e);
        }
    }
}




/******************************************************************************
*   파일      : RadioClient.java
*   용도      : UDP 라디오 클라이언트
*   작성자   : 성홍제
*   작성일   : 2006. 08. 10
*   Version : 1.0
******************************************************************************/
package Server;

import java.io.*;
import java.net.*;

public class RadioServer
{
    final int MAXBUFFER = 512;
   
    void work()
    {
        byte buffer[] = null;
       
        String[] str = {"배고파~배고파~배고파~배고파~배고파~배고파~배고파~배고파~배고파~배고파~배고파~",
          "졸려~~~~~~~~~~~졸려~~~~~~~~~~~졸려~~~~~~~~~~~",
          "피곤해~~~~~~~~~피곤해~~~~~~~~~피곤해~~~~~~~~~피곤해~~~~~~~~~",
          "휴가 좀 보내주~~~~~~~~~~휴가 좀 보내주~~~~~~~~~~휴가 좀 보내주~~~~~~~~~~",
          "뭐냐? 이건",
          "잠 잘거야?",
          "하고 싶당!"
        };
       
        String[] dest = {"128","130","131",
          "132",
          "133",
          "134",
          "135",
          "136",
          "137",
          "138",
          "139",
          "140",
          "141",
          "142",
          "143",
          "144",
          "145",
          "146",
          "147",
          "148",
          "149",
          "150",
          "151",
          "152",
          "153",
          "154",
          "155",
          "156",
          "157",
          "158",
          "159",
          "160",
          "161",
          "162",
          "163",
          "164",
          "165",
          "166"};
       
        //String[] dest = {"100", "12"};
        try
        {
            DatagramSocket socket = new DatagramSocket();
            DatagramPacket send_packet = null;
            int i=0;
           
            while(true)
            {
                buffer = str[i++].getBytes();
                for (int j=0; j<dest.length; j++)
                {
                    //send_packet = new DatagramPacket(buffer, 

                    //      buffer.length,InetAddress.getByName("70.12.112."+dest[j]), 163);
                    send_packet = new DatagramPacket(buffer,
                                                buffer.length,InetAddress.getByName("61.109.232."

                                                                                                      +dest[j]),163);
                    socket.send (send_packet);
                }
               
                Thread.sleep(1000);
               
                if (i>=str.length)
                    i=0;
            }
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }
     
    public static void main (String[] args)
    {
        new RadioServer().work();
    }
}

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

HttpURLConnection 사용례  (0) 2009.01.06
[펌] HttpURLConnection 을 이용하세요  (0) 2009.01.02
03 졸려....  (0) 2007.11.27
02 2일째....  (0) 2007.11.27
01 Network 첫시간...  (0) 2007.11.27

03 졸려....

프로그래밍/Java 2007. 11. 27. 13:48 Posted by galad


/******************************************************************************
*   파일      : MyFileServer.java
*   용도      : 파일 전송 서버
*   작성자   : 성홍제
*   작성일   : 2006. 08. 08
*   Version : 1.0
******************************************************************************/

package Server;

import java.net.*;             
import java.io.*;

public class MyFileServer
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        ServerSocket ss = null;
        Socket socket = null;
       
        //BufferedReader br = null; // 이건 문자로만 취급하므로 텍스트 파일만 취급 가능
        //PrintWriter pw = null;
       
        // 파일에서 읽어서 네트워크에 쓴다. 이건 1바이트 단위로 취급하므로

        // 어떤 파일이든 취급 가능하다.
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
       
        try
        {
           ss = new ServerSocket(10002);
          
           while(true)
           {
               System.out.println("클라이언트의 접속을 기다립니다.");
               socket = ss.accept();
              
               // 접속하면 접속한 클라이언트의 IP 출력
               InetAddress address = socket.getInetAddress();
               System.out.println(address.getHostAddress() + " 로부터 접속하였습니다.");
              
               //br = new BufferedReader(new )
               bis = new BufferedInputStream(new FileInputStream("d:\\Test1.txt"));
               bos = new BufferedOutputStream(socket.getOutputStream());
              
               int b = 0;
              
               while((b = bis.read()) != -1)
               {
                   try
                   {
                       bos.write(b);
                       bos.flush();
                   }
                   catch(Exception e)
                   {
                       System.out.println("파일을 클라이언트에 보내던 중에 예외 발생");
                       e.printStackTrace();
                   }
               }
                   
               System.out.println("전송을 완료했습니다.");
              
               // 전송 완료하고, 그 클라이언트와의 연결을 끊은 후,

               // 다른 클라이언트의 접속을 기다린다.
               bos.close();
               socket.close();
           }
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally
        {
            try
            {
                bis.close();
                ss.close();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
    }

}




/******************************************************************************
*   파일      : MyFileClient.java
*   용도      : 파일 전송 클라이언트
*   작성자   : 성홍제
*   작성일   : 2006. 08. 08
*   Version : 1.0
******************************************************************************/

package Client;

import java.net.*;             
import java.io.*;

public class MyFlieClient
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        Socket socket = null;
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
       
        try
        {
            socket = new Socket("localhost", 10002);
           
            bis = new BufferedInputStream(socket.getInputStream());
            bos = new BufferedOutputStream(new FileOutputStream("d:\\Test2.txt"));
           
            int b = 0;
           
            while((b = bis.read()) != -1)
            {
                bos.write(b);
                bos.flush();
            }           
            System.out.println("파일을 다운로드 하였습니다.");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                bos.close();
                bis.close();
                socket.close();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
    }

}



/******************************************************************************
*   파일      : MyFileServer.java
*   용도      : 파일 전송 서버 - 쓰레드로 바꾼 것
*   작성자   : 성홍제
*   작성일   : 2006. 08. 08
*   Version : 1.0
******************************************************************************/

package Server;

import java.net.*;             
import java.io.*;

public class MyFileServer
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        ServerSocket ss = null;
        Socket socket = null;
       
        //BufferedReader br = null; // 이건 문자로만 취급하므로 텍스트 파일만 취급 가능
        //PrintWriter pw = null;
       
        // 파일에서 읽어서 네트워크에 쓴다. 이건 1바이트 단위로 취급하므로

        // 어떤 파일이든 취급 가능하다.
        BufferedInputStream bis = null;
       
        try
        {
           // 처음에 한번만 생성해서 사용한다.
           ss = new ServerSocket(10002);
           bis = new BufferedInputStream(new FileInputStream("d:\\Test1.txt"));
          
           while(true)
           {
               System.out.println("클라이언트의 접속을 기다립니다.");
               socket = ss.accept();
              
               // 접속하면 접속한 클라이언트의 IP 출력
               InetAddress address = socket.getInetAddress();
               System.out.println(address.getHostAddress() + " 로부터 접속하였습니다.");
       
               MyFileServerThread mfst = new MyFileServerThread(bis, socket);
               mfst.start();
           }
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally
        {
            try
            {
                bis.close();
                ss.close();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
    }
}

class MyFileServerThread extends Thread
{
    /// Fields
    private Socket socket = null;
    private BufferedInputStream bis = null;
    private BufferedOutputStream bos = null;
   
    /// Constructor
    MyFileServerThread(BufferedInputStream bis, Socket soc)
    {
        this.socket = soc;
        this.bis = bis;
       
        try
        {
            bos = new BufferedOutputStream(this.socket.getOutputStream());
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            System.out.println("출력 스트림 생성 시 예외 발생");
            e.printStackTrace();
        }
    }
   
    /// Methods
    public void run()
    {
        int b = 0;
       
        while(true)
        {
            try
            {
                b = bis.read();
            }
            catch (IOException e1)
            {
                System.out.println("파일을 읽던 중에 예외 발생");
                e1.printStackTrace();
            }
           
            if(b == -1)
                break;
           
            try
            {
                bos.write(b);
                bos.flush();
            }
            catch(Exception e)
            {
                System.out.println("파일을 클라이언트에 보내던 중에 예외 발생");
                e.printStackTrace();
            }
        }
            
        System.out.println("전송을 완료했습니다.");
       
        // 전송 완료하고, 그 클라이언트와의 연결을 끊은 후, 다른 클라이언트의 접속을 기다린다.
        try
        {
            // bis는 서버에서 계속 사용하므로 쓰레드에서 닫으면 안된다.
            bos.close();
            socket.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
   
    /// Main
}



/******************************************************************************
*   파일      : MyFileClient.java
*   용도      : 파일 전송 클라이언트
*   작성자   : 성홍제
*   작성일   : 2006. 08. 08
*   Version : 1.0
******************************************************************************/

package Client;

import java.net.*;             
import java.io.*;

public class MyFlieClient
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        Socket socket = null;
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
       
        try
        {
            socket = new Socket("localhost", 10002);
           
            bis = new BufferedInputStream(socket.getInputStream());
            bos = new BufferedOutputStream(new FileOutputStream("d:\\Test2.txt"));
           
            int b = 0;
           
            while((b = bis.read()) != -1)
            {
                bos.write(b);
                bos.flush();
            }           
            System.out.println("파일을 다운로드 하였습니다.");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                bos.close();
                bis.close();
                socket.close();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
    }

}



/******************************************************************************
*   파일      : SimpleWebServer.java
*   용도      : 웹 서버 - 간단한 웹 서버 기능을 한다. 익스플로러에서 http://localhost:8081/파일명 *                 이런 식으로
*                 요청하면 웹 서버 폴더에 있는 파일을 보여준다.
*   작성자   : 성홍제
*   작성일   : 2006. 08. 08
*   Version : 1.0
******************************************************************************/

package Server;

import java.net.*;             
import java.io.*;

public class SimpleWebServer
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        Socket socket = null;
        BufferedReader br = null;
        BufferedReader fin = null;
        PrintWriter pw = null;
       
        try
        {
            ServerSocket ss = new ServerSocket(8081);
           
            while(true)
            {
                System.out.println("클라이언트의 접속을 기다립니다.");
                socket = ss.accept();
                System.out.println("클라이언트가 접속했습니다.");
               
                br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
               
                String line = "";
               
                try
                {
                    line = br.readLine();
                   
                    // HTTP 프로토콜에 정해진 대로 첫줄에 사용자가 요청한 파일명이 들어가있으므로
                    // 첫 줄을 읽어서, 사용자가 요청한 파일명을 얻어온다.
                    // indexOf(" ") - " "가 시작되는 인덱스를 리턴한다.
                    int start = line.indexOf(" ") + 2;
                    int end = line.lastIndexOf("HTTP") - 1;
                   
                    String filename = line.substring(start, end);
                   
                    System.out.println("클라이언트가 " + filename + "을 요청했습니다.");
                   
                    fin = new BufferedReader(new FileReader(filename));
                    pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
                   
                    String fline = null;
                   
                    while((fline = fin.readLine()) != null)
                    {
                        //System.out.println(fline);
                       
                        pw.println(fline);
                        pw.flush();
                    }
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
                finally
                {
                    if(fin != null)
                        fin.close();
                   
                    if(pw != null)
                        pw.close();
                   
                    if(br != null)
                        br.close();
                   
                    if(socket != null)
                        socket.close();
                }
               
            }//while(true)
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }//public static void main(String[] args)

}

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

[펌] HttpURLConnection 을 이용하세요  (0) 2009.01.02
04 UDP  (0) 2007.11.27
02 2일째....  (0) 2007.11.27
01 Network 첫시간...  (0) 2007.11.27
05 문자 단위 입출력  (0) 2007.11.27

02 2일째....

프로그래밍/Java 2007. 11. 27. 13:48 Posted by galad


/******************************************************************************
*   파일      : URLConnectionOutput.java
*   용도      : URLConnectionOutput test
*   작성자   : 성홍제
*   작성일   : 2006. 08. 07
*   Version : 1.0
******************************************************************************/

import java.net.*;
import java.io.*;

public class URLConnectionOutput
{
    public static void main(String[] args)
    {
        try
        {
            URL url = new URL("http://search.empas.com/search/all.html");
            URLConnection conn = url.openConnection();
           
            // URLConnection 개체가 output도 가능하게 하겠다는 설정
            conn.setDoOutput(true);
           
            System.out.println("검색어를 입력하세요:");
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String strKeyword = br.readLine();
           
            OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
            wr.write("a=w&s=&f=&z=A&q="+URLEncoder.encode(strKeyword,"euc-kr"));
            wr.flush();
            wr.close();
           
            String line=null;
            br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            PrintWriter pw = new PrintWriter(new FileWriter("result.html"));
           
            while ((line = br.readLine()) != null)
            {
                System.out.println(line);
                pw.println(line);
            }
       
            pw.close();
            br.close();           
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}


★ URLEncoder,URLDecoder

① URLEncoder클래스
데이터를 웹서버에서 요구하는 데이터 형식으로 바꾸어 줌
 (x-www-form-urlencoded 형식)


변환규칙
아스키문자(a~z, A~Z, 1~9), ‘,’, ‘-’, ‘*’, ‘_’ : 그대로 전달
공백문자 : ‘+’기호로 전환
기타문자 : ‘%xy’ 같은 형식으로 변환(xy: ASCII코드를 16진수화한 결과)


하나의 static 멤버 메서드를 갖음
  public static String encode(String s)  Deprecated.
  public static String encode(String s,String charset. )


② URLDecoder클래스
X-www-form-urlencoded 형식으로 인코딩된 데이터를 디코딩


하나의 static 멤버메서드를 갖음
Public static String decode(String d)



/******************************************************************************
*   파일      : URLEnDecoderTest.java
*   용도      : URLEnDecoderTest test
*   작성자   : 성홍제
*   작성일   : 2006. 08. 07
*   Version : 1.0
******************************************************************************/

import java.net.*;

public class URLEnDecoderTest
{
    public static void main(String [] args) throws Exception
    {
        String str, encodedStr, decodedStr;
       
        str = "우리가 사랑하는 모든 사람";
       
        // euc-kr로 인코딩
        encodedStr = URLEncoder.encode(str,"euc-kr");
        decodedStr = URLDecoder.decode(encodedStr,"euc-kr");
       
        System.out.println("str  :  " + str);
        System.out.println("encodedStr  :  " + encodedStr);
        System.out.println("decodedStr  :  " + decodedStr);
    }
}



★ 포트(Port)

 포트 : 하나의 주소에서 동시 작업, 여러 서비스 이용 용이
 0~1023 사이의 포트는 시스템에 예약
 사용자가 임의의 사용 포트 :1024~65535까지의 포트
 미리 할당되어 있는 포트

하나의 포트는 하나의 프로그램만이 사용가능.

동시에 2개 이상의 프로그램이 같은 포트를 사용하려하면 충돌이 발생.


★ 소켓(Socket)

① 상호 통신을 위해 사용되는 일시적인 객체
② 통신을 하기 위해 사용되는 TCP 계층
  소켓 & 포트 : 두 개의 프로그램이 하부 네트워크에 신경 쓰지 않고 통신하기 위한

    소프트웨어적인 메커니즘(mechanism)
③ 두 개의 프로그램 사이에 통신을 위한 채널이 형성
  양방향 통신이 이루짐
  서버 :  자신의 포트 번호로 요청 대기(listen) => 요청 확인(accept) => 해당 서비스 수행
④ 소켓의 기본적인 일
  원격기계에 접속
  데이터를 보냄
  연결끊음
  포트에 바인드
  들어오는 데이터에 귀를 기울임
  바인드된 포트를 통해 들어오는 원격 기계 접속요청 받음   
⑤ 가상회선 마련  : 포트와 소켓 이용
  TCP의 연결기반 서비스를 제공 
  각 TCP 애플리케이션은 고유한 포트번호를 가진 포트를 가짐. 
  가상회선을 확보 
  TCP 층은 소켓들을 마련하고 있다가, 그 소켓을 통해 들어온 요청을 전달할 표적 애플리케이션의 포트에 연결.  

   1. 서버 :  4444번 포트에 대해  계속 클라이언트의 요청대기(Listen)
   2. 클라이언트 : 4444번 포트를 통해 서버로 서비스 요청.
   3. 서버 / 클라이언트 프로그램은 각각이 사용하는 포트(소켓)을 연결
       => 하나의 논리적인 채널을 생성
   4. 서버:  결과를 클라이언트가 사용하는 포트(예에서는1234)를 통해 전달


/******************************************************************************
*   파일      : EchoServer.java
*   용도      : EchoServer test
*   작성자   : 성홍제
*   작성일   : 2006. 08. 07
*   Version : 1.0
******************************************************************************/

import java.net.*;  
import java.io.*;  
   
public class EchoServer
{  
   
    public static void main(String[] args)
    {
        ServerSocket server = null;
        Socket sock = null;
        BufferedReader br = null;
        PrintWriter pw = null;
       
        try
        {
            // 서버 소켓 생성 - 서버가 사용할 포트 번호
            server = new ServerSocket(10001);
           
            while(true)
            {
                System.out.println("접속을 기다립니다.");
               
                // 클라이언트의 접속을 기다린다. 접속한 후에 다음 라인으로 넘어간다.
                sock = server.accept();
               
                // 접속한 컴퓨터의 IP주소를 얻는다. - 소켓에 모든 정보가 들어있다.
                InetAddress inetaddr = sock.getInetAddress();
                System.out.println(inetaddr.getHostAddress() + " 로 부터 접속하였습니다.");
               
                // 역시 소켓에서 Input, OutputStream을 얻어온다.
                InputStream in = sock.getInputStream();
                OutputStream out = sock.getOutputStream();
               
                br = new BufferedReader(new InputStreamReader(in));
                pw = new PrintWriter(new OutputStreamWriter(out));           
               
                String line = null;
               
                // 한줄씩 읽어와서
                while((line = br.readLine()) != null)
                {  
                    // 화면에 출력하고
                    System.out.println("클라이언트로 부터 전송받은 문자열 : " + line);
                   
                    // 다시 그대로 클라이언트에 돌려준다.
                    pw.println(line);
                    pw.flush();
                }  
            }
        }

        catch(SocketException e) // 클라이언트가 강제 종료 시 서버에서 예외 발생하는 것을 처리
        {           
            System.out.println("클라이언트 강제 종료");
        }
        catch(Exception e)
        {  
            //System.out.println(e);
            e.printStackTrace();
        }
        finally
        {
            try
            {
                // 소켓 닫기 전에 먼저 스트림부터 닫는다.               
                pw.close();
                br.close();
                sock.close();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
    } // main  
}    



/******************************************************************************
*   파일      : EchoClient.java
*   용도      : EchoClient test
*   작성자   : 성홍제
*   작성일   : 2006. 08. 07
*   Version : 1.0
******************************************************************************/

import java.net.*;    
import java.io.*;    
   
public class EchoClient
{    
   
    public static void main(String[] args)
    {  
        Socket sock = null;
        BufferedReader keyboard = null;
        PrintWriter pw = null;
        BufferedReader br = null;
       
        try
        {
            // 클라이언트 소켓 생성 - 서버의 IP주소와 서버 프로그램의 포트번호

            // 생성과 동시에 연결한다.
            sock = new Socket("61.109.232.156", 10001);
           
            keyboard = new BufferedReader(new InputStreamReader(System.in));
           
            pw = new PrintWriter(new OutputStreamWriter(sock.getOutputStream()));
            br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
           
            String line = null;
           
            // 키보드로부터 메시지 입력 받음.
            while((line = keyboard.readLine()) != null)
            {
                if(line.toLowerCase().equals("quit"))
                    break;
               
                // 서버로 보낸다.
                pw.println(line);
                pw.flush();
               
                // 서버에서 되돌려보낸 문자열을 읽는다.
                String echo = br.readLine();
                System.out.println("서버 로부터 전달받은 문자열 :" + echo);
            }
        }
        catch(Exception e)
        {  
            System.out.println(e);
        }
        finally
        {
            try
            {
                br.close();
                pw.close();
                sock.close();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
    } // main  
}    



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

04 UDP  (0) 2007.11.27
03 졸려....  (0) 2007.11.27
01 Network 첫시간...  (0) 2007.11.27
05 문자 단위 입출력  (0) 2007.11.27
04 ObjectOutputStream / ObjectInputStream 클래스  (0) 2007.11.27

01 Network 첫시간...

프로그래밍/Java 2007. 11. 27. 13:44 Posted by galad

★ 네트워크 용어

① IP
Internet protocol (인터넷 : 전 세계적 TCP/IP프로토콜)
다양한 기기들간의 통신을 지원
② IP 주소
인터넷에서 하나 이상의 웹사이트에 보유된 서버에 부여된 유일한 주소
x.x.x.x 의 형태(여기서 x는 1 바이트 총 4바이트로 구성)
192.108.0.106 의 형태
③ TCP
Transfer Control Protocol
IP의 상위에 존재하는 접속기반의 전송 프로토콜
전송된 모든 데이터들이 순서대로 목적지에 도착하도록 보장

★ TCP/IP(Transmission Control Protocol / Internet Protocol)
프로토콜 : 네트웍으로 연동되기 위해 상호 연동방법을 정의한 규약
인터넷의 표준 프로토콜
4개의 기능 계층으로 구성 : 대부분의 통신 응응 프로그램들은 응용 계층에서 사용

★ TCP와 UDP
전달계층은 크게 TCP와 UDP로 구분된다
패킷(packet) 단위로 전송
① TCP
연결성 통신 방식(전화)
신뢰성 보장
TELNET, HTTP, FTP 등
② UDP
비연결성 통신 방식(편지)
모든 패킷이 목적지의 주소를 가진다
신뢰성이 낮다
TCP 보다 네트웍 부하가 덜하다
PING 등


★ 소켓(socket)
컴퓨터가 연결된 컴퓨터의 끝점(전기의 소켓과 유사한 개념)
정보 송신 : 소켓에 보낼 정보를 Write
정보 수신 : 소켓으로부터 정보를 Read
TCP/IP 소켓
TCP 소켓
UDP 소켓


★ 포트(port)
하나의 컴퓨터에서 다수개의 네트웍 관련 프로그램을 서로 다른 포트를 사용하여 동시에 실행시킬 수 있다(실제 네트웍 라인은 하나)
논리적인 개념
포트 번호로 16비트 사용
예 : 203.233.51.44:8088


★ 자바 : 네트워크를 손쉽게 연결하는 도구, 네트워크 그 자체
통신을 구현하는 까다로운 부분이 이미 구현되어 있음
필요한 부분을 호출하여 통신 프로그램 개발

자바 네트워크의 구성
스트림기반 I/O 클래스 + java.net패키지 클래스

 
 
★ InetAddress 클래스
IP주소를 표현하고 제어하는 기능을 제공하는 클래스
Host Name자체를 가지고 주소를 표현해 그에 관련된 기능을 제공
인스턴스 생성법
생성자 메서드가 없다
다음의 static메서드를 사용하여 인스턴스를 생성한다.
public static InetAddress getByName(String host) throws UnknownHostException
(호스트의 이름(www.jabook.org) 또는 주소(192.108.0.106 )로 InetAddress객체 반환)
public static InetAddress getLocalHost() throws UnknownHostException
(로컬 컴퓨터에 대한 InetAddress객체 반환.  방화벽으로 가려진경우 127.0.0.1)
public static InetAddress[] getAllByName(String host) throws UnknownException
(호스트에 대한 모든 IP주소를  InetAddress객체 배열로 반환)

 


/******************************************************************************
*   파일      : INetAddressTest.java
*   용도      : INetAddress class test
*   작성자   : 성홍제
*   작성일   : 2006. 08. 04
*   Version : 1.0
******************************************************************************/

import java.net.*;
import java.io.*;

public class INetAddressTest
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        InetAddress myIp = null;
        InetAddress[] myIp2 = null;
        System.out.println("IP를 알고 싶은 사이트 주소를 입력해 주세요");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       
        String strAddress = null;
       
        try
        {
            while(!(strAddress = br.readLine()).equals("stop"))
            {
                try
                {
                    //myIp = InetAddress.getByName(strAddress);
                    myIp2 = InetAddress.getAllByName(strAddress);
               
                    //System.out.println("호스트 이름: " + myIp.getHostName());
                    //System.out.println("호스트 주소: " + myIp.getHostAddress());
                    //System.out.println("toStrinjg(): " + myIp.toString());
                    //System.out.println("로컬 호스트: " + myIp.getLocalHost());
   
                    System.out.println("호스트 이름: " + myIp2[0].getHostName());
                   
                    for(int i = 0; i < myIp2.length; i++)
                    {
                        System.out.println("호스트 주소: " + myIp2[i].getHostAddress());
                        System.out.println("toString(): " + myIp2[i].toString());
                        System.out.println("로컬 호스트: " + myIp2[i].getLocalHost());
                    }
                }
                catch(UnknownHostException e)
                {
                    System.out.println("잘못된 주소입니다. 다시 입력해주세요");
                }
            }
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally
        {
            try
            {
                br.close();
            }
            catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

}


★ URL 클래스

URL(Uniform Resource Locator) : 인터넷상의 자원에 대한 고유한 주소


protocol://hostname[:port]/path/filename#section 의 형태

ex)  http://www.jabook.org:8080/web/test.html#test1


프로토콜(protocol) : 자원에 접근하기 위해 사용되는 프로토콜
호스트 이름(HostName) : 접근하고자 하는 자원이 있는 위치
포트(Port) : TCP 연결에 대한 포트 번호. 생략시 기본포트번호 사용
 (Echo:7 DayTime:13 FTP:21 Telnet:23 SMPT:25 HTTP:80)
경로명(Path) : 접근하려는 파일이 있는 위치
파일명(File) : 접근하려는 파일


웹상의 주소(URL) 그 자체를 나타내는 클래스
웹상에 존재하는 자원에 접근하거나 유일한 주소를 나타내기 위해 사용됨
InetAddress클래스보다 확장된 개념 : 네트웍 연결까지 가능


URL클래스 객체 생성
  URL url = new URL(protocol:resource);

  URL url = new URL(String protocol, String host, String file);


주요 멤버메서드
public String getFile() : URL파일명 리턴
public String getHost() : URL의 호스트명 리턴
public int getPort() : URL포트번호 리턴
public Strimg getProtocol (): URL의 프로토콜 리턴


★ URL클래스로 페이지를 다운받아 확인하기 위한 절차
① URL객체 생성
 URL home = new URL(“http://www.jabook.org:80/index.html”);
② URL객체로의 스트림 열기
InputStream in = url.openStream();
③ 받는 스트림을 버퍼에 저정
BufferedReader br = new BufferedReader( new InputStreamReader(in));
④ 버퍼를 화면에 출력하고 스트림 닫기
BufferedReader br;
URL home = new URL(“http://www.jabook.org:80/index.html”);
br = new BufferedReader(new InputStreamReader(home.openStream()));
while ((line = br.readLine()) != null)

{
    System.out.println(line);
}
br.close();



/******************************************************************************
*   파일      : URLTest.java
*   용도      : URLTest
*   작성자   : 성홍제
*   작성일   : 2006. 08. 04
*   Version : 1.0
******************************************************************************/

import java.net.*;
import java.io.*;

public class URLTest
{
    public static void main(String args[])
    {
        try
        {
            // URL 클래스를 이용하여 웹에 접속
            System.out.println("저장하고 싶은 웹페이지를 입력하세요.");
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
           
            // 주소 입력 시, 페이지 파일명 - index.html이라든지 - 까지 입력해주어야 한다.
            String strUrl = br.readLine();
            URL home  = new URL("http://" + strUrl);
           
            // 접속한 웹으로부터 입력 스트림을 생성한다.
            PrintWriter pw = null;
            String line = null;
           
            System.out.println("Port: "+home.getPort());
            System.out.println("Protocol: "+home.getProtocol());
            System.out.println("HostName: "+home.getHost());
            System.out.println("FileName: "+home.getPath());
            System.out.println("File: "+home.getFile());
            System.out.println("Ref: "+home.getRef());
           
            // URL과의 스트림 생성
            br = new BufferedReader(new InputStreamReader(home.openStream()));
           
            // getFile() 하면 파일명 앞에 '/'가 하나 붙으므로 그걸 제거한다.
            String fileName = "d:\\" + home.getFile().substring(1, home.getFile().length());
            pw = new PrintWriter(new FileWriter(fileName));
           
            while ((line = br.readLine()) != null)
            {
                //System.out.println(line);
                pw.println(line);
            }
           
            System.out.println("웹페이지를 "+fileName+"에 모두 저장하였습니다.");
           
            br.close();
            pw.close();
           
        }
        catch (Exception e)
        {
            //System.out.println("Exception: " + e);
            e.printStackTrace();
        }
    }
}

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

03 졸려....  (0) 2007.11.27
02 2일째....  (0) 2007.11.27
05 문자 단위 입출력  (0) 2007.11.27
04 ObjectOutputStream / ObjectInputStream 클래스  (0) 2007.11.27
05 3일째...  (0) 2007.11.27

05 문자 단위 입출력

프로그래밍/Java 2007. 11. 27. 13:31 Posted by galad

/******************************************************************************
*   파일      : FileReaderWriter.java
*   용도      : FileReaderWriter
*   작성자   : 성홍제
*   작성일   : 2006. 08. 03
*   Version : 1.0
******************************************************************************/

import java.io.*;

public class FileReaderWriter
{
    /// Fields
    /// Costructor
    /// Method
    /// Main Method
    public static void main(String[] args) throws IOException, FileNotFoundException
    {  
        if(args.length<2)
        {
            System.out.println("원본 파일과 복사될 파일의 이름을 입력 하십시오!");
            System.exit(-1);
        }
       
        int i = 0, len = 0;
       
        System.out.println("복사할 원본: "+args[0]);
        System.out.println("복사할 대상: "+args[1]);
       
        FileReader in = new FileReader(new File(args[0]));
        BufferedReader br = new BufferedReader(in);
       
        FileWriter out = new FileWriter(args[1], false);
        BufferedWriter bout = new BufferedWriter(out);
        PrintWriter pout = new PrintWriter(out);   

        // 출력 시 편리한 클래스. 버퍼도 자체 내장하고 있다.
       
        char[] buffer = new char[256];  // Buffered- 를 사용하지 않고 이렇게 사용해도 되지만
                                                     // Buffered- 를 사용하는 것이 더 빠른다.
       
        String line = "";
         
        while((line = br.readLine()) != null)
        {
            i++;
            //bout.write(line+"\r\n");  // 끝에 줄바꿈 문자를 추가
           
            if(i < 10)
            {
                //bout.write(line+"\n");  // 끝에 줄바꿈 문자를 추가
                pout.println("0" + i + " " + line);     // 자동으로 끝에 줄바꿈 문자를 추가한다.
                System.out.println("0" + i + " " + line);
            }
            else
            {
                //bout.write(line+"\n");  // 끝에 줄바꿈 문자를 추가
                pout.println("" + i + " " + line);     // 자동으로 끝에 줄바꿈 문자를 추가한다.
                System.out.println("" + i + " " + line);               
            }
        }
       
        br.close();
        bout.close();
        in.close();
        out.close();
        System.out.println(len + " bytes are copied...Successfully!");
    }
}




/******************************************************************************
*   파일      : InputStreamReaderTest.java
*   용도      : InputStreamReaderTest
*   작성자   : 성홍제
*   작성일   : 2006. 08. 03
*   Version : 1.0
******************************************************************************/

import java.io.*;
import java.util.*;

public class InputStreamReaderTest
{
    public static void main(String[] args) throws java.io.IOException
    {
        String s, str;
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);
        Vector v = new Vector();
       
        PrintWriter pout = new PrintWriter(new FileWriter("d:\\test2.txt"));
   
        System.out.println("내용을 입력해~" );
       
        while((s = br.readLine()) != null)
        {
            if( s.equals("stop"))
            {
                break;
            }
           
            System.out.println("Read : "  + s);
            //pout.println("Read : "+s);
            v.add(s);
        }
       
        System.out.print("저장할래?(Y or N) >> ");
        s = br.readLine();
        System.out.println();
       
        if(s.equals("Y") || s.equals("y"))
        {
            for(int i = 0; i < v.size(); i++)
            {
                str = (String)v.get(i);
                pout.println(str);
            }
           
            System.out.println("저장했으~ d:\\test2.txt에" );
        }
       
        pout.close();
        br.close();
    }
}




/*******************************************************************************************
*   파일      : ChattFrame.java
*   용도      : 채팅 창 예제
*   작성자   : 성홍제
*   작성일   : 2006. 08. 03
*   Version : 1.0
*******************************************************************************************/

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;

public class ChatSave extends Frame implements ActionListener
{
    // Fields  
    private TextArea    ta = new TextArea();
    private TextField   tf = new TextField();
    private Button      submit = new Button("전송");
    private Vector v = new Vector();
    private ChatSave cs = null;
    private String fileName = "d:\\Test3.txt";

    // Constructor
    public ChatSave(String title)
    {
        super(title);
        cs = this;
        this.init();
       
        this.setSize(640, 480);
        this.setResizable(false);   // 리사이즈 막기
        //this.pack();

        // 화면 중앙에 위치 시키기
        Toolkit tk = Toolkit.getDefaultToolkit();
        Dimension di = tk.getScreenSize();
        Dimension di1 = this.getSize();
        this.setLocation((int)(di.getWidth() / 2 - di1.getWidth() / 2), (int)(di.getHeight() / 2 - di1.getHeight() / 2));

        this.setVisible(true);

        // Events
        this.addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                // 다이얼로그
                new DialogTest(cs, "저장할래?", true);
                System.exit(0);
            }
        });
       
        tf.addActionListener(this);
        submit.addActionListener(this);

        // Focus
        tf.requestFocus();
    }

    // Methods
    /*************************************************
    * Purpose      : 초기화
    * Return           : void
    * Parameter    : none
    *************************************************/
    private void init()
    {
        this.setLayout(new BorderLayout());

        // South
        Panel p = new Panel(new BorderLayout());
        p.add("Center", tf);
        p.add("East", submit);

        ta.setEditable(false);

        this.add("Center", ta);
        this.add("South", p);  
    }

    public void actionPerformed(ActionEvent ae)
    {
        Object obj = ae.getSource();
       
        if(obj == tf || obj == submit)
        {
            //String str = tf.getText() + "\n\r";
            String str = tf.getText();
            tf.setText("");
           
            // 벡터에 저장
            v.add(str);
   
            ta.append(str + "\n\r");
           
            tf.requestFocus();
        }       
    }
   
    /*************************************************
     * Purpose      : 대화 내용을 저장한다
     * Return        : void
     * Parameter   : none
     *************************************************/
    public void saveFile()
    {
        try
        {
            PrintWriter pout = new PrintWriter(new FileWriter(fileName));
       
            String str;
           
            for(int i = 0; i < v.size(); i++)
            {
                str = (String)v.get(i);
                pout.println(str);
            }
           
            System.out.println("저장했으~ " + fileName +"에" );
           
            pout.close();
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    // Main
    public static void main( String[] args )
    {
        ChatSave cf = new ChatSave( "채팅창" );
   
    }// public static void main( String[] args )
}// public class ChattFrame extends Frame

class DialogTest extends Dialog implements ActionListener
{
    // Fields
    Frame       parent;
    Dialog      d;
    Button  btYes = new Button("YES");
    Button  btNo = new Button("NO");
    Label       lb = new Label("저장할래?");

    // Constructor
    public DialogTest(Frame parent, String title, boolean modal)
    {
        super(parent, title, modal);
        this.parent = parent;
        d = this;

        init();
        start();

        this.pack();
        this.setLocation(300, 200);

        this.setVisible(true);
    }

    // Methods
    private void init()
    {
        this.add("North", lb);      

        Panel p = new Panel(new FlowLayout());
        p.add(btYes);
        p.add(btNo);

        this.add("Center", p);
    }

    private void start()
    {
        this.addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent we)
            {
                //System.out.println(we);
                d.dispose();
            }
        });
       
        btYes.addActionListener(this);
        btNo.addActionListener(this);
    }

    public void actionPerformed(ActionEvent ae)
    {
        //this.dispose();
       
        Object obj = ae.getSource();
       
        if(obj == btYes)
        {
            ChatSave cs = (ChatSave)this.parent;
            cs.saveFile();
            d.dispose();
        }
        else if(obj == btNo)
        {
            d.dispose();
        }
    }

    // Main

}// public class DialogTest extends Dialog

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

02 2일째....  (0) 2007.11.27
01 Network 첫시간...  (0) 2007.11.27
04 ObjectOutputStream / ObjectInputStream 클래스  (0) 2007.11.27
05 3일째...  (0) 2007.11.27
04 입출력  (0) 2007.11.27

★ ObjectOutputStream / ObjectInputStream 클래스

자바에서 객체 단위의 입출력하기 위한 ObjectOutputStream 클래스와 ObjectInputStream 클래스를 제공


파일이나 DB에 객체를 저장하거나 읽을 수 있고, 네트워크를 통해서 객체를 송 수신 할 수 있다


객체를 입출력 할 때는 직렬화(Serialization)된 데이터를 사용


직렬화된 데이터 : 객체를 순차적인 바이트로 표현한 데이터


객체를 직렬화된 데이터로 표현함으로서 객체의 영속성(Object Persistence)을 보장


영속성 : 객체가 자신의 상태를 기록해 두어 다음 기회에 또는 다른 환경에서 재생될 수 있는 능력을 의미한다


★ ObjectOutputStream 클래스 : 자바의 기본 자료형과 객체를 직렬화된 데이터로 저장하기 위해 사용되는 클래스


생성자
 ObjectOutputStream(OutputStream outputStream)


★ ObjectOutputStream 클래스의 주요 메소드
void close()     스트림을 닫는다.
void flush()     버퍼의 모든 내용을 출력한다
void wrie(byte[] b, index,int size)  바이트 배열 b의 index 위치부터 size int 만큼을 출력한다
void write(byte[] b)    바이트 배열 b를 출력한다
void write(int ontbyte)    int 값의 하위 한 바이트를 출력한다
void writeBoolean(boolean data)  boolean 값을 출력한다
void writeByte(int data)   한 바이트를 출력한다
void writeBytes(String str)  str 문자열을 연속된 바이트로 출력한다
void writeChar(int data)   한 문자를 출력한다
void writeChars(String str)  str 문자열을 연속된 문자로 출력한다
void writeDouble(double data)  double 값을 출력한다
void writeFloat(float data)  float 값을 출력한다
void writeInt(int data)   int 값을 출력한다
void writeLong(long data)  long 값을 출력한다
void writeObject(Object obj) 객체를 출력한다
void writeShort(int data)  short 값을 출력한다
void writeUTF(String data)  문자열을 UTF 인코딩으로 출력한다

★ ObjectInputStream 클래스 : 직렬화된 데이터로부터 역직렬화(Deserialization)를 수행하여 원래의 데이터로 복구하는 기능을 제공


생성자
 ObjectInputStream(InputStream inputStream)


★ ObjectInputStream 클래스의 주요 메소드
 void close()    스트림을 닫는다
 int read()     한 바이트를 읽는다
 int read(byte[] b, int off, int len)   바이트 배열로 읽어 들인다
 boolean readBoolean()    boolean 값을 읽는다
 byte readByte()    한 바이트를 읽는다
 char readChar()    문자를 읽는다
double readDouble()   double 값을 읽는다
float readFloat()   float 값을 읽는다
int readInt()    int 값을 읽는다
long readLong()    long값을 읽는다
Object readObject()   객체를 읽는다
short readShort()   short 값을 읽는다
int readUnsignedByte()  부호 없는 바이트 값을 읽는다
int readUnsignedShort()   부호 없는 short 값을 읽는다
String readUTF()   UTF 인코딩을 읽어서 문자열 타입으로  반환

 

/******************************************************************************
*   파일      : ObjectPersistenceWrite.java
*   용도      : ObjectPersistenceWrite
*   작성자   : 성홍제
*   작성일   : 2006. 08. 02
*   Version : 1.0
******************************************************************************/
package FileIO;
import java.util.*;
import java.io.*;
public class ObjectPersistenceWrite
{
    /// Fields
    Date s_date;
    ObjectOutputStream objectout;
   
    /// Constructor
    public ObjectPersistenceWrite()
    {
        s_date = new Date();  // 생성자에서 날짜 객체를 생성
        objectout = null;
    }
   
    /// Method
    public void write(String f_name)
    {
        try
        {
            FileOutputStream f_out = new FileOutputStream(f_name);
            // 파일에 저장하기 위해 파일 출력 스트림 객체 생성
            objectout =new ObjectOutputStream(f_out);
            // 객체를 파일에 출력하기 위한 스트림 객체 생성
            System.out.println("직렬화된 데이터로 저장된 Date 객체 : "+ s_date);
            objectout.writeObject(s_date);
            // writeOjbect() 메소드를 이용하여 Date 객체를 직렬화된 데이터로
            // 파일에 저장                
            objectout.close();
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
   
    /// Main Method
    public static void main(String args[])
    {
        ObjectPersistenceWrite od = new ObjectPersistenceWrite();
        od.write("d:/s_data.dat");    
    }
}
 
 

/******************************************************************************
*   파일      : ObjectPersistenceRead.java
*   용도      : ObjectPersistenceRead
*   작성자   : 성홍제
*   작성일   : 2006. 08. 02
*   Version : 1.0
******************************************************************************/
package FileIO;
import java.util.*;
import java.io.*;
public class ObjectPersistenceRead
{
    Date s_date;
    Date new_date;
    ObjectInputStream objectin;
     
    public ObjectPersistenceRead()
    {
        new_date = new Date();
        objectin = null;
    }
     
    public void read(String f_name)
    {
        try
        {
            FileInputStream f_in = new FileInputStream(f_name);
            // 직렬화된 데이터 파일로부터 데이터를 읽기 위한 스트림 객체 생성
            objectin = new ObjectInputStream(f_in);                  
            s_date = (Date)objectin.readObject();   // 객체를 읽어 Date 타입으로 형 변환
            System.out.println("직렬화된 데이터로부터 읽은 Date 객체 : " + s_date);
            System.out.println("현재 시점에서 생성된 Date 객체 : " + new_date);
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
        catch(ClassNotFoundException nfe)
        {
            nfe.printStackTrace();
        }
    }
     
    public static void main(String args[])
    {
        ObjectPersistenceRead id = new ObjectPersistenceRead();
        id.read("./s_data.dat");           // 직렬화된 파일로부터 읽는다
    }
}

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

01 Network 첫시간...  (0) 2007.11.27
05 문자 단위 입출력  (0) 2007.11.27
05 3일째...  (0) 2007.11.27
04 입출력  (0) 2007.11.27
03 임시파일  (0) 2007.11.27

05 3일째...

프로그래밍/Java 2007. 11. 27. 13:29 Posted by galad

★ BufferedOutputStream / BufferedInputStream 클래스

이 두개의 클래스는 FilterOutputStream, FilterInputStream 클래스로부터 상속된 클래스이다


① BufferedOutputStream 클래스
버퍼를 사용하여 스트림을 출력
생성자
  BufferedOutputStream(OutputStream outputStream)
  BufferedOutputStream(OutputStream outputStream, int bufSize)


② BufferedInputStream 클래스
버퍼를 사용하여 스트림을 입력
생성자
  BufferedInputStream(InputStream inputStream)
  BufferedInputStream(InputStream inputStream, int bufSize)

통신의 효율을 높이기 위해 버퍼링(Buffering)을 사용



/******************************************************************************
*   파일      : BufferedStreamTest.java
*   용도      : BufferedStreamTest
*   작성자   : 성홍제
*   작성일   : 2006. 08. 02
*   Version : 1.0
******************************************************************************/

package FileIO;

import java.io.*;

public class  BufferedStreamTest
{
    // Fields
    // Constructor
    // Method
    // Main Method
    public static void main(String [] args) throws Exception
    {
        if(args.length < 2)
        {
            System.out.println("원본 파일과 복사될 파일의 이름을 입력하십시요!");
            System.exit(-1);
        }
       
        // 화면 버퍼 테스트
        System.out.write(55);   // 화면에 바로 출력하는 게 아니라 화면 출력용 버퍼에 55,

                                        // 즉 "7"을 출력한다.
                                        // 근데 이것만으로는 화면 출력용 버퍼가 충분이 차지 않으므로

                                        // 화면에 내용이 출력되지 않는다.
        System.out.flush();      // 그래서 flush()를 이용해서 버퍼의 내용을 강제적으로 출력한다.
                                        // close()를 할 때로 출력하지만, 여기서는 아직 화면 출력을

                                        // 다 끝낸 것이 아니므로 flush()를 사용.
       
        FileInputStream fin = new FileInputStream(args[0]);
        FileOutputStream fout = new FileOutputStream(args[1]);
       
        BufferedInputStream in = new BufferedInputStream(fin);
        BufferedOutputStream out = new BufferedOutputStream(fout);
       
        //BufferedInputStream in = new BufferedInputStream(new FileInputStream(args[0]));
        //BufferedOutputStream out

        //      = new BufferedOutputStream(new FileOutputStream(args[1]));
       
        int s1=0;
        byte[] buf = new byte[1024];
       
        //while((s1 = in.read()) != -1)
        while((s1 = in.read(buf)) != -1)
        {
            //out.write(buf, 0, s1);    // 파일출력
            System.out.write(buf, 0, s1);   // 화면출력           
            //System.out.write(s1);   // 화면출력 - 하나씩 할 때
        }
       
        fin.close();
        fout.close();
       
        in.close();
        out.close();
       
        System.out.println("");
        System.out.println("Copied...Successfully!");
    }
}



★ DataOutputStream / DataInputStream 클래스

이 클래스들은 자바의 기본 자료형 데이터(Primitive Type)를 바이트 스트림으로 입출력하는 기능을 제공
① DataOutputStream
FilterOutputStream 클래스로부터 상속되었고, DataOutput 인터페이스를 사용한 클래스
기본 자료형 데이터를 바이트 스트림으로 출력
생성자
  DataOutputStream(OutputStream outputStream)
② DataInputStream
FilterInputStream 클래스로부터 상속되었고, DataInput 인터페이스를 사용한 클래스
바이트 스트림으로부터 자바의 기본 자료형 데이터를 입력
생성자
  DataInputStream(InputStream inputStream)

★ DataOutput 인터페이스에 선언된 메소드
void write(int i) throws IOException   i를 스트림으로 출력
void write(byte buffer[]) throws IOException     buffer를 스트림으로 출력
void write(byte buffer[], int index, int size)  buffer의 index위치부터 size 만큼의
          throws IOException                        바이트를 스트림으로 출력
void writeBoolean(boolean b)    b를 스트림으로 출력
          throws IOException
void writeByte(int i) throws IOException       i의 하위 8비트를 스트림으로 출력
void writeBytes(String s) throws IOException     문자열 s를 스트림으로 출력
void writeChar(int i) throws IOException        i의 하위 16비트를 스트림으로 출력
void writeChars(String s) throws IOException     문자열 s를 스트림으로 출력
void writeDouble(double d) throws IOException   d를 스트림으로 출력
void writeFloat(float f) throws IOException        f를 스트림으로 출력
void writeInt(int i) throws IOException           i를 스트림으로 출력
void writeLong(long l) throws IOException    l을 스트림으로 출력
void writeShort(short s) throws IOException  s를 스트림으로 출력
void writeUTF(String s) throws IOException    s를 스트림으로 출력. 유니코드를
                                                               UTF-8 엔코딩을 이용하여 변환
★ DataInput 인터페이스에 선언된 메소드
boolean readBoolean(boolean b)   스트림으로부터 읽은 boolean을 반환
         throws IOException 
byte readByte() throws IOException     스트림으로부터 읽은 byte를 반환
char readChar() throws IOException     스트림으로부터 읽은 char를 반환
double readDouble() throws IOExceptio   스트림으로부터 읽은 double을 반환
float readFloat() throws IOException     스트림으로부터 읽은 float를 반환
long readLong() throws IOException     스트림으로부터 읽은 long을 반환
short readShort() throws IOException    스트림으로부터 읽은 short를 반환
int readInt() throws IOException        스트림으로부터 읽은 int를 반환
void readFully(byte buffer[])    스트림으로부터 buffer 크기 만큼의 바이트를

      throws IOException                읽어 buffer 배열에 저장
void readfully(byte buffer[],int index, int size) 스트림으로부터 size 만큼의 바이트를 읽어

         throws IOException                             buffer의 index 위치에 저장
int readUnsignedByte() throws IOException  스트림으로부터 읽은unsigned byte를 반환
int readUnsignedShort() throws IOException 스트림으로부터 읽은unsigned short를 반환
int skipBytes(int n)    입력 스트림으로부터 n 바이트를 스킵



/******************************************************************************
*   파일      : DataIOApp.java
*   용도      : DataIOApp
*   작성자   : 성홍제
*   작성일   : 2006. 08. 01
*   Version : 1.0
******************************************************************************/

package FileIO;

import java.io.*;

public class DataIOApp
{
    public static void main(String args[]) throws IOException
    {
        File file = new File("d:\\test.txt");
        FileOutputStream outFile = new FileOutputStream(file);
        DataOutputStream outStream = new DataOutputStream(outFile);
       
        outStream.writeBoolean(true);   // 파일에 기본형을 출력
        outStream.writeInt(12345);
        outStream.writeChar('K');
        outStream.writeDouble(3.14);
       
        System.out.println(outStream.size()+" bytes were written");
           
        outStream.close();
        outFile.close();
       
        FileInputStream inFile = new FileInputStream(file);
        DataInputStream inStream = new DataInputStream(inFile);
       
        System.out.println(inStream.readBoolean()); // 위에서 만든 파일로부터 입력 받음
        System.out.println(inStream.readInt());
        System.out.println(inStream.readChar());
        System.out.println(inStream.readDouble());
       
        inStream.close();
        inFile.close();
       
        try
        {
            Thread.sleep(6000);
        }
        catch(Exception e)
        {}
       
        file.delete();
    }
}



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

05 문자 단위 입출력  (0) 2007.11.27
04 ObjectOutputStream / ObjectInputStream 클래스  (0) 2007.11.27
04 입출력  (0) 2007.11.27
03 임시파일  (0) 2007.11.27
02 파일 클래스  (0) 2007.11.27

04 입출력

프로그래밍/Java 2007. 11. 27. 13:29 Posted by galad

★ OutputStream 클래스와 InputStream 클래스
① 바이트 스트림의 입출력에 필요로 되는 다양한 메소드를 제공하는 추상 클래스(개체생성못함)
② OutputStream 클래스 : 바이트 스트림을 출력하는 기능
③ OutputStream 클래스의 주요 메소드

   void close() throws IOException      출력 스트림을 닫는다
   void flush() throws IOException      버퍼에 남아 있는 출력 스트림을      모두 출력
   void write(int i) throws IOException  정수 i의 하위 8비트를 출력
   void write(byte buffer[]) throws IOException    buffer의 내용을 출력


★ InputStream 클래스 : 바이트 스트림으로부터 데이터를 읽어 들인다
InputStream 클래스의 주요 메소드

int available()      현재 읽기 가능한 바이트의 수를 반환
void close()        입력 스트림을 닫는다
int read()            입력 스트림으로부터 한 바이트를 읽어 int
                         값으로 반환한다. 더 이상 읽을 값이 없을 경우 –1을 반환
int read(byte buffer[])     입력 스트림으로부터 buffer[] 크기만큼을 읽어 buffer 배열에

                                    저장하고 읽은 바이트 수를 반환
int read(byte buffer[], int offset, int numBytes)     입력 스트림으로부터 numBytes 만큼을

                                                                     읽어buffer[]의  offset 위치에 저장하고

                                                                      읽은 바이트 수를 반환
int skip(long numBytes)       numBytes로 지정된 바이트를 스킵(skip)하고

                                        스킵된 바이트 수를 반환



/******************************************************************************
*   파일      : InputOutputStreamTest.java
*   용도      : InputOutputStreamTest를 테스트하는 예제
*   작성자   : 성홍제
*   작성일   : 2006. 08. 01
*   Version : 1.0
******************************************************************************/

package FileIO;

import java.io.*;


public class InputOutputStreamTest
{
    // Fields
    // Constructor
    // Method
    // Main Method
    public static void main(String args[]) throws IOException
    {
        System.out.println("아무 글이나 입력하시고 Enter를 쳐주세요");
        System.out.println(" 's'를 입력하면 프로그램이 종료됩니다.");
       
        int ch;
       
        // InputStream은 추상 클래스여서 new로 instance 생성 불가
        InputStream in = System.in;          // 표준 입력 - 키보드
        OutputStream out = System.out;   // 표준 출력 - 모니터
       
        // read()는 '한 문자씩' 입력 받으나, 키보드 버퍼에 저장되어있는 것을

        // while문을 돌면서 차례로 입력받는다.
        while((ch = in.read()) != -1)
        {
            if(ch == 's' || ch == 'S')
                break;
           
            // write()는 일단 화면 버퍼에 출력하고, 화면 버퍼가 어느 정도 차거나

            // 화면에 출력해도 괜찮을 때 출력한다.
            // 따라서 'aaaaas'와 같이 입력해도 'aaaaa'는 화면 버퍼에 있는 상태에서

            // 's'를 만나서 프로그램이 종료되므로
            // 화면에는 아무것도 나오지 않는다.
            out.write(ch);
           
            // 한글은 깨진다. print() 메소드 자체가 한글을 처리하기 위해 가공하므로,
            // 한글 문자 정보의 일부분인 ch가 가공되어 제대로 출력되지 않는다.
            //System.out.print((char)ch);
           
            //System.out.println("Char: "+(char)ch+", Available: "+in.available());
        }
    }
}



/******************************************************************************
*   파일      : FileInputOutputStreamTest.java
*   용도      : FileInputOutputStream을 테스트하는 예제
*   작성자   : 성홍제
*   작성일   : 2006. 08. 01
*   Version : 1.0
******************************************************************************/

package FileIO;

import java.io.*;


public class FileInputOutputStreamTest
{
    // Fields
    // Constructor
    // Method
    // Main Method
    public static void main(String[] args)
    {
        /*if(args.length < 2)
        {
            System.out.println("원본 파일과 복사될 파일의 이름을 입력하십시요!");
            System.exit(-1);
        }*/
       
        BufferedReader brIn = new BufferedReader(new InputStreamReader(System.in));
        String ori = null;
        String copy = null;
       
        System.out.print("원본 파일의 이름을 입력하세요 >> ");
       
        try
        {
            ori = brIn.readLine();
        }
        catch (IOException e2)
        {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
       
        System.out.print("복사될 파일의 이름을 입력하세요 >> ");
       
        try
        {
            copy = brIn.readLine();
        }
        catch (IOException e2)
        {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
       
        int i, len=0;
       
        InputStream in=null;
        OutputStream out=null;
       
        //System.out.println("원본파일 : "+args[0]);
        //System.out.println("목표파일 : "+args[1]);
        System.out.println("원본파일 : " + ori);
        System.out.println("목표파일 : " + copy);       
       
        try
        {
            //in = new FileInputStream(new File(args[0]));
            //out = new FileOutputStream(args[1], true);
            in = new FileInputStream(new File(ori));
           
            // 두번째 true 옵션은 같은 이름의 파일이 있으면 그 파일의 끝에 붙여넣는다.
            out = new FileOutputStream(copy, true);
        }
        catch(FileNotFoundException e)
        {
            System.out.println(e);
        }
        catch(IOException e)
        {
            System.out.println(e);
        }
       
        byte buffer[] = new byte[256];
       
        try
        {
            //while((i=in.read()) != -1)    // 이건 1바이트씩 읽어들이는 것
            while((i=in.read(buffer)) != -1)    // 이건 256 바이트씩?
            {
                out.write(buffer,0,i);
                //System.out.write(buffer,0,i); // 화면에 출력한다.
                len += i;
            }
           
            in.close();
            out.close();
           
            System.out.println(len + " bytes are copied...Successfully!");
        }
        catch(IOException e1)
        {
            System.out.println(e1);
        }
    }
}




/******************************************************************************
*   파일      : FakeXCopy.java
*   용도      : FakeXCopy
*   작성자   : 성홍제
*   작성일   : 2006. 08. 01
*   Version : 1.0
******************************************************************************/

package FileIO;

import java.io.*;


public class FakeXCopy
{
    // Fields
    // Constructor
    // Method
    // Main Method
    public static void main(String[] args)
    {
//        BufferedReader brIn = new BufferedReader(new InputStreamReader(System.in));
        File f = null;
        String ori = null;
        String dest = null;
/*       
        System.out.print("원본 파일의 이름을 입력하세요 >> ");
       
        try
        {
            ori = brIn.readLine();
        }
        catch (IOException e2)
        {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
       
        System.out.print("복사될 파일의 이름을 입력하세요 >> ");
       
        try
        {
            dest = brIn.readLine();
        }
        catch (IOException e2)
        {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
*/       
        ori = "d:\\Test\\";
        dest = "d:\\Test_Test\\";
       
        System.out.println("원본파일 : " + ori);
        System.out.println("목표파일 : " + dest);
       
        f = new File(ori);
       
        if(!f.exists())
        {
            System.out.println("디렉토리가 존재하지 않습니다.");
            System.exit(0);
        }
   
        if(f.isDirectory())
        {
            // 현재 디렉토리의 디렉토리, 파일 리스트
            File[] fileList = f.listFiles();
           
            for(int j = 0; j < fileList.length; j++)
            {
                if(fileList[j].isDirectory())
                {
                    // 디렉토리 체크
                    checkDir(fileList[j], dest);
                }
                else
                {
                    // 파일 복사
                    copyFile(fileList[j], dest);
                }
            }
           
            //checkDir(f, dest);    // 기본 디렉토리까지 복사한다.
        }
    }
   
    public static void copyFile(File file, String str)
    {
        int i, len=0;
        InputStream in=null;
        OutputStream out=null;
       
        // 파일 복사
        try
        { 
            in = new FileInputStream(file);
           
            // 두번째 false 옵션은 같은 이름의 파일이 있으면 덮어쓴다.
            out = new FileOutputStream(str + file.getName(), false);
        }
        catch(FileNotFoundException e)
        {
            System.out.println(e);
        }
        catch(IOException e)
        {
            System.out.println(e);
        }
       
        byte buffer[] = new byte[4096];
       
        try
        {
            //while((i=in.read()) != -1)    // 이건 1바이트씩 읽어들이는 것
            while((i=in.read(buffer)) != -1)    // 이건 4096 바이트씩
            {
                out.write(buffer,0,i);
                //System.out.write(buffer,0,i); // 화면에 출력한다.
                len += i;
            }
           
            System.out.println(len + " bytes are copied...Successfully!");
        }
        catch(IOException e1)
        {
            System.out.println(e1);
        }
        finally
        {
            try
            {
                in.close();
                out.close();
            }
            catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }           
        }
    }
   
    /*************************************************
    * Purpose       : 재귀호출로 디렉토리를 체크한다.
    * Return         : void
    * Parameter    : File file - 체크할 디렉토리, String str - 현재 경로
    *************************************************/
    public static void checkDir(File file, String str)
    {
        // 재귀호출로 현재 디렉토리가 계속 갱신된다. !!!!!
       
        // 목표 디렉토리로 변경
        file.renameTo(new File(str + file.getName() + "\\"));
       
        // 디렉토리 생성
        if(file.mkdirs())
        {
            //System.out.println("디렉토리 생성 성공");
        }
       
        // 디렉토리니까 다시 체크
        File[] fileList = file.listFiles();
       
        for(int j = 0; j < fileList.length; j++)
        {
            if(fileList[j].isDirectory())
            {
                // 디렉토리 체크
                checkDir(fileList[j], str);
            }
            else
            {
                // 파일 복사
                copyFile(fileList[j], str);
            }
        }
    }
}




/******************************************************************************
*   파일      : CopyDir.java
*   용도      : CopyDir - 강사님이 작성한 것
*   작성자   : 김종식
*   작성일   : 2006. 08. 01
*   Version : 1.0
******************************************************************************/

package FileIO;

import java.io.*;

public class CopyDir
{
    /// Fields
    /// Constructor
    /// Method
    public static void copyDirectory(File source , File target) throws IOException
    {
        //디렉토리인 경우
        if (source.isDirectory())
        {
            //복사될 Directory가 없으면 만듭니다.
            if (!target.exists())
            {
                target.mkdir();
            }
           
            String[] children = source.list();
           
            for (int i=0; i<children.length; i++)
            {
                copyDirectory(new File(source, children[i]),new File(target, children[i]));
            }
        }
        else
        {
         //파일인 경우
            InputStream in = new FileInputStream(source);
            OutputStream out = new FileOutputStream(target);
           
            // Copy the bits from instream to outstream
            byte[] buf = new byte[1024];
            int len;
           
            while ((len = in.read(buf)) > 0)
            {
                out.write(buf, 0, len);
            }
           
            in.close();
            out.close();
        }
    }
   
    /// Main Method       
    public static void main(String[] args) throws IOException
    {
        if ( args.length < 2)
        {
            System.out.println("복사할 원본과 대상을 지정하세요.");
            System.exit(-1);
        }
       
        File source = new File(args[0]);
        File target = new File(args[1]);
       
        copyDirectory(source , target);
    }   
}

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

04 ObjectOutputStream / ObjectInputStream 클래스  (0) 2007.11.27
05 3일째...  (0) 2007.11.27
03 임시파일  (0) 2007.11.27
02 파일 클래스  (0) 2007.11.27
01 입출력 개요  (0) 2007.11.27

03 임시파일

프로그래밍/Java 2007. 11. 27. 13:26 Posted by galad

★ 임시파일

임시파일들을 생성하는 기능
임시파일의 사용을 위한 File 클래스의 메소드
   static File createTempFile(String prefix, String suffix)
   static File createTempFile(String prefix, String suffix,File Directory)
   저장할 디렉토리를 지정하지 않으면 시스템의 것사용


사용법
try

{
  File tmp1 = File.createTempFile("~JavaIO",".tmp");
  File tmp2 = File.createTempFile("~javaIO1",".tmp",new File("c:\\tmp"));
  tmp1.deleteOnExit();
  tmp2.deleteOnExit();
}

catch(IOException e)

{}



/******************************************************************************
*   파일      : TempFile.java
*   용도      : TempFile를 테스트하는 예제
*   작성자   : 성홍제
*   작성일   : 2006. 07. 31
*   Version : 1.0
******************************************************************************/

package FileIO;

import java.io.*;


public class TempFile
{
    public static void main(String[] args)
    {
        try
        {
            // 디렉토리를 설정해주지 않았으므로 기본 디렉토리
            // C:\Documents and Settings\Class4--25(자기계정)\Local Settings\Temp

            // 에 생성된다.
            File f = File.createTempFile("tmp_", ".dat");
            System.out.println("60초 동안 멈춰있습니다.");
           
            f.deleteOnExit(); // JVM이 종료될 때 임시파일을 자동으로 삭제한다.
           
            try {
                Thread.sleep(60000);// 60초 동안 프로그램이 멈춰있는다.
            }
            catch (InterruptedException e1)
            {
                System.out.println(e1);
            }
        }
        catch (IOException e)
        {
            System.out.println(e);
        }
    } // main
}


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

05 3일째...  (0) 2007.11.27
04 입출력  (0) 2007.11.27
02 파일 클래스  (0) 2007.11.27
01 입출력 개요  (0) 2007.11.27
[펌] jar 파일 만들기  (0) 2007.11.27

02 파일 클래스

프로그래밍/Java 2007. 11. 27. 13:25 Posted by galad

★ 파일 클래스

   입출력을 위해 필요로 되는 파일과 디렉토리를 다루기 위한 File 클래스 제공


★ Constructor Summary

File (String pathname) - 절대 경로로 생성
File (String parent, String child)  -
File (File parent, String child)  -
File (URI uri)  -


★ File 클래스의 메소드

boolean canRead()   파일이 읽기 가능하면 true, 아니면 false를 반환
boolean canWrite()    파일이 쓰기 가능하면 true, 아니면 false를 반환
boolean delete()       파일을 삭제하고 true를 반환, 파일을 삭제할 수 없으면    false를 반환
boolean equals(Object obj)   현재의 객체와 obj로 지정된 객체가 같은 파일을 가지고
                                          있으면 true, 아니면 false를 반환
boolean exists()     파일이 존재하면 true, 아니면 false를 반환

                            제일 많이 쓰는 메소드 중 하나. 파일이 존재하지 않으면 생성하고 존재하면...
String getAbsolutePath()    파일에 대한 절대 경로를 반환
String getCanonicalPath()  파일에 대한 정규 경로를 반환
String getParent()   부모 디렉토리 이름을 반환
String getName()    파일의 이름을 반환
String getPath()      파일의 경로를 반환
boolean isAbsolute()   경로가 절대 경로이면 true, 아니면 false를 반환
boolean isDirectory()   현재의 객체가 디렉토리이면 true, 아니면 false를 반환

boolean isFile()    현재의 객체가 파일이면 true, 아니면 false를 반환
long lastModified()    1970년 1월 1일(GMT)부터 파일이 마지막으로 수정된
                               날자까지의 시간을 밀리 초로 반환
long length()   파일의 바이트 수를 반환.  자주 사용한다.
String[] list()  현재 디렉토리 내의 디렉토리 및 파일들의 이름을 반환.  자주 사용한다.
boolean mkdir()   디렉토리를 생성. 경로로 지정된 모든 부모 디렉토리가
                         존재하여야 한다. 지정한 디렉토리가 생성되면 true를
                         반환하고, 아니면 false를 반환
boolean mkdirs()  디렉토리를 생성. 경로로 지정된 디렉토리가 존재하지 않으면
                          경로를 생성한 다음 지정한 디렉토리를 생성. 디렉토리가 생성되면
                          true를 아니면 false를 반환
boolean renameTo(File newName) 파일이나 디렉토리의 이름을 newName으로
                                                 변경한 다음 true를 반환.

                                                 이름을 변경하지 못하면 false를 반환




/******************************************************************************
*   파일      : FileTest.java
*   용도      : File Class를 테스트하는 예제
*   작성자   : 성홍제
*   작성일   : 2006. 07. 31

*   Version : 1.0
******************************************************************************/

package FileIO;

import java.io.*;

public class FileTest
{
    // Fields
    // Constructor
    // Method
    // Main Method
    public static void main(String[] args) throws Exception
    {

        File f1 = new File("./FileTest.java");  // 둘다 상대경로로 생성
        //File f1 = new File("FileTest.java");  // 둘다 상대경로로 생성
       
        System.out.println(" f1.getPath(): "+f1.getPath());
        // 파일의 절대 경로를 표시. 그렇다 하더라도 파일 객체 생성 시 "./FileTest.java"이렇게

        // 한 것은 ./FileTest.java 이런 식으로 나온다.
        System.out.println(" f1.getAbsolutePath(): "+f1.getAbsolutePath());
        // 파일의 경로를 표시. '.' 으로 되어있는 것도 풀어서 실제 위치를 표시한다.
        // 따라서 어떤 파일의 정확한 경로를 알고 싶으면 getCanonicalPath()를 사용하는

        // 편이 좋다.
        System.out.println(" f1.getCanonicalPath(): "+f1.getCanonicalPath());
        System.out.println(" f1.getName(): "+f1.getName());
        System.out.println(" f1.toString(): "+f1.toString());
       
        try
        {
            System.out.println(" f1.toURL(): "+f1.toURL());
        }
        catch(java.net.MalformedURLException e)
        {
            System.out.println(" f1.toURL(): "+e);
        }
       
        System.out.println(" f1.canRead(): "+f1.canRead());
        System.out.println(" f1.canWrite(): "+f1.canWrite());
        System.out.println(" f1.isAbsolute(): "+f1.isAbsolute());
        System.out.println(" f1.isDirectory(): "+f1.isDirectory());
        System.out.println(" f1.isFile(): "+f1.isFile());
        System.out.println(" f1.isHidden(): "+f1.isHidden());
        System.out.println(" f1.lastModified(): "+f1.lastModified());
       
        /*
        Date d = new Date(f1.lastModified());
        System.out.println(" f1.lastModified(): "+d.toString());
        */
       
        System.out.println(" f1.length(): "+f1.length());
        System.out.println(" f1.exists(): "+f1.exists());
    }
}


/******************************************************************************
*   파일      : FileList.java
*   용도      : FileList를 테스트하는 예제
*   작성자   : 성홍제
*   작성일   : 2006. 07. 31
*   Version : 1.0
******************************************************************************/

package FileIO;

import java.io.*;
import java.text.*;
import java.util.*;

public class FileList
{
    // Fields
    // Constructor
    // Method
    // Main Method
    public static void main(String[] args) throws IOException
    {

        // Date 정보를 내가 원하는 방식으로 표현하기 위해 사용하는 클래스
        SimpleDateFormat sdf = null;  
        sdf = new SimpleDateFormat("yyyy-MM-dd  a KK:mm");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       
        /*if(args.length != 1)
        {
            System.out.println("사용법 : java FileList 디렉토리이름");
            System.exit(0);
        } // if end*/  
   
        //File f = new File(args[0]);
        System.out.println("디렉토리 path를 입력해주세요");
        File f = new File(br.readLine());
   
        if(!f.exists())
        {
            System.out.println("디렉토리가 존재하지 않습니다.");
            System.exit(0);
        }
   
        if(f.isDirectory())
        {
            // 현재 디렉토리의 디렉토리, 파일 리스트
            File[] fileList = f.listFiles();
           
            for(int i = 0; i < fileList.length; i++)
            {
                System.out.print(sdf.format(new Date(fileList[i].lastModified())));
                System.out.print("\t");
               
                if(fileList[i].isDirectory())
                {
                    System.out.print("<DIR>");
                    System.out.print("\t");
                }
                else
                {
                    //System.out.print("파일");
                    System.out.print("\t");
                    System.out.print(fileList[i].length());
                }
               
                System.out.print("\t");
                System.out.print(fileList[i].getName());
                System.out.println("\t");
            }
        }
        else
        {
            System.out.println("디렉토리가 아닙니다.");
        }
    }
}

/******************************************************************************
*   파일      : FileDelete.java
*   용도      : FileDelete를 테스트하는 예제
*   작성자   : 성홍제
*   작성일   : 2006. 07. 31
*   Version : 1.0
******************************************************************************/

package FileIO;


import java.io.*;


public class FileDelete

{
    // Fields
    // Constructor
    // Method
    // Main Method
    public static void main(String[] args)
    {
        if(args.length != 1)
        {
            System.out.println("사용법 : java FileDelete 파일이름");
            System.exit(0);
        } // if end
   
        File f = new File(args[0]);
   
        if(f.exists())
        {
            boolean deleteflag = f.delete();
           
            if(deleteflag)
                System.out.println("파일 삭제를 성공하였습니다.");
            else
                System.out.println("파일 삭제를 실패하였습니다.");
        }
        else
        {
            System.out.println("파일이 존재하지 않습니다.");
        }


    }//main
}


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

04 입출력  (0) 2007.11.27
03 임시파일  (0) 2007.11.27
01 입출력 개요  (0) 2007.11.27
[펌] jar 파일 만들기  (0) 2007.11.27
[펌] java.lang.OutOfMemoryError  (0) 2007.11.27

01 입출력 개요

프로그래밍/Java 2007. 11. 27. 13:23 Posted by galad

★ 입출력 개요

① 자바의 입출력은 모든 하드웨어에 독립적으로 설계
② 자바는 입출력을 스트림(stream)으로 처리
   스트림 : 순서가 있고 길이가 정해져 있지 않은 일련의 데이터 흐름을 의미하는 추상적인 개념
③ 사용자는 스트림을 이용하여 입출력 수행
   스트림을 이용하여 실제 다양한 하드웨어와 입출력을 수행하는 일은 JVM에 의해 실행
④ 스트림의 개념을 이용하면 데이터의 근원지나 목적지에 상관없이 항상 일관된 방법으로 프로그램을 작성할 수 있다.
⑤ 자바는 입출력을 위한 클래스들을 java.io 패키지로 제공(API 참조)
⑥ 단방향으로 작동
   입력 스트림 : 데이터를 스트림으로 읽어 들임
   출력 스트림 : 출력 스트림으로 데이터를 보냄


 

★ 전달 데이터 형에 따른 분류
① 바이트 스트림
   바이트, 바이트 배열, Primitive형 데이터, 개체형 데이터 등의 흐름
   1byte씩 처리

   1byte씩 처리하므로, 영어권이 아닌 2bytes 문자인 한글, 한자, 일본어 등은 깨진다.
    ex) InputStream, OutputStream
② 문자 스트림
   문자, 문자 배열, 문자열의 흐름
   2byte씩 처리
    ex) Reader, Writer


★ 버퍼 - BufferedReader, BufferedWriter 등 Buffered가 붙은 녀석들.

데이터를 하나씩 받아서 하나씩 처리하는게 아니라, 데이터를 계속 받아서 모은 후에 한꺼번에 처리한다.


 

★ 데이터 처리 여부에 따른 분류
① Sink 스트림
   단순히 데이터를 근원지에서 읽어오거나 목적지에 기록
② Procession 스트림
   다른 입출력 클래스를 통해 얻어진 데이터를 중간에서 조작하거나,처리하는 프로세싱 스트림(필터 스트림)



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

03 임시파일  (0) 2007.11.27
02 파일 클래스  (0) 2007.11.27
[펌] jar 파일 만들기  (0) 2007.11.27
[펌] java.lang.OutOfMemoryError  (0) 2007.11.27
[펌] java.lang.OutOfMemoryError: PermGen space  (0) 2007.11.27

[펌] jar 파일 만들기

프로그래밍/Java 2007. 11. 27. 10:36 Posted by galad
출처 카페 > 자바빌 / 자바빌
원본 http://cafe.naver.com/javavil/23

여러 개의 class 파일로 이뤄진 프로그램을 jar 형식의 파일로 합쳐서 배포할 수 있다. 하나의 파일로 관리할 수 있다는 장점뿐만 아니라, 압축이 되어서 용량도 더 작게 만들 수 있는 장점이 있다.


jar 프로그램의 기본적인 명령 순서는 다음과 같다.

jar <option> <target_file> <src_files>

jar 파일을 생성하기 위한 option은 c 이다. create 혹은 compress의 의미를 가지고 있을 것이라 생각된다. 그리고 압축이 되고 있는 상황을 볼 수 있게 하려면 v 라는 option을 쓰면, 파일의 압축과정을 볼 수 있다. 한가지 더 볼 것은 f option이다. 이것은 <target_file> 이름을 지정할 수 있도록 해주는 option이다. <src_files> 에는 파일이름이나 디렉토리 이름이 올 수 있다.

그럼, JavaAmp의 경우를 예를 들어 살펴 보자. JavaAmp는 myprojects.javaamp 패키지에 포함되어 있기 때문에 디렉토리 구성이 상당히 복잡하다. 그렇지만, package 자체를 jar 파일로 생성해주어야 하기 때문에, myprojects 의 부모 디렉토리로 나와서 myprojects 디렉토리 자체를 jar 파일로 생성해주면 된다. 즉,

jar cvf JavaAmp.jar myprojects

라고 명령을 주면 된다. 압축과정이 나타나고, 결과로 JavaAmp.jar 가 생성되었음을 볼 수 있을 것이다.



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

03 임시파일  (0) 2007.11.27
02 파일 클래스  (0) 2007.11.27
01 입출력 개요  (0) 2007.11.27
[펌] java.lang.OutOfMemoryError  (0) 2007.11.27
[펌] java.lang.OutOfMemoryError: PermGen space  (0) 2007.11.27

[펌] java.lang.OutOfMemoryError

프로그래밍/Java 2007. 11. 27. 10:34 Posted by galad

java.lang.OutOfMemoryError

 

                     2005-05-31     학렬    ㈜아이티플러스 기술지원부

 

 

이 문서는 기술지원 또는 개발 시 java.lang.OutOfMemoryError 를 만났을 때 원인 파악 및 해결방안 입니다.

 

 

java.lang.OutOfMemoryError 에는 크게 2가지 패턴이 있다고 볼 수 있습니다.(전적으로 개인적인 생각이지만..^^)

Java heap 메모리가 정말로 Full 되서 나는 종류가 있고 그렇지 않은데도 나는 종류가 있습니다.

그 둘 중에 어는 것 인지부터 가려내는 것이 가장 먼저 선행되어야 합니다.

Java 가상머신에는 메모리 구조가 여러단계로 나뉘어 져 있으므로 어느 영역에 의해 java.lang.OutOfMemoryError 가 나는지 알기 위해 JAVA OPTION으로 싸이트가 안정화 되기 전까진 verbosegc 또는 -XX:+PrintGCDetails  옵션을 추가해 놓는 것이 java.lang.OutOfMemoryError 났을 때를 대비해 좋은 습관이라 할 수 있습니다.

 

-verbosegc 또는  -XX:+PrintGCDetails  옵션으로 로그에 남는 heap 메모리 정보를 본 후 java.lang.OutOfMemoryError 가 날 때 heap이 꽉 차서 나는 것인지 아닌지 부터 판단합니다.

 

1.     Heap Memory Full 차지 않았을 때

1)     Perm 영역이 full 되는 경우

 

Permanent generation is full...

increase MaxPermSize (current capacity is set to: 134217728 bytes)

 

[Full GC[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor31282]

 810207K->802132K(1013632K), 8.3480617 secs]

<GC: 2 4  2465625.831280 10348 0 31 113802808 105534632 286326784 0 0 35782656 715849728 715848840 715849728 134217720 134023296 134217728 8.348677 8.348677 >

Passwd Check =============

<2005. 5. 19. 오전 9 32 23 KST> <Error> <HTTP> <BEA-101017> <[ServletContext(id=2536415,name=/,context-path=)] Root cause of ServletException.

java.lang.OutOfMemoryError

위와 같은 case 인 경우네는 Java 가상머신중에 Perm 영역이 full 차는 경우 입니다. 

Perm 영역에는 class object 및 관련된 meta data가 로드되는 곳인데 싸이트가 매우 많은 수의 class를 사용하는 경우 늘려줘야 하는 case도 있습니다.

얼마가 적정한 사이즈란 정답이 없는 것 같고 max가 계속 늘어나지 않고 일정한 사이즈를 유지 하면 됩니다.

 

             위 에러가 났을때는 -XX:MaxPermSize=256m  옵션으로 사이즈를 적당하게 늘려주는게 방

             법이며 늘려주었는데도 불구하고 Full 차는 시간만 늘어날 뿐 계속 사이즈가 늘어난다면 이 영역은 일반 비즈니스 프로그램으로 핸들링 할 수 없는 영역이므로 WAS 제품의 버그 및 jdk 버그로 보는 것이 일반적입니다.

       

2)     MAXDSIZ 사이즈 관련

  - Exception in thread "CompileThread0" java.lang.OutOfMemoryError: requested 32756 bytes for ChunkPool::allocate

Possible causes:

         - not enough swap space left, or

         - kernel parameter MAXDSIZ is very small.

-          java.lang.OutOfMemoryError: unable to create new native thread

 

위 두 에러가 나는 이유는 Data 사이즈가 Full 차서 더 이상 메모리 할당을 할 수 없다는 java.lang.OutOfMemoryError 입니다.

 

Jdk도 내부적으로 c 라이브러리를 쓰고 jni를 통해서 c프로그램을 호출할 수 도 있는 환경에서 Data 영역이상으로 메모리 사용 시 위 에러를 만날 수 있습니다.

Heap 영역에는 java heap C heap이 있는데 C heap Data 메모리 영역에 영향을 미치는 것으로 보이며 보통 C의 전역 변수들이 잡히는 영역입니다.

 

위 현상을 만났을 때는 hp os MAXDSIZ가 너무 작게 잡혀있지 않은지 확인 후 적당한 크기로 늘려 줘야 합니다.

 

Glance 에서 shift+m 을 누른 후 jvm pid를 누르면 java가 사용하는 Data 사이즈를 모니터링 할 수 있습니다.

모니터링을 통해 적정한 사이즈로 MAXDSIZ를 늘려주어야 하며 만일 늘려 준게 에러 발생의 시간만 지연 시킬 뿐 계속 사용량이 늘어난다면 이는 사용하는 c라이브러리 쪽에 메모리 릭 버그가 있는 것이므로 c라이브러리를 체크 하셔야 합니다.

java.lang.OutOfMemoryError: unable to create new native thread

이 경우는 프로그램에서 Thread pool 프로그램 실수로 필요이상으로 쓰레드가 생성되는 경우도 과도하게 메모리를 사용할 수 있으므로 jvm 쓰레드 덤프를 통해 과도한 쓰레드가 생성되지 않았는지도 확인해 보셔야 합니다.

 

2.     Heap Full 찾을 때

이 경우는 java가 사용하는 heap 영역이 Full 되서 java.lang.OutOfMemoryError 가 나는 경우 인데 두 가지 패턴이 있습니다.

순간적으로 대량의 데이터를 메모리에 올리는 프로그램이 실행되어 문제를 야기 할수 있으며 다른 한 가지는 조금씩 메모리 릭이 발생하여 점차적으로 메모리가 쌓여 가는 경우 입니다.

두 가지 중에  어느 것인지 구별하는 것이 중요하며 이를 위해서도 마찬가지로 -verbosegc 또는  -XX:+PrintGCDetails  로그를 통해 순간적으로 메모리가 차는 것인지 조금씩 메모리가 차는 것인지를 확인하셔야 합니다.

 

1) 특정 프로그램의 특정시점의 과도한 메모리 사용에 의한 경우

                특정 프로그램이 과도하게 heap 메모리 이상 메모리를 사용하면서

java.lang.OutOfMemoryError가 발생하는 경우는 이 에러가 발생하는 시점의 쓰레드 덤프를 통해 어느 프로그램인지 쉽게 찾을 수 있습니다.

쓰레드 덤프에 메모리를 쓸만한 프로그램은 어느 정도의 자바프로그램 경험이 있으면 찾을 수 있습니다.

 

Ex)

"ExecuteThread: '36' for queue: 'default'" daemon prio=10 tid=0x0048e7b0 nid=48 lwp_id=4139729 runnable [0x23f32000..0x23f30500]

          at java.net.SocketInputStream.socketRead(Native Method)

          at java.net.SocketInputStream.read(Unknown Source)

          at oracle.net.ns.Packet.receive(Unknown Source)

          at oracle.net.ns.NetInputStream.getNextPacket(Unknown Source)

          at oracle.net.ns.NetInputStream.read(Unknown Source)

          at oracle.net.ns.NetInputStream.read(Unknown Source)

          at oracle.net.ns.NetInputStream.read(Unknown Source)

          at oracle.jdbc.ttc7.MAREngine.unmarshalUB1(MAREngine.java:718)

          at oracle.jdbc.ttc7.MAREngine.unmarshalSB1(MAREngine.java:690)

          at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:373)

          at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1405)

          at oracle.jdbc.ttc7.TTC7Protocol.fetch(TTC7Protocol.java:889)

          - locked <0x35e8e3b0> (a oracle.jdbc.ttc7.TTC7Protocol)

          at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:242)

          - locked <0x36f66c98> (a oracle.jdbc.driver.OracleResultSetImpl)

          at weblogic.jdbc.pool.ResultSet.next(ResultSet.java:180)

          at Dcard.AAA.ejb.monitor.member.wbbb.WACBean.getInfoList(WACBean.java:5789)

 

java.lang.OutOfMemoryError 가 날 상황에 쓰레드 덤프를 두 세번 떠서 같은 쓰레드 번호로 위 같은 로직이 오래 결려있다면 이는 프로그램에서 while(rs.next()) 를 오랜 기간 돌면서 메모리에 DB로부터 읽어서 올리고 있다는 것을 의미 합니다 대량 데이터 조회가 일어나는 경우인 것 입니다.

 

이런 식으로 특정 프로그램의 특정 시점에 과도한 메모리 사용으로 인한 java.lang.OutOfMemoryError 에러는 쓰레드 덤프를 통해 찾을 수 있습니다.

-- 물론 2번에서 설명 할 heap dump를 통해서도 찾을 수 있습니다.

 

2) 메모리 릭에 의해 조금씩 메모리가 쌓인 경우

JVM위 에서 실행중인 프로그램중에 어떤 것이 GC 대상에서 제외되는 영역에 data를 조금씩 쌓고 있다는 얘기입니다.

GC 대상에서 제외되는 영역은 다음과 같은 곳이 있습니다.

- Http Session에 넣는 데이터..(세션 타임아웃 또는 invilidate 씨 까지 제외됨)

- Static 변수

- 서블릿 또는 jsp의 멤버변수 ( WAS 기동 후 최초 호출 시 인스턴스 화 되어 WAS가 내려 갈 때 까지 사라지지 않음 )

- EJB의 멤버변수( pool안에서 객체가 존재하는 한 GC대상에서 제외)

          위 같은 영역에 프로그램에서 data add 하는 구조를 메모리 릭 이라고 할 수 있습니다.

           IBM 또는 SUN JDK 인 경우에는 heapdump를 통해서 분석하여 어느 데이터가 메모리를 많이 잡고 있는지를 알 수 있습니다.

           Heapdump 사용법 및 분석 법은 다음을 참조 하시면 됩니다.

 http://www.alphaworks.ibm.com/aw.nsf/FAQs/heaproots

http://www-1.ibm.com/support/docview.wss?uid=swg21190476

http://www-1.ibm.com/support/docview.wss?rs=180&context=SSEQTP&q1=heapdump+solaris&uid=swg21190608&loc=en_US&cs=utf-8&lang=en

http://www.skywayradio.com/tech/WAS51/IBMHeapDump/

 

 

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

03 임시파일  (0) 2007.11.27
02 파일 클래스  (0) 2007.11.27
01 입출력 개요  (0) 2007.11.27
[펌] jar 파일 만들기  (0) 2007.11.27
[펌] java.lang.OutOfMemoryError: PermGen space  (0) 2007.11.27

요즘 들어 부쩍 java.lang.OutOfMemoryErorr로 인해 이클립스가 뻗어버리는 일이 많이 발생했었다. 하지만 Heap Monitor를 보면 200M 조차 사용하지 않는다. 이런 경우, 대부분은 PermGen 영역이 모자란 것이 원인일 수 있다.

{workspace}/.metadata/.log를 확인해보면 PermGen space라고 기록되어 있을 것이다.

Eclipse를 사용할 때는 JVM에 -Xmx 옵션은 대부분은 넣어서 사용하리라 생각한다. 하지만 Java는 메모리 영역을 사실상 두 부분으로 구분하여 사용한다. 일반 Java Heap space와 클래스와 같이 Permenant Generation 대상 데이터를 두기 위한 PermGen space이다.

대부분의 자바 애플리케이션에서는 기본 PermGen Size로 충분하겠지만 이클립스의 경우 클래스가 꽤 많아지면서 모자란 경우가 있는듯 하다. javanese의 경우 Callisto를 깔아놓고 JDT, CDT를 왔다갔다 하면서 사용하다보니 Heap은 별로 쓰지도 않는데 PermGen space가 종종 모자라는 경우가 있다. 아마 Web관련 Tool을 많이 사용하는 분도 같은 현상이 나타날 수 있을 것이다.

PermGen space는 -XX:MaxPermSize 옵션으로 설정할 수 있다.

eclipse -vm /usr/lib/jvm/java-1.5.0-sun/bin/java -vmargs -XX:MaxPermSize=128m -Xms128m -Xmx512m

OutOfMemory 에러가 발생한다면 -Xmx만 늘려주지말고 PermSize도 확인해보라.



http://blog.eclipsercp.or.kr/javanese/?p=34

펌...

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

03 임시파일  (0) 2007.11.27
02 파일 클래스  (0) 2007.11.27
01 입출력 개요  (0) 2007.11.27
[펌] jar 파일 만들기  (0) 2007.11.27
[펌] java.lang.OutOfMemoryError  (0) 2007.11.27