이 세가지 방법 말고도 뭐 다른 방법이 있겠지만 대충 요 3가지 정도만 알고 있어도 충분하고도 넘칠것 같다.

이전까지는 제일 첫번째 방법으로만 Map 에 있는 것들을 꺼내서 썼었는데

세번째 방법도 꽤 간결하고 가독성도 좋은것 같아 앞으로 세번째 방법을 주로 써야 겠다는 생각을 해본다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.tistory.stove99;
 
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
 
public class MapIterationSample {
    public static void main(String[] agrs) {
        Map<String, String> map = new HashMap<String, String>();
         
        map.put("키1", "값1");
        map.put("키2", "값2");
        map.put("키3", "값3");
        map.put("키4", "값4");
        map.put("키5", "값5");
        map.put("키6", "값6");
         
         
        // 방법1
        Iterator<String> keys = map.keySet().iterator();
        while( keys.hasNext() ){
            String key = keys.next();
            System.out.println( String.format("키 : %s, 값 : %s", key, map.get(key)) );
        }
         
        // 방법2
        for( Map.Entry<String, String> elem : map.entrySet() ){
            System.out.println( String.format("키 : %s, 값 : %s", elem.getKey(), elem.getValue()) );
        }
         
        // 방법3
        for( String key : map.keySet() ){
            System.out.println( String.format("키 : %s, 값 : %s", key, map.get(key)) );
        }
    }
}

출처: http://stove99.tistory.com/96

Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

DecimalFormat 클래스



NumberFormat 클래스와는 달리, DecimalFormat 클래스는 new 연산자를 사용하여 객체를 생성한다.


DecimalFormat 클래스는 format 메소드를 사용하여 특정 패턴으로 값을 포맷할 수 있다. (반환 값 String)


지정할 수 있는 패턴 형식은 '0' 과 '#'을 사용 하여 지정한다.


예를 들어, '0.###', '000.###', '00.#' 등으로 패턴을 지정할 수 잇다.


'0' 은 해당 자리수는 값이 최소한으로 있어야 되며, #은 최대한 해당 소수점 자리수 까지(반올림하여) 보여준다.


예를 들어, 78.53981633 일 경우


'0.###' : 78.54  (78.540 이므로 0은 출력되지 않는다.)

'000.##' : 078.54 

'00.#' : 78.5


해당 패턴을 지정하여 DecimalFormat의 사용 방법은 아래와 같다.


DecimalFormat fmt = new DecimalFormat("0.###");

String decimal =  fmt.format(78.539816);


위와 같이 사용하면 decimal 에는 78.54 가 반환된다.


DecimalFormat의 pattern을 변경하고 싶을 때는 void applyPattern(String pattern)을 사용한다.


fmt.applyPattern("000.###") 으로 변경하면, 이후의 포맷은 변경된 Pattern이 적용된다.



아래의 예제를 보자.


 

import java.text.DecimalFormat;
import java.util.Scanner;


public class DecimalFormatTest {
    
    public static void main(String[] args) {
    
        int radius;
        double area, circumference;
        
        Scanner scan = new Scanner(System.in);
        
        // 원의 반지름을 입력받는다.
        System.out.print("원의 반지름을 입력하세요 : ");
        radius = scan.nextInt();
        
        // 원의 넓이 : 반지름의 제곱 * 파이
        area = Math.PI * Math.pow(radius, 2);
        
        // 원의 길이 : 지름(반지름*2) * 파이
        circumference = 2 * Math.PI * radius;
        
        
        // 원의 넓이와 길이 값을 출력한다.
        System.out.println("원의 넓이 : " + area);
        System.out.println("원의 길이 : "+circumference);
        System.out.println("");
        
        
        // DecimalFormat으로 "0.###" 패턴을 생성한다.
        DecimalFormat fmt = new DecimalFormat("0.###");
        
        System.out.println("Format 적용 후 (0.###)");
        
        // 원의 넓이와 길이에 "0.###" 패턴을 적용하여 출력한다.
        System.out.println("원의 넓이(Format적용) : " 
                           + fmt.format(area));
        System.out.println("원의 길이(Format적용) : "
                           + fmt.format(circumference));
        System.out.println("");

        
        
        // DecimalFormat 패턴을 "000.#" 으로 변경한다.
        fmt.applyPattern("000.#");
        
        System.out.println("Format 변경 후 (000.#)");
        
        // 원의 넓이와 길이에 "000.#" 패턴을 적용하여 출력한다.
        System.out.println("원의 넓이(Format 변경 후) : " 
                           + fmt.format(area));
        System.out.println("원의 길이(Format 변경 후) : "
                           + fmt.format(circumference));
        
    }
}


