1.  이벤트처리


-이벤트: 윈도우상에서 발생되는 여러사건--> 마우스클릭,키보드누름,마우스움직임,버튼클릭,윈도우가실행될때,윈도우가 닫힐때,..


-이벤트처리: 이벤트가 발생되었을때 적절한 처리를 하는것 예)버튼을 누르면 메시지출력,윈도우종료버튼을 누르면 프로그램종료,..



[ 자바에서의 이벤트 처리 ]


 1)이벤트가 발생되었을때 어떤 작업을 할건지에 대한 이벤트 리스너 만들기 --> 발생될 이벤트에 따라 해당 이벤트리스너가 정해져 있음


 예)키보드 누름 --> KeyListener

    마우스움직임 --> MouseMotionListener

    버튼클릭 --> ActionListener

        ..


 2) 이벤트 리스너 객체 생성하기


 3) 이벤트가 발생될 객체(이벤트소스)에 이벤트리스너 연결하기.




2

MyTest02.java

package test01;

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JTextField;


class MyFrame02 extends JFrame {

    JLabel lbl1 = new JLabel("이름 입력");

    JTextField txt = new JTextField(10);

    JButton btn1 = new JButton("출력");

    JLabel lbl2 = new JLabel("입력 된 이름:");

    JPanel pan = new JPanel();

    public MyFrame02() {

        setLayout(new GridLayout(2, 1));

        pan.add(lbl1);

        pan.add(txt);

        pan.add(btn1);

        // pan.setBackground(Color.RED);

        add(pan);

        add(lbl2);

        setSize(400, 150);

        setVisible(true);


        // 1.이벤트리스너 만들기

         // 이벤트리스너 만들기

        class MyEvent implements ActionListener {

            // 버튼을 눌렀을 때 처리해야 할 일을 작성

            @Override

            public void actionPerformed(ActionEvent e) {

                // 입력 된 텍스트 얻어오기

                String str = txt.getText();


                // JLabel에 입력 된 텍스트 보이기

                lbl2.setText("당신의 이름은 " + str + "입니다.");

            }

        }


        // 2. 이벤트리스너객체 생성

        MyEvent me = new MyEvent();

        // 3. 버튼에 이벤트리스너 등록

        btn1.addActionListener(me);

    }

}

public class MyTest02 {

    public static void main(String[] args) {

        new MyFrame02();

    }

}



 

 





3. List


ex> MyTest03_List.java

package test01;

import java.awt.BorderLayout;

import java.awt.List;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.JTextField;

class MyFrame03 extends JFrame implements ActionListener {

    JTextField txt = new JTextField(10);

    JButton btn = new JButton("추가");

    JButton btnDel = new JButton("삭제");

    List list = new List();

    JPanel pan = new JPanel();

    public MyFrame03() {


        // JPanel에 컴포넌트 붙이기

        pan.add(new JLabel("회원이름"));

        pan.add(txt);

        pan.add(btn);

        pan.add(btnDel);

        // 프레임 레이아웃 설정하기

        setLayout(new BorderLayout());


        // pan을 North영역에 붙이기

        add(pan, BorderLayout.NORTH);


        // list를 Center영역에 붙이기

        add(list, BorderLayout.CENTER);

        // 버튼에 이벤트 등록하기

        btn.addActionListener(this);

        btnDel.addActionListener(this);

        setSize(400, 400);

        setVisible(true);

    }

    @Override

    public void actionPerformed(ActionEvent e) {

        // 입력된 이름을 List에 추가

        if (e.getSource() == btn) {


            // 입력된 텍스트 얻어오기

            String name = txt.getText();


            // List에 입력된 텍스트 추가하기

            list.add(name);


            // 텍스트필드내용지우기

            txt.setText("");


            // 텍스트필드에 포커스주기

            txt.requestFocus();


        } else if (e.getSource() == btnDel) {

        // 선택한 항목을 List에서 제거

            // List의 선택한 항목의 index값 얻어오기

            int pos = list.getSelectedIndex();

            

            // 선택한 항목이 없는 경우

            if (pos == -1) {

                JOptionPane.showMessageDialog(this, "삭제할항목을 선택하세요!");


                // 메소드끝내기

                return;

            }

            list.remove(pos);

        }

    }

}

public class MyTest03_List {

    public static void main(String[] args) {

        new MyFrame03();

    }

}



 

 





EX> 이벤트 리스트 등록하는 3가지 방법이 존재. 결과는 동일함.