* 실행 결과




Decimal 패턴에 관하여 형식은 "0"과 "#" 외에도 더 있다.


자세한 내용은 JAVA API DOC을 참고 하자.



DecimalFormatTest.zip



출처 : http://hyeonstorage.tistory.com/163

Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

우선 java는 객체지향언어입니다.

결국 어떤 작업을 하기 위해서는 클래스가 있어야 하며, 이에 대한 객체가 있어야 하며, 해당 객체가 가지고 있는 메쏘들 호출하여야 합니다.

setAutoCommit(boolean)
commit()
rollback()

메쏘드는 모두 java.sql.Connection 클래스의 것입니다.

소스상에서

con = Engsconn.getDBConnection();

부분에서 Connection 객체를 생성하신 것입니다.
결국 바로 밑에 

con.setAutoCommit(false);

를 넣어주시면 되겠습니다.


그리고 commit의 경우는 insert/delete/update 후 정상적으로 Exception이 발생하지 않았다면, 호출해주셔야 합니다.
방법은 동일하게

conn.commit();

Exception이 발생하였다면, 

conn.rollback();

입니다.

일반적으로 update/insert/delte가 있는 부분의 try 절안에서 SQL이 실행되고,
Exception을 catch 하는 블럭에서는 rollback을, 정상인 경우는 commit을 해주시면 되겠습니다.

예를 들어

conn.setAutoCommit(false);
try {
update 실행
conn.commit();

} catch(SQLException e) {
conn.rollback();
}
이런 식인것이죠.

setAutoCommit은 개발자가 코드상에서 commit/rollback을 하지 않아도,
프로그램이 정상으로 끝나면, commit
실행중 에러가 발생하면, 자동으로 rollback을 해주는데요.

setAutoCommit(true)이면, 이 기능을 사용하자는 것이고,
false이면, 사용자가 직접 commit/rollback을 하겠다는 것입니다.


출처 : http://blog.naver.com/wooridl2030/16055460


Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.net.*;
import java.io.*;
 
public class Ex02_01 
{
    public static void main(String[] args)
    {
        try
        {
            //InetAddress ia = new InetAddress(); 처럼 하면 좋겠지만 
            //InetAddress 는 생성자 자체가 존재하지 않기때문에 쓸수없다        
            InetAddress[] ia = InetAddress.getAllByName("www.naver.com");    //여러개의 주소를 얻는방법
            
            for(int i=0; i < ia.length ; i++)
            {
                System.out.println(i + 1 + "번째의 주소 => " + ia[i].getHostName() +"   아이피 => "+ia[i].getHostAddress());
            }
        }
        catch(UnknownHostException e){}
        
    }
}



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.net.*;
import java.io.*;
 
public class Ex02_02 
{
    public static void main(String[] args)
    {
        try        //외부주소 알아내기
        {
            InetAddress ia = InetAddress.getByName("www.naver.com");    //주소 한개만 알아내기            
            System.out.println(ia.getHostAddress());
            System.out.println(ia.getHostName());            
        }
        catch(UnknownHostException e){}
        
        try        // 내컴 주소 알아내기
        {
            InetAddress iaa = InetAddress.getLocalHost();
            System.out.println(iaa);
        }
        catch(UnknownHostException e){}
        
    }
}




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.net.*;
import java.io.*;
 
public class Ex02_03 
{
    public static void main(String[] args)
    {
        try
        {
            InetAddress ia = InetAddress.getByName("www.naver.com");
            byte[] bb = ia.getAddress();        //getAddress를 쓰려면 배열이기 때문에 배열로 넣어줘야된다
                                                //getAddress는 특정객체로부터 배열형태의 IP주소를 빼내어
                                                //byte형식으로 형변환
//            for(int i = 0; i < bb.length ; i++)
//            {
//                System.out.println(bb[i]);
//            }
            
            for(int ggg : bb)
            {
                System.out.print(ggg+"\t");        //125,-47,-34,-115 현재는 이렇게 나온다
                                                //byte 형으로 변환한 번호이다
            }
            
            
            byte[] vvv={125,-47,-34,-115};        //위에서 나온 숫자를 getByAddress 를 넣으면 IP주소가 나온다
                                                //125.209.222.141
            InetAddress iaa = InetAddress.getByAddress(vvv);
            System.out.println("iaa = "+iaa);
            System.out.println("dns = "+iaa.getHostName());
            System.out.println("ip = "+iaa.getHostAddress());
        }
        catch(UnknownHostException e){}
    }
}





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/*
 * awt이용 
 * A.프레임을 통한 현재 컴퓨터 정보 표시
 * B.프레임에서 특정 대상컴퓨터의 정보 표시 예제
 */

 
import java.net.*;
import java.awt.*;
import java.awt.event.*;
 
class Ex02_04Sub extends Frame implements ActionListener    //Frame을 상속받고 Action이벤트를 쓰기위해  implements 로 
{
    //사용할 객체 생성
    private Label lb = new Label("사이트 : ", Label.RIGHT);    //
    private TextField tf = new TextField();        //입력창으로 이용할 객체 생성
    private TextArea ta = new TextArea();        //결과창으로 사용할 객체생성
    private Button bt = new Button("Clear");    //Clear라는 이름을 가진 버튼 객체 생성
    private Button bt1 = new Button("End");        //End라는 이름을 가진 버튼 객체 생성
    
    
    public Ex02_04Sub(String str)
    {
        super(str);
        this.init();
        this.start();
        this.setSize(300,200);
        this.setVisible(true);        //보이도록 세팅할것이냐~!!!
    }
    
    public void init()        //위에서 만든 사용할 객체 생성한것으로 초기 화면 구성 Swing
    {
        this.setLayout(new BorderLayout());            //Layout 응 BorderLayout으로 세팅
        this.add("Center", ta);                        //Center 에 TextArea를 생성
        Panel p =new Panel(new BorderLayout());        //Label 과 TextField를 만들기 위한 Panel을 BorderLayout으로 생성
        p.add("West", lb);                            //왼쪽에 Label객체를 p에 생성
        p.add("Center", tf);                        //가운데에 TextField객체 p에 생성
        this.add("North",p);                        //위쪽에 p를 화면에 생성
        Panel p1 = new Panel(new FlowLayout(FlowLayout.RIGHT));        //Panel 생성을 FlowLayout형식의 오른쪽으로 생성
        p1.add(bt);        //p1에 bt객체 생성만
        p1.add(bt1);    //p1에 bt1 객체 생성만
        this.add("South", p1);    //이화면에 p1 을 추가후 아래쪽으로 출력
    }
    
    public void start()        //시작메소드 
    {
        tf.addActionListener(this);        //textField 에서 이벤트 발생
        bt.addActionListener(this);        //clear 버튼 이벤트 발생
        bt1.addActionListener(this);    //End 버튼 이벤트 발생 보낸다
    }
 
    @Override
    public void actionPerformed(ActionEvent e)     //이벤트를 사용하기위한 메소드 생성
    {
        if(e.getSource() == tf)        //ActionEvent 를 받았는데 내용이 tf면
        {
            String str = tf.getText().trim();     //str에 textField에 있는 내용을 가져옴
            
            if(str == null || str.length() == 0)         //str에 null 이거나 str의 길이가 아무것도 없다면
            {
                return;                                    //그냥 반환한다
            }
            try
            {    
                InetAddress[] ia = InetAddress.getAllByName(str);
                //내 컴퓨터 정보출력
                InetAddress ia1 = InetAddress.getLocalHost();        //로컬의 IP주소를 얻어서 ia1 에 넣는다
                ta.append("Localhost name : " + ia1.getHostName()+"\n");    //textArea에 ia1의 호스트이름을 추가한다
                ta.append("Localhost Address : "+ia1.getHostAddress()+ "\n\n");    //textArea에 가져온 hostAddress를 추가한다.
                
                //원격 컴퓨터 정보출력                
                for(int i=0; i< ia.length; i++)
                {
                    ta.append("Remotehost[] name : " + ia[i].getHostName()+"\n");    //textArea에 ia의 호스트이름을 추가한다
                    ta.append("Remote Address[] : "+ia[i].getHostAddress()+ "\n\n");    //textArea에 가져온 hostAddress를 추가한다.
                    
                    //ta.setText(""); setText는 앞에껄 지우고 덮어쓰기하는것이다. 
                }
            }
            catch(UnknownHostException ee)
            {
                ta.setText("Ereer = "+ee.toString());
                return;
            }
        }
        else if(e.getSource() == bt)        //ActionEvent 가 bt이면
        {
            tf.setText("");        //textField를 공백으로 바꾼다
            ta.setText("");        //textAria를 공백으로 바꾼다
            tf.requestFocus();    //textField 로 커서를 놓는다
        }
        else if(e.getSource() == bt1)
        {
            System.exit(0);
        }
        
    }
}
 