package test01;


import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;


import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JTextField;


class QuizFram01 extends JFrame{


    JTextField txt1 = new JTextField(5);

    JTextField txt2 = new JTextField(5);

    JTextField txt3 = new JTextField(5);

    JLabel lbl1 = new JLabel("+");

    JLabel lbl2 = new JLabel("=");

    

    JButton btn1 = new JButton("덧셈");

    JPanel pan1 = new JPanel();

    JPanel pan2 = new JPanel();

    

    public QuizFram01(){

        pan1.add(txt1);

        pan1.add(lbl1);

        pan1.add(txt2);

        pan1.add(lbl2);

        pan1.add(txt3);

        

        setLayout(new GridLayout(2, 1));

        add(pan1);

        add(btn1);


//  방법1

//        class ButtonEvent implements ActionListener{

//            public void actionPerformed(ActionEvent e){

//                int c = Integer.parseInt(txt1.getText());

//                int d = Integer.parseInt(txt2.getText());

//                

//                txt3.setText( String.valueOf(c+d) );

//            }

//        }

//        ButtonEvent be = new ButtonEvent();

//        btn1.addActionListener(be);

        

// 방법2        

//        ActionListener act = new ActionListener() {

//            @Override

//            public void actionPerformed(ActionEvent e) {

//                int c = Integer.parseInt(txt1.getText());

//                int d = Integer.parseInt(txt2.getText());

//                

//                txt3.setText( String.valueOf(c+d) );

//            }

//        };

//        btn1.addActionListener(act);

        

        // 방법3

        btn1.addActionListener(new ActionListener() {

            @Override

            public void actionPerformed(ActionEvent e) {

                int c = Integer.parseInt(txt1.getText());

                int d = Integer.parseInt(txt2.getText());

                

                txt3.setText( String.valueOf(c+d) );

            }

        });        

        

        setSize(400,100);

        setVisible(true);

        

    }

}

public class Quiz01 {

    public static void main(String[] args) {

        new QuizFram01();

    }

}



 

 






4. JRadioButton



ex> 라디오버튼 클릭하면 색깔이 변경된다.

package test01;

import java.awt.Color;

import java.awt.Container;

import java.awt.FlowLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;

import javax.swing.JFrame;

import javax.swing.JRadioButton;

class MyFrame04 extends JFrame implements ActionListener {

    JRadioButton rb1 = new JRadioButton("빨강");

    JRadioButton rb2 = new JRadioButton("파랑");

    JRadioButton rb3 = new JRadioButton("노랑");


    // RadioButton을 그룹으로 묶는 객체

    ButtonGroup gb = new ButtonGroup();

    Container con;

    public MyFrame04() {


        // 버튼그룹에 라디오버튼 담기

        gb.add(rb1);

        gb.add(rb2);

        gb.add(rb3);


        // 콘텐츠영역 얻어오기

        con = getContentPane();

        con.setBackground(Color.ORANGE);

        setLayout(new FlowLayout());

        con.add(rb1);

        con.add(rb2);

        con.add(rb3);

        rb1.addActionListener(this);

        rb2.addActionListener(this);

        rb3.addActionListener(this);

        setSize(400, 300);

        setVisible(true);

    }

    @Override

    public void actionPerformed(ActionEvent e) {

        if (e.getSource() == rb1) {

            con.setBackground(Color.RED);

        } else if (e.getSource() == rb2) {

            con.setBackground(Color.BLUE);

        } else if (e.getSource() == rb3) {

            con.setBackground(Color.YELLOW);

        }

    }

}

public class MyTest04{

    public static void main(String[] args) {

        new MyFrame04();

    }

}


 

 





5. Adapter


[ 어댑터클래스 ]

- 이벤트를 처리할때 이벤트리스너를 상속받으면 리스너가 인터페이스이므로 모든 메소드를 오버라이딩해야 한다. 이는 매우 불편하므로 자바에서는 어댑터클래스를 제공한다. 어댑터클래스는 이벤트리스너를 상속받아 모든 메소드를 오버라이딩한 클래스이다. 사용자는 어댑터클래스를 상속받아 필요한 메소드만 오버라이딩하여 필요한 기능만 구현하면 된다.

 

예)

 WindowListener --> WindowAdapter

 KeyListener --> KeyAdapter

 ...




ex> MyTest05_Adapter.java

윈도우를 종료하면 종료로그를 화면에 찍는다.

package test01;

import java.awt.event.WindowEvent;

import java.awt.event.WindowListener;

import javax.swing.JFrame;

class MyFrame05 extends JFrame {

    public MyFrame05() {

        setSize(400, 400);

        setVisible(true);

        class MyWindow implements WindowListener {

            @Override

            public void windowOpened(WindowEvent e) {

            }

            @Override

            public void windowClosing(WindowEvent e) {

                System.out.println("윈도우를 종료해요!");

                System.exit(0);

            }

            @Override

            public void windowClosed(WindowEvent e) {

            }

            @Override

            public void windowIconified(WindowEvent e) {

            }

            @Override

            public void windowDeiconified(WindowEvent e) {

            }

            @Override

            public void windowActivated(WindowEvent e) {

            }

            @Override

            public void windowDeactivated(WindowEvent e) {

            }

        }

        // 프레임의 윈도우 리스너 등록하기

        addWindowListener(new MyWindow());

    }

}

public class MyTest05_Adapter{

    public static void main(String[] args) {

        new MyFrame05();

    }

}



 

  

 

     




ex> addWindowListener메소드를 바로 호출해서 사용하는 예(결과는 동일하다.)

package test01;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import javax.swing.JFrame;


class MyFrame06 extends JFrame{

    public MyFrame06() {

        setSize(400,400);

        setVisible(true);


//        WindowAdapter wa=new WindowAdapter(){

//            @Override

//            public void windowClosing(WindowEvent e) {

//                System.out.println("윈도우를 종료해요.");

//                System.exit(0);

//            }

//        };

//        addWindowListener(wa);


        addWindowListener(new WindowAdapter(){

            @Override

            public void windowClosing(WindowEvent e) {

                System.out.println("윈도우를 종료해요.");

                System.exit(0);

            }

        });

    }

}

public class MyTest06_Adapter {

    public static void main(String[] args) {

        new MyFrame06();

    }

}

 






6. MouseMotionAdapter


ex> 마우스를 움직이면 마우스의 x,y좌표가 출력된다.

MyTest07_MouseMotionAdapter.java

package test01;

import java.awt.BorderLayout;

import java.awt.Canvas;

import java.awt.Color;

import java.awt.event.MouseEvent;

import java.awt.event.MouseMotionAdapter;

import javax.swing.JFrame;

import javax.swing.JLabel;


class MyFrame07 extends JFrame {

    JLabel lbl = new JLabel("현재 마우스 좌표:");

    Canvas cvs = new Canvas();

    public MyFrame07() {

        setSize(500, 500);

        setVisible(true);

        setLayout(new BorderLayout());

        cvs.setBackground(Color.yellow);

        add(lbl, BorderLayout.NORTH);

        add(cvs, BorderLayout.CENTER);

        MouseMotionAdapter ma = new MouseMotionAdapter() {

            public void mouseMoved(MouseEvent e) {

                // 마우스 x 좌표 얻어오기

                int x = e.getX();

                int y = e.getY();

                String str = "x좌표:" + x + ",y좌표:" + y;


                // lbl에 문자열 넣기

                lbl.setText(str);

            }

        };


        // Canvas에 이벤트리스너 등록하기

        cvs.addMouseMotionListener(ma);

        // 종료버튼을 누르면 프로그램 종료하기

        setDefaultCloseOperation(EXIT_ON_CLOSE);

    }

}

public class MyTest07_MouseMotionAdapter{

    public static void main(String[] args) {

        new MyFrame07();

    }

}






7. TextArea


ex> MyTest08_TextArea.java 화면 내용을 파일로 저장

package test01;

import java.awt.BorderLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.FileNotFoundException;

import java.io.PrintWriter;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JOptionPane;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

class MyFrame08 extends JFrame {

    JButton btn = new JButton("파일로저장");

    JButton btnEnd = new JButton("종료");

    JTextArea ta = new JTextArea();