public class Ex02_04 
{
    public static void main(String[] args)
    {
        Ex02_04Sub es = new Ex02_04Sub("ip관리하기");        //Frame으로 상송받은 Ex02_04Sub 으로 
                                                        //이름이 ip관리하기로 객체 생성
    }
}
 




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

 
import java.net.*;
import java.io.*;
 
public class Ex02_05 
{
    public static void main(String[] args)
    {
        InetAddress ia = null;
        Socket soc = null;
        OutputStream os = null;
        InputStream is = null;
        try
        {
            ia = InetAddress.getByName("www.naver.com");            
        }
        catch(UnknownHostException ee){}
        try
        {
            soc = new Socket(ia,80);    //Socket을 이용하여 ia=주소,80=포트번호로 연결
//            soc = new Socket("www.naver.com",80); //으로도 사용가능
            
            os = soc.getOutputStream();
            is = soc.getInputStream();
            /*
             OutputStreamWriter osw =new OutputStreamWriter(os);
             BufferedWriter bw = new BufferedWriter(osw);
             PrintWriter pw = new PrintWriter(bw);
             
             pw.println("test");   // 이건 지정한 사이트로 전송된다
             pw.flush();
             */
        }
        catch(IOException ee){}
        System.out.println("soc = "+soc);
        System.out.println("os = "+ os);
        System.out.println("is = "+ is);
    }
}
 




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64

 
// 웹페이지 긁어오기
 
import java.net.*;
import java.io.*;
 
public class Ex02_06 
{
    public static void main(String[] args)
    {
        InetAddress ia = null;        //사이트 주소 저장하기위한 준비
        Socket soc = null;            //네트워크를 처리할 수 있는 소켓 객체 생성        
//        DataOutputStream dos = null;        //이렇게 쓰는방법이있다
//        DataInputStream dis = null;
        OutputStream os = null;
        InputStream is =null;
        
        try
        {
            ia = InetAddress.getByName("www.naver.com");
        }
        catch(UnknownHostException ee){}
        
        try
        {
            soc = new Socket(ia,80);            //포트를 열어주고
            
            /*    //이렇게 쓰는 방법이있다
             * dos =new DataOutputStream(            //출력형식
                 new BufferedOutputStream(
                    soc.getOutputStream()));
            dis = new DataInputStream(            //입력형식    
                  new BufferedInputStream(
                  soc.getInputStream()));
             */
            os = soc.getOutputStream();
            is = soc.getInputStream();
            
                
            
            String str = "get http://www.daum.net/index.html http1.0 \r\n\n";
                    //get 방식           full 주소                    버전       엔터두번
            os.write(str.getBytes());    //서버에게 이야기 한다 write 메소드는 byte밖에 보낼수 없다.str을 Byte방식으로 분할 전달 한다.
            while(true)    //이제 받아서 화면상에 보여줘야된다
            {        
                int xx = is.read();        //soc.getInputStream(); 에서 받은 내용을 xx에 입력
                if(xx == -1)            //더이상 내용이 없으면
                {
                    break;                
                }
                System.out.print((char)xx);
            }
            os.close();
            is.close();
            soc.close();
            
            
            
        }
        catch(IOException ee){}
    }
}
 







Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

 InetAddress.getAllByName() 사용방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Ex02_01 
{
    public static void main(String[] args)
    {
        try
        {
            //InetAddress ia = new InetAddress(); 처럼 하면 좋겠지만 
            //InetAddress 는 생성자 자체가 존재하지 않기때문에 쓸수없다        
            InetAddress[] ia = InetAddress.getAllByName("www.naver.com");    //여러개의 주소를 얻는방법
            
            for(int i=0; i < ia.length ; i++)
            {
                System.out.println(i + 1 + "번째의 주소 => " + ia[i].getHostName() +"   아이피 => "+ia[i].getHostAddress());
            }
        }
        catch(UnknownHostException e){}
        
    }
}