    public MyFrame08() {

        setLayout(new BorderLayout());

        add(btn, BorderLayout.NORTH);

        add(new JScrollPane(ta), BorderLayout.CENTER);

        add(btnEnd, BorderLayout.SOUTH);

        // 종료버튼 눌렀을때

        btnEnd.addActionListener(new ActionListener() {

            @Override

            public void actionPerformed(ActionEvent e) {


                // 부모컴포넌트, 보여줄메시지,  타이틀, 버튼형태

                int ch = JOptionPane.showConfirmDialog(null,

                        "종료할까요?",

                        "종료",

                        JOptionPane.YES_NO_OPTION

                        );

                 // 사용자가 '예' 버튼을 선택한 경우

                if (ch == JOptionPane.YES_OPTION) {

                     // 프로그램 종료하기

                    System.exit(0);

                }

            }

        });

        // 버튼을 눌렀을때의 이벤트 처리

        btn.addActionListener(new ActionListener() {

            @Override

            public void actionPerformed(ActionEvent e) {

                // 텍스트에리어에 입력된 문자열 얻어오기

                String str = ta.getText();

                try {

                    String fileName = JOptionPane.showInputDialog("저장할 파일명 입력");


                    // 파일에 출력하기위한 스트림객체 얻어오기

                    PrintWriter pw = new PrintWriter(fileName);


                    // 파일로 저장하기

                    pw.println(str);


                    // 스트림닫기

                    pw.close();

                    JOptionPane.showMessageDialog(null, "파일로저장성공!");

                } catch (FileNotFoundException fe) {

                    System.out.println(fe.getMessage());

                }

            }

        });

        setSize(500, 500);

        setVisible(true);

        setDefaultCloseOperation(EXIT_ON_CLOSE);

    }

}

public class MyTest08_TextArea{

    public static void main(String[] args) {

        new MyFrame08();

    }

}




 

 





8. Layout


ex> MyTest09_Layout.java

package test01;

import java.awt.BorderLayout;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;


class MyFrame09 extends JFrame {

    JButton btn1 = new JButton("버튼1");

    JButton btn2 = new JButton("버튼2");

    JButton btn3 = new JButton("버튼3");

    JButton btn4 = new JButton("버튼4");

    JPanel pan = new JPanel();

    public MyFrame09() {

        // 레이아웃매니져 사용안하기

        setLayout(null);

        pan.setLayout(new BorderLayout());

        pan.add(btn4, BorderLayout.NORTH);

        // 컴포넌트의 사이즈가 위치를 일일이 지정해 줘야 한다.

        btn1.setSize(100, 50);

        btn2.setSize(100, 50);

        btn3.setSize(100, 100);

        // 버튼의 위치 설정하기

        btn1.setLocation(10, 10);

        btn2.setLocation(120, 10);

        btn3.setLocation(230, 10);

        add(btn1);

        add(btn2);

        add(btn3);

        setSize(400, 400);

        setVisible(true);

        setDefaultCloseOperation(EXIT_ON_CLOSE);

    }

}

public class MyTest09_Layout{

    public static void main(String[] args) {

        new MyFrame09();

    }

}



 




 

 

 

1.  내부클래스(inner class) 



- 클래스 또는 메소드 안에 또 다른 클래스를 만드는것(멤버로 클래스를 정의)


- 내부클래스는 외부클래스의 모든 멤버를 자신의 멤버처럼 사용가능 (private멤버접근 가능)


- static내부 클래스를 제외한 내부 클래스는 항상 외부 클래스 객체를 통해서 생성할 수 있다.

 


ex> Test01_inner.java

package test01;

import test01.OuterClass.InnerClass;

//외부클래스

class OuterClass{

    private int a=10;

    public void printa(){

        System.out.println("a:" +a);

    }

    public void printab(){

        InnerClass ic=new InnerClass();

        ic.print();

    }


    //내부클래스

    class InnerClass{

        private int b=20;

        public void print(){

            //내부클래스는 외부클래스의 private멤버까지도 맘대로 접근할 수 있다.

            System.out.println("a:" + a);

            System.out.println("b:"+b);

        }

    }

}

public class Test01_inner {

    public static void main(String[] args) {

        OuterClass oc=new OuterClass();

        oc.printab();


        //내부클래스 객체를 생성할때는 외부클래스 객체를 통해서 생성해야 한다.

        OuterClass.InnerClass aa=oc.new InnerClass();

        aa.print();

    }

}

 

 




2.  로컬내부 클래스 


- 메소드안에서 정의된 클래스(메소드안에서만 사용할 수 있다.)


- 외부클래스의 모든 멤버에 접근 가능(private멤버도 접근 가능)


- 지역변수는 접근 할 수 없지만 final로 선언된 상수는 접근 가능하다.


Ex> Test02_localInner.java

package test01;


class OuterClass1{


    private int a=10;