InetAddress 는 생성자가 존재하지 않기 때문에 new InetAddress(); 처럼 쓸 수 없다.

그래서 

InetAddress[] ia = InetAddress.getAllByName("www.naver.com"); 이런식으로 써야된다.

배열형으로 쓴이유는  

 InetAddress.getAllByName() 의  getAllByName() 이 배열형으로 읽어오기때문이다 여러개의주소를 한번에 담아낸다

그래서  InetAddress.getAllByName() 를 쓸때는 for문 등 반복자를 통해서 출력해야된다.

Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

Eclipse 를 이용하여 java 개발을 하다가, 명령 프롬프트 창에서 compile 하고 run 할때

 

D:\eclipse-data\mytest\src\test1>javac Test2.java

 

D:\eclipse-data\mytest\src\test1>java Test2
Exception in thread "main" java.lang.NoClassDefFoundError: Test2 (wrong name: test1/Test2)
        at java.lang.ClassLoader.defineClass0(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:539)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:55)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)


 

실행시 이런 걸 당해본 경험이 있다면........... package 를 사용했기 땜에 이렇다

이럴 땐

 

D:\eclipse-data\mytest\src\test1>java -cp D:\eclipse-data\mytest\src test1.Test2
f1[0]=0.0 f2[0]=0.0 // 정상 결과

 

 i) 이렇게 classpath 를 상위 폴더까지 잡아주고

 ii) [package name].[class name] 이렇게 하면 된다

 

근데 이렇게 일일이 classspath 를 잡아주기엔 넘넘 귀찮다

 

환경변수에 CLASSPATH 값에 상위폴더를 의미하는 '..' 이걸 추가시켜준다

(내 컴퓨터 >> 속성 >> 고급)

 

자 이제 명령 프롬프트 창을 다시 열어서 확인해보고

 

D:\>set CLASSPATH

CLASSPATH=.;..;  /*기타등등*/

 

classpath 등록만 하면 package.class_name 이렇게만 하면 된다 

 

D:\eclipse-data\mytest\src\test1>java test1.Test2
f1[0]=0.0 f2[0]=0.0 //정상 결과

 

기타 상세한 다른 내용은 아래 사이트를 들어가보면 된다

 

참고 : http://www.jarticles.com/package/package_eng.html

Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

출처 : http://cremazer.blogspot.kr/2013/09/java-tcp.html#index4  


서버소켓은 소켓간의 연결만 처리하고 실제 데이터는 소켓들끼리 서로 주고받습니다. 한 소켓의 입력스트림은 상대편 소켓의 출력스트림과 연결되고, 출력스트림은 입력스트림과 연결됩니다. 그래서 한 소켓에서 출력스트림으로 데이터를 보내면, 상대편 소켓에서는 입력스트림으로 받게됩니다.


  자바에서는 TCP를 이용한 소켓프로그래밍을 위해 Socket과 ServerSocket 클래스를 제공합니다.


Socket : 프로세스간의 통신을 담당하며, InputStream과 OutputStream을 가지고 있습니다. 이 두 스트림을 통해 프로세스간의 통신(입출력)이 이루어집니다.

ServerSocket : 포트와 연결(bind)되어 외부의 연결요청을 기다리다 연결요청이 들어오면, Socket을 생성해서 소켓과 소켓간의 통신이 이루어지도록 한다. 한 포트에 하나의 ServerSocket만 연결할 수 있습니다. (프로토콜이 다르면 같은 포트를 공유할 수 있습니다.)



▶ 예제 - Server



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/**
 * @file name : TcpIpServer.java
 * @date : 2013. 9. 29.
 * @discription : TcpIp Server
 * 
 */
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * @author Cremazer(cremazer@gmail.com)
 */
public class TcpIpServer {
    public static void main(String args[]) {
        ServerSocket serverSocket = null;
        try {
            // 서버소켓을 생성하여 7777번 포트와 결합(bind)시킨다.
            serverSocket = new ServerSocket(7777);
            System.out.println(getTime() + "서버가 준비되었습니다.");
        } catch (IOException e) {
            e.printStackTrace();
        }
        while (true) {
            try {
                System.out.println(getTime() + "연결요청을 기다립니다.");
                // 서버소켓은 클라이언트의 연결요청이 올 때까지 
                // 실행을 멈추고 계속 기다린다.
                // 클라이언트의 연결요청이 오면 클라이언트 소켓과 통신할 
                // 새로운 소켓을 생성한다.
                Socket socket = serverSocket.accept();
                System.out.println(getTime() + socket.getInetAddress()
                        + "로부터 연결요청이 들어왔습니다.");
                // 소켓의 출력스트림을 얻는다.
                OutputStream out = socket.getOutputStream();
                DataOutputStream dos = new DataOutputStream(out);
                // 원격 소켓(remote socket)에 데이터를 보낸다.
                dos.writeUTF("[Notice] Test Message1 from Server.");
                System.out.println(getTime() + "데이터를 전송했습니다.");
                // 스트림과 소켓을 닫아준다.
                dos.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } // while
    } // main
    // 현재시간을 문자열로 반환하는 함수
    static String getTime() {
        SimpleDateFormat f = new SimpleDateFormat("[hh:mm:ss]");
        return f.format(new Date());
    }
}




▶ 결과





  클라이언트를 실행하였을 때 위의 결과와 같이 연결요청이 들어왔다는 메시지를 서버에서는 보여줍니다.



▶ 예제 - Client



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/**
 * @file name : TcpIpClient.java
 * @date : 2013. 9. 29.
 * @discription : TcpIp Client
 * 
 */
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ConnectException;
import java.net.Socket;
/**
 * @author Cremazer(cremazer@gmail.com)
 */
public class TcpIpClient {
    public static void main(String args[]) {
        try {
            String serverIp = "127.0.0.1";
            System.out.println("서버에 연결중입니다. 서버IP :" + serverIp);
            // 소켓을 생성하여 연결을 요청한다.
            Socket socket = new Socket(serverIp, 7777);
            // 소켓의 입력스트림을 얻는다.
            InputStream in = socket.getInputStream();
            DataInputStream dis = new DataInputStream(in);
            // 소켓으로 부터 받은 데이터를 출력한다.
            System.out.println("서버로부터 받은 메세지 :" + dis.readUTF());
            System.out.println("연결을 종료합니다.");
            // 스트림과 소켓을 닫는다.
            dis.close();
            socket.close();
            System.out.println("연결이 종료되었습니다.");
        } catch (ConnectException ce) {
            ce.printStackTrace();
        } catch (IOException ie) {
            ie.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    } // main
}




▶ 결과




  클라이언트는 연결하고자 하는 서버의 IP와 포트번호를 가지고 소켓을 생성하면 자동으로 서버에 연결요청을 하게됩니다.



1
2
String serverIp = "127.0.0.1";
Socket socket = new Socket(serverIp, 7777);




  서버프로그램이 실행되고 있지 않거나 서버의 전원이 꺼져있어서 서버와 연결을 실패하면 ConnectException이 발생합니다.





  서버와 연결되면 소켓의 입력스트림을 얻어서 서버가 전송한 데이터를 읽을 수 있습니다.



1
2
3
4
5
InputStream in = socket.getInputStream();
DataInputStream dis = new DataInputStream(in); 
// 소켓으로 부터 받은 데이터를 출력한다.
System.out.println("서버로부터 받은 메세지 :" + dis.readUTF());




서버와의 작업이 끝나면 소켓과 스트림을 닫아야 합니다.


1
2
dis.close();
socket.close();




  위의 예제에서는 내 PC에서 테스트하기위해 서버IP를 127.0.0.1로 설정하였지만, 원래는 서버가 실제로 사용하고 있는 IP를 지정해 주어야 합니다.





2. 소켓이 사용하고 있는 포트정보확인


  서버 프로그램에서는 서버소켓이 연결요청을 받아 새로운 소켓을 생성하면, 그 소켓이 연결된 상대편 포트와 서버에서 사용하는 포트정보를 확인할 수 있습니다.



1
2
3
4
Socket socket = serverSocket.accept();
System.out.println("getPort() : " + socket.getPort());  //상대편 포트정보
System.out.println("getLocalPort() : " + socket.getLocalPort());  //서버 포트정보






3. 서버소켓의 대기시간 설정하기