    public void test(){

        int b=20;

        final int d=40;


        class LocalInner{

            private int c=30;


            //내부클래스에서 static멤버는 선언할 수 없다.

            //private static int f=100;


            public void print(){

                System.out.println("a:" + a);


                //로컬내부클래스는 지역변수는 접근할 수 없다.

                //System.out.println("b:" + b);

                System.out.println("c:" + c);


                //final로 선언된 지역변수(상수)는 접근할 수 있다.

                System.out.println("d:" + d);

            }

        }

        LocalInner inner=new LocalInner();

        inner.print();

    }    

}

public class Test02_localInner {

    public static void main(String[] args) {

        

    }

}






3.  static 내부 클래스 


- 멤버변수에 static이 있으면 내부클래스로 static으로 만들어야 한다.


- static 내부클래스를 외부에서 생성하려면 Outer클래스객체의 생성없이 바로 생성할 수 있다.



ex> Test03_staticInner.java

package test01;


class OuterClass02{

    private int a=10;

    private static int b=20;


    static class InnerClass{

        private static int c=30;


        public void print(){

            //일반멤버변수(인스턴스변수)는 접근할 수 없음!

            //System.out.println("a:" + a);

            System.out.println("b:" + b);

            System.out.println("c:"+c);

        }

    }

    public void printAll(){

        //내부클래스 객체 생성

        InnerClass ic=new InnerClass();

        ic.print();

    }

}

public class Test03_staticInner {

    public static void main(String[] args) {

        //OuterClass02 oc=new OuterClass02();

        //oc.printAll();

        //static내부클래스 생성하기

        OuterClass02.InnerClass oi=new OuterClass02.InnerClass();

        oi.print();

    }

}

 


 


4. 익명의 내부 클래스(**) 


- 추상클래스나 인터페이스를 상속받아 딱 한번만 사용하고 버려질 클래스인경우 익명의 내부 클래스를 만들어 사용한다.


- 만드는 방법

   인터페이스(추상클래스) 객체명=new 인터페이스(){

       추상메소드오버라이딩(){..}

      ...

   };

 


ex> Test04_Anonymous.java

package test01;


interface Shape{

    void draw();

    void paint();

}

interface Message{

    void send(String msg);

}

public class Test04_Anonymous {

    public static void main(String[] args) {

        //Message를 익명의 내부클래스를 만들어 사용해 보세요.

        Message mm=new Message(){

            public void send(String msg){

                System.out.println(msg +" 를 이멜로 전송했습니다.");

            }

        };

        mm.send("test...");

        

        new Message(){

            public void send(String msg){

                System.out.println(msg+" 를 문자메시지로 보냈어요!");

            }

        }.send("ddd");

        

        //익명의 내부 클래스 만들기

        Shape sh=new Shape(){

            //추상메소드 오버라이딩

            public void draw(){

                System.out.println("사각형그리기");

            }

            public void paint(){

                System.out.println("사각형칠하기");

            }

        };

        sh.draw();

        sh.paint();

        

//        class Box implements Shape{

//            public void draw(){System.out.println("사각형그리기");}

//            public void paint(){System.out.println("사각형칠하기");}

//        }

//        Box bo=new Box();

//        bo.draw();

//        bo.paint();

//        

//        Box bo1=new Box();

    }

}




5.     

www.naver.com  url을 갖는 객체 생성 후 접속정보를 가져와 출력한다.


package test01.net;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.MalformedURLException;

import java.net.URL;

import java.net.URLConnection;


public class Test01_Url {

    public static void main(String[] args) {

        try{

            //URL에 대한 정보를 갖는 클래스

            URL url=new URL("http://www.naver.com");

            System.out.println("호스트명:" + url.getHost());

            System.out.println("포트:" + url.getPort());


            //URL에 접속한 정보를 갖는 클래스

            URLConnection uc=url.openConnection();

            System.out.println("mime타입:" + uc.getContentType());

            System.out.println("인코딩:" + uc.getContentEncoding());

            System.out.println("헤더정보:" + uc.getHeaderFields());


            //url접속을 통해 데이터를 읽어오기 위한 스트림 얻어오기

            InputStream is=uc.getInputStream();

            BufferedReader br=

                new BufferedReader(new InputStreamReader(is,"utf-8"));


            String str="";


            while((str=br.readLine())!=null){

                str=br.readLine();

                System.out.println(str);

            }

            br.close();

            

        }catch(MalformedURLException me){

            System.out.println(me.getMessage());

        }catch(IOException ie){

            System.out.println(ie.getMessage());

        }

    }

}



 

 