  ServerSocket 클래스의 setSoTimeout(int timeout)을 사용해서 서버소켓의 대기시간을 지정할 수 있습니다. timeout의 값은 천분의 일초단위이며 0을 입력하면 제한시간 없이 대기하게 됩니다. 지정한 대기시간이 지나면 accept()에서 SocketTimeoutException이 발생하므로 catch문에서 적절한 처리를 할 수 있습니다.

--------------------------------------------------------------------------------
...
while (true) {
    try {
      System.out.println(getTime() + "연결요청을 기다립니다.");


     // 요청대기시간을 5초로 설정한다.
     // 5초동안 접속요청이 없으면 SocketTimeoutException이 발생한다.
     serverSocket.setSoTimeout(5*1000);

     Socket socket = serverSocket.accept();
     System.out.println(getTime() + socket.getInetAddress() + "로부터 연결요청이 들어왔습니다.");


     ....


   } catch (SocketTimeoutException e){   
     System.out.println("지정된 시간동안 접속요청이 없어서 서버를 종료합니다.");
     System.exit(0);
   } catch (IOException e) {
      e.printStackTrace();
   }

}
...
--------------------------------------------------------------------------------





4. 채팅 프로그램 예제(MultiChat)



▶ 서버

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/**
 * @file name : TcpIpMultichatServer.java
 * @date : 2013. 9. 29.
 * @discription : 채팅프로그램 - 서버
 * 
 */
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
/**
 * @author Cremazer(cremazer@gmail.com)
 */
public class TcpIpMultichatServer {
    HashMap clients;
    TcpIpMultichatServer() {
        clients = new HashMap();
        Collections.synchronizedMap(clients);
    }
    public void start() {
        ServerSocket serverSocket = null;
        Socket socket = null;
        try {
            serverSocket = new ServerSocket(7777);
            System.out.println("서버가 시작되었습니다.");
            while (true) {
                socket = serverSocket.accept();
                System.out.println("[" + socket.getInetAddress() + ":"
                        + socket.getPort() + "]" + "에서 접속하였습니다.");
                ServerReceiver thread = new ServerReceiver(socket);
                thread.start();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    } // start()
    void sendToAll(String msg) {
        Iterator it = clients.keySet().iterator();
        while (it.hasNext()) {
            try {
                DataOutputStream out = (DataOutputStream) clients
                        .get(it.next());
                out.writeUTF(msg);
            } catch (IOException e) {
            }
        } // while
    } // sendToAll
    public static void main(String args[]) {
        new TcpIpMultichatServer().start();
    }
    class ServerReceiver extends Thread {
        Socket socket;
        DataInputStream in;
        DataOutputStream out;
        ServerReceiver(Socket socket) {
            this.socket = socket;
            try {
                in = new DataInputStream(socket.getInputStream());
                out = new DataOutputStream(socket.getOutputStream());
            } catch (IOException e) {
            }
        }
        public void run() {
            String name = "";
            try {
                name = in.readUTF();
                sendToAll("#" + name + "님이 들어오셨습니다.");
                clients.put(name, out);
                System.out.println("현재 서버접속자 수는 " 
                        + clients.size() + "입니다.");
                while (in != null) {
                    sendToAll(in.readUTF());
                }
            } catch (IOException e) {
                // ignore
            } finally {
                sendToAll("#" + name + "님이 나가셨습니다.");
                clients.remove(name);
                System.out.println("[" + socket.getInetAddress() + ":"
                        + socket.getPort() + "]" 
                        + "에서 접속을 종료하였습니다.");
                System.out.println("현재 서버접속자 수는 " 
                        + clients.size() + "입니다.");
            } // try
        } // run
    } // ReceiverThread
}




▶ 클라이언트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/**
 * @file name : TcpIpMultichatClient.java
 * @date : 2013. 9. 29.
 * @discription : 채팅 프로그램 - 클라이언트
 * 
 */
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ConnectException;
import java.net.Socket;
import java.util.Scanner;
/**
 * @author Cremazer(cremazer@gmail.com)
 */
public class TcpIpMultichatClient {
    public static void main(String args[]) {
        if (args.length != 1) {
            System.out.println("USAGE: java TcpIpMultichatClient 대화명");
            System.exit(0);
        }
        try {
            String serverIp = "127.0.0.1";
            // 소켓을 생성하여 연결을 요청한다.
            Socket socket = new Socket(serverIp, 7777);
            System.out.println("서버에 연결되었습니다.");
            Thread sender = new Thread(new ClientSender(socket, args[0]));
            Thread receiver = new Thread(new ClientReceiver(socket));
            sender.start();
            receiver.start();
        } catch (ConnectException ce) {
            ce.printStackTrace();
        } catch (Exception e) {
        }
    } // main
    static class ClientSender extends Thread {
        Socket socket;
        DataOutputStream out;
        String name;
        ClientSender(Socket socket, String name) {
            this.socket = socket;
            try {
                out = new DataOutputStream(socket.getOutputStream());
                this.name = name;
            } catch (Exception e) {
            }
        }
        public void run() {
            Scanner scanner = new Scanner(System.in);
            try {
                if (out != null) {
                    out.writeUTF(name);
                }
                while (out != null) {
                    out.writeUTF("[" + name + "]" + scanner.nextLine());
                }
            } catch (IOException e) {
            }
        } // run()
    }
    static class ClientReceiver extends Thread {
        Socket socket;
        DataInputStream in;
        ClientReceiver(Socket socket) {
            this.socket = socket;
            try {
                in = new DataInputStream(socket.getInputStream());
            } catch (IOException e) {
            }
        }
        public void run() {
            while (in != null) {
                try {
                    System.out.println(in.readUTF());
                } catch (IOException e) {
                }
            }
        } // run
    }
}





▶ 실행결과




참고서적 : 자바의 정석


Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

파일 리스트 조회하기[이클립스]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.io.*;
 
public class CreateFile2 //파일 조회
{
    public static void main(String[] args)
    {
        String fname = "src/chap11/two";
        File f = new File(fname);
        
        File[] files = f.listFiles();
        
        for (int i = 0, j=0; i < files.length; i++)
        {
            if(files[i].getName().endsWith(".java"))        //끝에 .java 파일이 있으면 출력
            {
                System.out.println(j++ +1 +" . " + files[i].getName());
            }
        }
    }
}



결과



Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

구글링을 통해 JAVA를 활용한 한글 인코딩 처리에 대해 자료를 찾아봤는데 정확하고 좋은 자료가 많지 않았다.


위 블로그에서는 자바에서 String은 UTF-8로 취급된다..고 언급하고 있다.

그러나 내가 해보니 JAVA 프로그램 소스 파일의 인코딩을 따라가는 것 같다.
소스파일이 MS949 방식이면 파일 입출력에서도 MS949 방식을 따른다.

따라서 인코딩 형식이 UTF-8 포맷의 소스파일에서 파일 입력과 출력을 MS949 형식으로 된 것을 하려면 이렇게 해야한다.




1
2
3
4
5
6
7
8
9
10
//파일 입력
FileInputStream fileInputStream = new FileInputStream(filePath);
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "MS949");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
 
 
//파일 출력
FileOutputStream fileOutputStream = new FileOutputStream(filePath);
OutputStreamWriter OutputStreamWriter = new OutputStreamWriter(fileOutputStream, "MS949");
BufferedWriter bufferedWriter = new BufferedWriter(OutputStreamWriter);

 
 
따라서 MS949 인코딩으로 된 텍스트 파일을 읽어서 UTF-8 로 저장하고 싶다면, 위에는 MS949, 아래엔 UTF-8로 입력부와 출력부를 잡아주면 된다.


Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

  1. import javax.swing.JFrame;  
  2. import javax.swing.JPanel;  
  3. import java.awt.Color;  
  4.   
  5. public class ChangeJFrameBackgroundColour  
  6. {  
  7. public static void main(String[]args)  
  8. {  
  9.  JFrame a=new JFrame("CHANGE BACKGROUND COLOUR");  
  10.   
  11.  //Now we will try change it's value  
  12.  Color b=new Color(120,255,0);  
  13.   
  14.  JPanel c=new JPanel();  // 이렇게 컬러값을 생성 후
  15.  c.setBackground(b);     // 센 백그라운드에 넣어준다
  16.   
  17.  a.add(c);  
  18.  a.setSize(600,200);  
  19.  a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  20.  a.setVisible(true);  
  21.   
  22.  //I hope you enjoy  
  23.  //Bye  
  24. }  
  25. }  


Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거