'JAVA' 카테고리의 다른 글

Swing ( Ⅱ )  (0) 2014.09.13
Swing ( Ⅰ )  (0) 2014.09.13
멀티 채팅 샘플  (0) 2014.09.13
AWT ( Frame / Button / Layout / JPanel ) - 간단한 예제  (0) 2014.09.13
Network - 파일전송 ( Ⅳ )  (0) 2014.09.12

 

1. 서버를 실행

2. 클라이언트1를 실행 : 대화명 입력. 입력

3. 클라이언트2를 실행 : 대화명 입력. 입력

4. 클라이언트3를 실행

..



1. server 



package test01.net;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.InetAddress;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.ArrayList;


//클라이언트가 보내온 메시지를 수신하고 다른 클라이언트들에게 수신된 메시지를 다시 보내는 스레드 

class EchoThread extends Thread{


    //모든 클라이언트와 연결된 Socket객체를 담은 객체 배열

    private ArrayList<Socket> list;


    //클라이언트와 연결된 Socket객체

    private Socket sock;

    private String name;//대화명


    public EchoThread(ArrayList<Socket> list,Socket sock){

        this.list=list;

        this.sock=sock;

    }

    public void run(){

        try{

            //소켓을 통해 데이터를 읽기위한 스트림 얻어오기

            InputStream is=sock.getInputStream();


            //1바이트처리스트림을 2바이트처리스트림으로 변환하기

            BufferedReader br=new BufferedReader(new InputStreamReader(is));


            //맨처음에 전송된 문자열은 무조건 대화명이 됨

            name=br.readLine();


            //다른 클라이언트들에게 입장 알리기

            sendMsg("["+ name+"]님이 입장하셨습니다.");


            while(true){

                //클라이언트가 보낸 메시지 읽어오기

                String msg=br.readLine();


                if(msg==null){//상대방이 종료한 경우

                    sendMsg("["+name+"]님이 퇴장하셨습니다.");

                    //ArrayList에서 클라이언트와 연결된 Socket제거하기

                    list.remove(sock);

                    //스트림닫기

                    br.close();

                    //소켓닫기

                    sock.close();

                    break;

                }

                //전달받은 메시지를 다른 클라이언트에 보냄

                sendMsg("["+name+"]"+msg);

            }

        }catch(IOException ie){

            System.out.println(ie.getMessage());

        }

    }

    public void sendMsg(String msg){

        for(int i=0;i<list.size();i++){

            //ArrayList에 담긴 Socket객체 꺼내오기

             Socket soc=list.get(i);


             //데이터를 수신받은 Socket객체가 아닌경우

             if(soc!=sock){

                 try{

                    //클라이언트에 데이터를 보내기 위한 출력스트림 얻어오기

                     PrintWriter pw=new PrintWriter(soc.getOutputStream());

 

                    //연결된 클라이언트에 데이터 보내기

                     pw.println(msg);

                     pw.flush();

                 }catch(IOException ie){

                     System.out.println(ie.getMessage());

                 }

             }

        }

    }

}

public class MultiChatServer{

    public static void main(String[] args) {

        ServerSocket server=null;


        //클라이언트와 연결된 Socket객체를 배열처럼 담기 위한 객체 생성

        ArrayList<Socket> list=new ArrayList<Socket>();


        try{

            server=new ServerSocket(3001);


            while(true){

                System.out.println("클라이언트 접속 대기중..");


                //클라인언트접속허용하기

                Socket sock=server.accept();


                //클라이언트의 아이피주소에 대한 정보를 갖는 객체 얻어오기

                InetAddress ia=sock.getInetAddress();


                //클라이언트의 아이피주소 출력하기

                System.out.println("ip주소["+ ia.getHostAddress() + "]가 접속함");


                //클라이언트와 연결된 Socket객체를 list에 담기

                list.add(sock);


                //데이터를 수신하는 스레드 실행하기

                new EchoThread(list, sock).start();

            }

        }catch(IOException ie){

            System.out.println(ie.getMessage());

        }

    }

}

 





2. client   


package test01.net;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.Socket;

import java.net.UnknownHostException;


//서버가 보내온 데이터를 읽어와 화면에 출력하는 스레드

class ReceiveThread extends Thread{

    private Socket sock;

    public ReceiveThread(Socket sock){

        this.sock=sock;

    }

    public void run(){

        try{

            //서버가 보내온 데이터를 읽어오기위한 스트림객체

            BufferedReader br=

              new BufferedReader(new InputStreamReader(sock.getInputStream()));


            while(true){

                //서버가 보내온 문자열 읽어오기

                String msg=br.readLine();

                if(msg==null){

                    System.out.println("접속이 종료되었어요..");

                    break;

                }

                System.out.println(msg);

            }

            br.close();

            sock.close();

        }catch(IOException ie){

            System.out.println(ie.getMessage());

        }

    }

}

//서버에 문자열을 보내는 스레드

class SendThread extends Thread{

    private Socket sock;

    public SendThread(Socket sock){

        this.sock=sock;

    }

    public void run(){


        //키보드로부터 입력받기 위한 스트림객체 생성

        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));    

        try{

            //서버에 데이터를 보내기위한 출력스트림객체 생성하기

            PrintWriter pw=new PrintWriter(sock.getOutputStream());    

            System.out.println("대화명입력");


            //제일먼저 키보드로 대화명입력받기

            String ss=br.readLine();


            //대화명 서버에 보내기

            pw.println(ss);

            pw.flush();


            while(true){

                //키보드로 문자열 입력받기

                String msg=br.readLine();

                if(msg.equals("exit")) break;


                //서버에 문자열 보내기

                pw.println(msg);

                pw.flush();

            }

            pw.close();

            sock.close();

        }catch(IOException ie){

            System.out.println(ie.getMessage());

        }

    }

}

public class MultiChatClient{

    public static void main(String[] args) {

        try{

            Socket sock=new Socket("192.168.0.2",3001);

            System.out.println("서버접속성공!");


            //서버에서 보내온 데이터를 수신하는 스레드 실행

            new ReceiveThread(sock).start();


            //서버에 데이터를 보내는 스레드 실행

            new SendThread(sock).start();

        }catch(UnknownHostException ue){

            System.out.println(ue.getMessage());

        }catch(IOException ie){

            System.out.println(ie.getMessage());

        }

    }

}




 

 

 

 

1. Frame



package test01.awt;

import java.awt.Frame;

import java.awt.Button;


public class Test01_Frame{

    public static void main(String[] args) {


        Frame frm=new Frame("나의첫번째프레임");

        

        //가로세로길이 설정

        frm.setSize(400,400);


        //화면에 보이기

        frm.setVisible(true);


        frm.add(new Button("버튼1"));

        frm.add(new Button("버튼2"));

    }

}


 


 




2. Button



package test01.awt;

import java.awt.Button;

import java.awt.FlowLayout;

import java.awt.Frame;


class MyFrame01 extends Frame{


    private Button btn1=new Button("버튼1");

    private Button btn2=new Button("버튼2");

    private Button btn3=new Button("버튼3");

    private Button btn4=new Button("버튼4");


    //레이아웃매니져 생성

    private FlowLayout layout=new FlowLayout();


    public MyFrame01(String title){

        super(title);

        

        setLayout(layout);

        

        add(btn1);

        add(btn2);

        add(btn3);

        add(btn4);

        

        //가로세로길이 설정

        setSize(400,400);


        //화면에 보이기

        setVisible(true);

    }

}

public class Test02_Frame{

    public static void main(String[] args) {

        new MyFrame01("나의 두번째 프레임");

    }

}


 


 




3.  layout 



package test01.awt;

import java.awt.BorderLayout;

import javax.swing.JButton;

import javax.swing.JFrame;


class MyFrame03 extends JFrame{


    JButton btn1=new JButton("버튼1");

    JButton btn2=new JButton("버튼2");

    JButton btn3=new JButton("버튼3");

    JButton btn4=new JButton("버튼4");

    JButton btn5=new JButton("버튼5");


    //레이아웃매니져 생성

    BorderLayout layout=new BorderLayout();


    public MyFrame03(){

        super("세번째 프레임");


        //프레임에 레이아웃매니져 설정하기

        setLayout(layout);


        //버튼을 5개 영역(동,서,남,북,가운데)에 배치하기

        add(btn1,BorderLayout.NORTH);

    //    add(btn2,BorderLayout.WEST);

        add(btn3,BorderLayout.EAST);

    //    add(btn4,BorderLayout.SOUTH);

        add(btn5,BorderLayout.CENTER);

        

        setSize(400,400);

        setVisible(true);

    }

}

public class Test03_BorderLayout{

    public static void main(String[] args) {

        new MyFrame03();

    }

}


 


 




4.  JPanel



package test01.awt;

import java.awt.BorderLayout;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JTextArea;


class MyFrame04 extends JFrame{


    JButton btn1=new JButton("버튼1");

    JButton btn2=new JButton("버튼2");

    JPanel pan=new JPanel();

    JTextArea ta=new JTextArea();


    public MyFrame04(){

        //패널에 버튼 붙이기

        pan.add(btn1);

        pan.add(btn2);

        

        //레이아웃 매니져 설정하기

        setLayout(new BorderLayout());


        //패널을 North영역에 붙이기

        add(pan,BorderLayout.NORTH);

        add(ta,BorderLayout.CENTER);

        

        setSize(400,400);

        setVisible(true);

    }

}

public class Test04_JPannel{

    public static void main(String[] args) {

        new MyFrame04();

    }

}


 


 




 

 

- 서버를 실행하고 
- 클라이언트에서 파일이름을 입력하면 해당 폴더로 파일이 전송

1. server

MyServer01.java
package test03.file;
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class MyServer01{
    public static void main(String[] args) {
        ServerSocket server=null;
        try{
            server=new ServerSocket(3000);
            System.out.println("클라이언트 접속대기중...");
            Socket sock=server.accept();
            System.out.println("클라이언트가 접속 했습니다.");
            //클라이언트가 보내온 데이터를 읽어오기위한 스트림객체 생성
            DataInputStream dis=new DataInputStream(sock.getInputStream());
            //제일먼저 보내온 파일명 읽어오기
            String fileName=dis.readUTF();
            //전송된 파일명으로 파일생성하기
            FileOutputStream fos=new FileOutputStream("c:\\down\\" + fileName);
            byte[] b=new byte[1024];
            int n=0;
            long fileSize=0;
            while((n=dis.read(b))!=-1){//전송된 데이터 읽어와 b배열에 저장
                //b배열의 데이터를 파일로 저장
                fos.write(b,0,n);
                fileSize+=n;//전송된 파일크기 구하기
            }
            //스트림닫기
            fos.close();
            dis.close();
            //소켓닫기
            sock.close();
            server.close();
            System.out.println("c:\\down폴더에" + fileSize +
                    "bytes크기의 파일수신 완료!");
        }catch(IOException ie){
            System.out.println(ie.getMessage());
        }
    }
}
 



2. client
MyClient01.java

192.168.0.2 --> 해당 서버의 주소. 로컬 pc에서 테스트할 경우 pc ip넣기.
package test03.file;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class MyClient01{
    public static void main(String[] args){
        try{
            Socket sock=new Socket("192.168.0.2",3000);
            System.out.println("서버접속성공!");

            Scanner scan=new Scanner(System.in);
            System.out.println("전송할 파일명 입력");

            String fileName=scan.next();
            File f=new File(fileName);

            //데이터를 전송하기 위한 스트림객체 생성하기
            DataOutputStream dos=new DataOutputStream(sock.getOutputStream());

            //제일먼저 파일명 보내기
            dos.writeUTF(f.getName());
            dos.flush();
            byte b[]=new byte[1024];
            int n=0;

            //파일에서 읽어오기 위한 스트림객체 생성
            FileInputStream fis=new FileInputStream(fileName);
            long fileSize=0;

            while((n=fis.read(b))!=-1){//파일에서 읽어와 b에 저장
                dos.write(b,0,n);//서버에 파일에서읽어온 데이터 보내기
                fileSize+=n;//파일크기 구하기
            }
            dos.close();//스트림닫기
            fis.close();//스트림닫기
            System.out.println(fileSize+"bytes 크기의 파일전송 완료!");
            sock.close();//소켓닫기
        }catch(UnknownHostException ue){
            System.out.println(ue.getMessage());
        }catch(IOException ie){
            System.out.println(ie.getMessage());
        }
    }
}
 


 

 

'JAVA' 카테고리의 다른 글

멀티 채팅 샘플  (0) 2014.09.13
AWT ( Frame / Button / Layout / JPanel ) - 간단한 예제  (0) 2014.09.13
Network - 채팅 샘플 ( Ⅲ )  (0) 2014.09.12
Network ( Ⅱ )  (0) 2014.09.12
Network ( Ⅰ )  (0) 2014.09.12

+ Recent posts