ex> 서버와 클라이언트 구성 (채팅 참고)

1) 서버를 먼저 실행하고 

2) 클라이언트를 실행한다. 클라이언트에서 입력하면 서버에서 받아 화면에 뿌려준다. 


1. server

MyServer01.java

package test02.net;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

class ReceiveServer extends Thread{  //데이터를 수신하는 스레드

    private Socket sock;

    public ReceiveServer(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 SendServer extends Thread{//데이터를 보내는 스레드

    private Socket sock;

    public SendServer(Socket sock){

        this.sock=sock;

    }

    public void run(){

        //키보드로 문자열 입력받기위한 스트림객체 생성

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

        try{

            //문자열을 상대방에 보내기위한 스트림객체 생성

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

            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 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("클라이언트가 접속했습니다.");

            //데이터(문자열)를 전송받는 스레드 실행

            new ReceiveServer(sock).start();

            //데이터(문자열)를 보내는 스레드 실행

            new SendServer(sock).start();

            server.close();

        }catch(IOException ie){

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

        }

    }

}


 

 





2. client

MyClient01.java

package test02.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 ReceiveClient extends Thread{//서버에서 보내온 데이터를 수신하는 스레드

    private Socket sock;

    public ReceiveClient(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 SendClient extends Thread{

    private Socket sock;

    public SendClient(Socket sock){

        this.sock=sock;

    }

    public void run(){

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

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

        try{

            //상대방에 데이터를 보내기위한 스트림객체생성

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

            while(true){

                String msg=br.readLine();//키보드로 문자열 입력받기

                if(msg.equals("exit")) break;//while끝내기

                pw.println(msg);//상대방에 문자열 보내기

                pw.flush();

            }

            pw.close();

            sock.close();

        }catch(IOException ie){

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

        }

    }

}

public class MyClient01 {

    public static void main(String[] args) {

        Socket sock=null;

        try{

            sock=new Socket("127.0.0.1",3000);

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

            //데이터를 읽어오는 스레드 실행하기

            new ReceiveClient(sock).start();

            //데이터를 보내는 스레드 실행하기

            new SendClient(sock).start();

        }catch(UnknownHostException ue){

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

        }catch(IOException ie){

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

        }

    }

}


클라이언트에서 입력 

 


서버쪽에 화면에 넘어온 값을 출력한다. 

 

'JAVA' 카테고리의 다른 글

AWT ( Frame / Button / Layout / JPanel ) - 간단한 예제  (0) 2014.09.13
Network - 파일전송 ( Ⅳ )  (0) 2014.09.12
Network ( Ⅱ )  (0) 2014.09.12
Network ( Ⅰ )  (0) 2014.09.12
스레드(Thread)  (0) 2014.09.12

 

1. server


ex> MyServer01.java

package test01.net;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.PrintWriter;

import java.net.InetAddress;

import java.net.ServerSocket;

import java.net.Socket;

public class MyServer01 {

    public static void main(String[] args) {

        ServerSocket server=null;

        //키보드로부터 문자열을 입력받기 위한 스트림객체 얻어오기

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

        try{

            server=new ServerSocket(3000);

            System.out.println("서버가 실행됨");

            Socket sock=server.accept();

            System.out.println("클라이언트가 접속했습니다.");

            

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

            InetAddress ia=sock.getInetAddress();

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

            System.out.println("접속자 ip:" + ia.getHostAddress());

            

            //상대방에 데이터를 보내기위한 스트림객체 얻어오기

            OutputStream os=sock.getOutputStream();

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

            PrintWriter pw=new PrintWriter(os);

            

            //상대방(클라이언트)가 보낸 데이터를 읽어오기 위한 스트림 얻어오기

            InputStream in=sock.getInputStream();

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

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

            

            while(true){

                //상대방(클라이언트)가 보낸 문자열 읽어오기

                String msg=br.readLine();

                if(msg==null){

                    System.out.println("상대방이 접속을 해제했습니다.");

                    break;

                }

                System.out.println("상대방이보낸문자열>>" + msg);

                System.out.println("클라이언트에 보낼 메시지입력");

                String str=br1.readLine();//키보드로부터 문자열 입력받기

                if(str.equals("exit")){

                    System.out.println("접속을 종료합니다.");

                    break;

                }

                pw.println(str);//상대방(클라이언트)에 문자열 보내기

                pw.flush();//버퍼가 다 차지않아도 데이터 보내기

            }

            br.close();//스트림닫기

            pw.close();//스트림닫기

            sock.close();//소켓종료

            server.close();//서버소켓종료

        }catch(IOException ie){

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

        }

    }

}

 


2. client


ex> MyClient01.java

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.Socket;

import java.net.UnknownHostException;

import java.io.OutputStream;

public class MyClient01 {

    public static void main(String[] args) {

        Socket sock=null;

        //키보드로 문자열을 입력받기 위한 스트림객체 생성

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

        try{

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

            //상대방에 데이터를 보내기위한 출력스트림 얻어오기

            OutputStream out=sock.getOutputStream();

            //1바이트처리스트림을 2바이트처리스트림으로 포장하기

            PrintWriter pw=new PrintWriter(out);

            //상대방이 보낸 데이터를 읽어오기위한 스트림 얻어오기

            InputStream in=sock.getInputStream();

            //1바이트처리스트림을 2바이트 처리스트림으로 포장하기

            BufferedReader sbr=new BufferedReader(new InputStreamReader(in));

            

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

            

            while(true){

                System.out.println("서버로 보낼문자열 입력");

                String msg=br.readLine();//키보드로 문자열 입력받기

                if(msg.equals("exit")){

                    System.out.println("서버와 접속을 종료합니다.");

                    break;

                }

                pw.println(msg);//상대방(서버)에 msg보내기

                pw.flush();//버퍼가 차지 않아도 데이터 내보내기

                String str=sbr.readLine();//상대방이 보낸 문자열 읽어오기

                if(str==null){//상대방이 접속을 종료한경우

                    System.out.println("상대방이 접속을 끊었습니다.");

                    break;

                }

                System.out.println("상대방이 보낸 문자열>>"+str);

            }

            sbr.close();//스트림닫기

            pw.close();//스트림닫기

            sock.close();//소켓닫기

        }catch(UnknownHostException ue){

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

        }catch(IOException ie){

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

        }

    }

}





[ 서버프로그램 ]

 - 클라이언트가 접속해오면 클라이언트의 아이피주소를 출력하고 클라이언트의 아이피주소를 클라이언트에 보내기

[ 클라이언트프로그램 ]

 - 서버에 접속하고 서버가 보내온 아이피주소(클라이언트의 아이피주소)를 읽어와 화면에 출력하기


ex> Quiz01 

server >>

package test01.net;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.PrintWriter;

import java.net.InetAddress;

import java.net.ServerSocket;

import java.net.Socket;


public class Quiz01 {

    public static void main(String[] args) {

        ServerSocket server=null;

        try{

            server=new ServerSocket(3001);

            System.out.println("서버실행");

            Socket sock=server.accept();

            System.out.println("클라이언트가 접속함");

            InetAddress ia=sock.getInetAddress();

            //클라이언트의 아이피주소 얻어오기

            String ip=ia.getHostAddress();

            System.out.println("접속한 클라이언트 ip주소:" + ip);

            //상대방에 데이터를 보내기(출력)하기위한 스트림 생성하기

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

            //상대방에 ip주소 보내기

            pw.println(ip);

            pw.flush();

            //스트림닫기

            pw.close();

            //소켓닫기

            sock.close();

            server.close();

            System.out.println("서버가 종료되었어요~~~");

        }catch(IOException ie){

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

        }

    }

}

 

 

client>>

package test01.net;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.Socket;

import java.net.UnknownHostException;

public class Quiz01_client {

    public static void main(String[] args) {

        Socket sock=null;

        try{

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

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

            //서버가 보내온 데이터를 받기위한 스트림객체 생성

            BufferedReader br=

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

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

            String ip=br.readLine();

            System.out.println("서버가 보내준 내 ip주소:" + ip);

            br.close();//스트림닫기

            sock.close();//소켓닫기

        }catch(UnknownHostException ue){

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

        }catch(IOException ie){

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

        }

    }

}

 

 

 

 

3. 아이피 주소 얻어오기


ex> Test01_InetAddress.java

package test01.net;

import java.net.InetAddress;

import java.net.UnknownHostException;

public class Test01_InetAddress {

    public static void main(String[] args) {

        //public static InetAddress getByName(String host)

        //throws UnknownHostException

        try{

            InetAddress ia=InetAddress.getByName("www.naver.com");

            //호스트명에 해당하는 아이피주소 얻어오기

            String ip=ia.getHostAddress();

            System.out.println("naver ip주소:" + ip);

            InetAddress local=InetAddress.getLocalHost();

            System.out.println("local ip주소:" +local.getHostAddress());

        }catch(UnknownHostException ue){

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

        }

    }

}

 




 

 

'JAVA' 카테고리의 다른 글

Network - 파일전송 ( Ⅳ )  (0) 2014.09.12
Network - 채팅 샘플 ( Ⅲ )  (0) 2014.09.12
Network ( Ⅰ )  (0) 2014.09.12
스레드(Thread)  (0) 2014.09.12
재귀 메소드  (0) 2014.09.12

 

[ 서버프로그램 ]


1. server


 - 클라이언트의 접속을 받아들이는 프로그램


 - 서버프로그램의 작성단계

 1) ServerSocket 생성(포트번호필요)

 2) 클라이언트의 접속대기

 3) 클라이언트가 접속해오면 접속을 허용하고 클라이언트와 데이터를 주고받는 Socket생성(accept()메소드)

 4) Socket을 통해 클라이언트와 데이터 주고 받기

 5) 접속종료(소켓닫기)

 


ex> MyServer.java

package test01.net;

import java.io.IOException;

import java.io.InputStream;

import java.net.ServerSocket;

import java.net.Socket;


public class MyServer {

    public static void main(String[] args) {

        ServerSocket server=null;

        Socket sock=null;

        try{

            //1.서버소켓 생성하기

            server=new ServerSocket(3000);

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


            //2.클라이언트의 접속을 대기하고 클라이언트가 접속해오면 

            //이를 받아들이고 Socket을 생성하기

            sock=server.accept();

            System.out.println("클라이언트가 접속했어요!");


            //상대방으로부터 데이터를 받기위한 스트림객체 얻어오기

            InputStream in=sock.getInputStream();

            byte b[]=new byte[1024];


            //상대방이 보내온 데이터를 읽어와 b배열에 저장.n에는

            //읽어온바이트수크기가 저장된다.

            int n=in.read(b);


            //b배열의 0번째부터 전송한 크기만큼만 String객체로 만들기

            String ss=new String(b,0,n);


            //전송받은 문자열을 화면에 출력하기

            System.out.println("클라이언트가 보내온 메시지:"+ ss);

            

            //4. 접속종료(소켓닫기)      

            sock.close();

            server.close();

        }catch(IOException ie){

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

        }

        System.out.println("프로그램이 종료합니다.");

    }

}

 




[ 클라이언트 프로그램 ]


2. client


 - 서버에 접속하는 프로그램

 - 클라이언트 프로그램 작성단계

 1) Socket을 이용하여 서버에 접속(ip주소,포트번호 필요)

 2) Socket을 이용하여 데이터 주고받기(이때 stream을 사용한다.)

 3) 접속끊기(소켓종료)



 

ex>  MyClient.java

package test01.net;

import java.io.IOException;

import java.io.OutputStream;

import java.net.Socket;

import java.net.UnknownHostException;


public class MyClient {

    public static void main(String[] args) {

        Socket sock=null;

        try{

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

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


            String msg="반가워요 서버~";


            //상대방에 데이터를 보내기위한 스트림객체 얻어오기

            OutputStream os=sock.getOutputStream();


            //String객체를 바이트배열로 변환해서 데이터 보내기->os가 1바이트처리

            //스트림이므로

            os.write(msg.getBytes());

            os.flush();//버퍼가 다 차지 않아도 데이터 보내라.

            System.out.println("메시지 보내기 성공!");

            

            //소켓닫기

            sock.close();

        }catch(UnknownHostException ue){

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

        }catch(IOException ie){

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

        }

    }

}



 

 

'JAVA' 카테고리의 다른 글

Network - 채팅 샘플 ( Ⅲ )  (0) 2014.09.12
Network ( Ⅱ )  (0) 2014.09.12
스레드(Thread)  (0) 2014.09.12
재귀 메소드  (0) 2014.09.12
File 클래스  (0) 2014.09.12

 

1. 스레드(Thread) 


- 하나의 응용프로그램에서 여러개의 작업을 경량의 프로세스로 나누어 실행하는것


- 시간이 오래지연되는 작업이나,동시에 실행되어야 하는 작업이 있을때 스레드로 만든다.

 예) 파일복사하기(시간이지연되는작업), 파일다운로드받기(동시에다운받기)

     프린터로출력하기,게임프로그램에서 이미지를동시에이동하기,...


- 만드는 방법


방법1) Thread클래스를 상속받아 만들기

     - Thread클래스를 상속받아 run메소드를 오버라이딩한다.

       스레드를 실행할때는 start메소드를 사용한다.


방법2) Runnable인터페이스를 상속받아 만들기



ex>1.스레드클래스 상속받아 만들기.

package test02.thread;

//방법1)

//1.스레드클래스 상속받기

class MyPrinter extends Thread{

    //2.run메소드 오버라이딩하기

    public void run(){

        for(int i=1;i<=1000;i++){

            System.out.print("프린터로 출력중.....");

            if(i%10==0) System.out.println();

        }

    }

}

public class Test01_Thread {

    public static void main(String[] args){

        //스레드객체 생성하기

        MyPrinter mp=new MyPrinter();


        //스레드로 구동하기==>start메소드가 

        // 내부적으로 run메소드호출

        mp.start();


        //printer();

        for(int i=1;i<=1000;i++){

            System.out.print("문서작업중.....");

            if(i%10==0) System.out.println();

        }

    }

    /-

    public static void printer(){

        for(int i=1;i<=1000;i++){

            System.out.print("프린터로 출력중.....");

            if(i%10==0) System.out.println();

        }

    }*-

}

 


ex>

package test02.thread;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.Scanner;

public class Test02_Thread{


    public static void main(String[] args){


        Scanner scan=new Scanner(System.in);


        while(true){

            System.out.println("1.파일복사 2.디렉토리크기 3.종료");

            int n=scan.nextInt();

            switch(n){

                case 1:filecopy();break;

                case 2:long size=getSize(new File("c:\\java"));

                       System.out.println("디렉토리크기:" + size +"bytes");

                       break;

                case 3:System.exit(0);

            }

        }

    }


    //파일복사하는 기능

    public static void filecopy(){

        try{

            FileInputStream fis=new FileInputStream("c:\\java\\java.exe");

            FileOutputStream fos=new FileOutputStream("c:\\java\\copy.exe");

            byte[] b=new byte[50];

            int n=0;

            while((n=fis.read(b))!=-1){

                fos.write(b,0,n);

            }

            fos.close();

            fis.close();

            System.out.println("[[[[[[[[[  파일복사성공!!!!   ]]]]]]]]]]]]");

        }catch(IOException ie){

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

        }

    }

    public static long getSize(File f){

        long size=0;

        File list[]=f.listFiles();

        for(File ff:list){

            if(ff.isFile()){

                size+=ff.length();

            }else{

                size+=getSize(ff);

            }

        }

        return size;

    }

}

 

 

 

ex>

package test02.thread;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.Scanner;


class FileCopyThread extends Thread{

    public void run(){

        try{

            FileInputStream fis=new FileInputStream("c:\\java\\java.exe");

            FileOutputStream fos=new FileOutputStream("c:\\java\\copy.exe");

            byte[] b=new byte[50];

            int n=0;

            while((n=fis.read(b))!=-1){

                fos.write(b,0,n);

            }

            fos.close();

            fis.close();

            System.out.println("[[[[[[[[[  파일복사성공!!!!   ]]]]]]]]]]]]");

        }catch(IOException ie){

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

        }

    }

}

public class Test03_Thread {

    public static void main(String[] args) {

        Scanner scan=new Scanner(System.in);

        while(true){

            System.out.println("1.파일복사 2.디렉토리크기 3.종료");

            int n=scan.nextInt();

            switch(n){

                case 1:FileCopyThread thread=new FileCopyThread();

                       thread.start();

                       break;

                case 2:long size=getSize(new File("c:\\java"));

                       System.out.println("디렉토리크기:" + size +"bytes");

                       break;

                case 3:System.exit(0);

            }

        }    

    }

    

    public static long getSize(File f){

        long size=0;

        File list[]=f.listFiles();

        for(File ff:list){

            if(ff.isFile()){

                size+=ff.length();

            }else{

                size+=getSize(ff);

            }

        }

        return size;

    }

}

 

 


ex> 방법2 >>

package test02.thread;

//1. Runnable 인터페이스 상속받기

class FileCopy implements Runnable{

    //2. run메소드 오버라이딩하기

    public void run() {

        for(int i=1;i<=100;i++){

            System.out.println("파일복사중...");

            try{

                //스레드를 1초동안 지연시키기

                Thread.sleep(1000);

            }catch(InterruptedException ie){

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

            }

            if(i%10==0) System.out.println();

        }

        System.out.println("파일복사완료!!!!");

    }

}

public class Test04_Runnable {


    public static void main(String[] args) {    

        //3. Runnable자식객체 생성

        FileCopy fc=new FileCopy();


        //4. Thread클래스를 이용해서 스레드로 구동시키기

        Thread th=new Thread(fc);


        th.start();

        //new Thread(fc).start();


        for(int i=1;i<=100;i++){

            System.out.println("문서작업중...");

            try{

                Thread.sleep(1000);//1초동안 스레드 지연시키기

            }catch(InterruptedException ie){

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

            }

            if(i%10==0) System.out.println();

        }

    }

}





ex>  1초에 한번씩 현재 시간을 얻어와 출력하는 스레드와

1초에 한번씩 난수를 얻어와 출력하는 스레드를 만들고 실행시켜 보세요.


package test02.thread;

import java.util.Calendar;

import java.util.Random;


class TimeThread extends Thread{

    public void run() {

        while(true){

            Calendar cal=Calendar.getInstance();

            String t=cal.get(Calendar.HOUR_OF_DAY) + "시" +

                     cal.get(Calendar.MINUTE) +"분" +

                     cal.get(Calendar.SECOND) +"초";

            System.out.println(t);

            try{

                Thread.sleep(1000);

            }catch(InterruptedException ie){

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

            }

        }

    }

}

class RndThread implements Runnable{

    public void run(){

        Random rnd=new Random();

        while(true){

            int n=rnd.nextInt(100);

            System.out.println("난수:"+ n);

            try{

                Thread.sleep(1000);

            }catch(InterruptedException ie){

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

            }

        }

    }

}

public class Quiz01 {

    public static void main(String[] args) {

        //TimeThread tt=new TimeThread();

        //tt.start();

        new TimeThread().start();

        new Thread(new RndThread()).start();

    }

}



 

ex> Message.java

package test01.thread;
//스레드간에 공유하게 될 클래스
public class Message {
    private String msg="";
    public boolean status=false;
    public void setMsg(String msg){
        this.msg+=msg;
    }
    public String getMsg(){return msg;}
}

Test01_useMsg.java
package test01.thread;
class ReadThread extends Thread{
    private Message msg;
    public ReadThread(Message msg){
        this.msg=msg;
    }
    public void run(){
        for(char a='A';a<='Z';a++){
            msg.setMsg(String.valueOf(a));
        }
        System.out.println("Message객체에 저장 완료!");
    }
}
class WriteThread extends Thread{
    private Message msg;
    public WriteThread(Message msg){
        this.msg=msg;
    }
    public void run(){
        System.out.println("다운로드된 데이터를 출력합니다.");
        System.out.println(msg.getMsg());
    }
}
public class Test01_useMsg {
    public static void main(String[] args) {
        Message msg=new Message();//공유자원이 될 객체
        //스레드생성하기
        ReadThread rt=new ReadThread(msg);
        WriteThread wt=new WriteThread(msg);
        //스레드 구동하기(start메소드로 스레드 구동!!!)
        rt.start();
        wt.start();
    }
}
 
 
 


[ 스레드의 동기화 ]
- 하나의 자원(객체)을 여러개의 스레드가 공유해서 사용할때 하나의 스레드가 객체를 사용중이면 다른 스레드는 사용할 수 없으며 락(lock)을 걸어두는것.
- 동기화처리방법

  방법1) 
  동기화해야할 객체를 synchronized블록으로 묶기
   synchronized(공유객체){
   ...
   }

   방법2)
  동기화될 객체 자체에서 동기화 처리하기-동기화메소드로 만들기
   public synchronized 리턴형 메소드명(매개변수,..){
   ..
   }

ex2> 동기화처리 방법2) 공유자원 객체 자체에서 동기화 처리하기(동기화메소드)
Message.java
package test02.sync;
//스레드간에 공유하게 될 클래스
//동기화처리 방법2) 공유자원 객체 자체에서 동기화 처리하기(동기화메소드)
public class Message {
    private String msg="";
    private boolean status=false;
    public synchronized void setMsg(String msg){
        for(int i=0;i<100000000;i++);//시간지연
        this.msg+=msg;
        status=true;//작업이 완료됨을 표시
        notify();//wait()로 대기중인 객체를 깨움
    }
    public synchronized String getMsg(){
        if(status==false){//아직 임시저장소에 저장하는 작업이 완료되지 않았다면
            try{
                wait();//notify()로 신호가 올때까지 대기상태가 됨
            }catch(InterruptedException ie){}
        }
        return msg;
    }
}

Test02_synchronized.java
package test02.sync;
import test01.thread.Message;

class ReadThread extends Thread{
    private Message msg;
    public ReadThread(Message msg){
        this.msg=msg;
    }
    public void run(){
        //공유자원객체(msg)를 synchronized 블록으로 묶기
        //블록이 끝날때까지 다른 스레드는 msg를 사용하지 못하고 대기상태가 된다.
        synchronized (msg) {
            System.out.println("임시저장소에 데이터를 저장하기 시작!");
            for(char a='A';a<='Z';a++){
                msg.setMsg(String.valueOf(a));
                for(int i=1;i<=1000000000;i++);//시간지연하기
            }
            System.out.println("Message객체에 저장 완료!");
            msg.status=true;//작업이 완료됨을 표시
            msg.notify();//wait중인 다른 스레드를 깨움.
        }
    }
}
class WriteThread extends Thread{
    private Message msg;
    public WriteThread(Message msg){
        this.msg=msg;
    }
    public void run(){
        synchronized(msg){
            if(msg.status==false){//임시저장소에 저장하는 작업이 아직 안끝났으면
                try{
                    msg.wait();//notify로 신호가 올때까지 대기하기
                }catch(InterruptedException ie){
                    System.out.println(ie.getMessage());
                }
            }
            System.out.println("다운로드된 데이터를 출력합니다.");
            System.out.println(msg.getMsg());
        }
    }
}
public class Test02_synchronized {
    public static void main(String[] args) {
        Message msg=new Message();//공유자원이 될 객체
        ReadThread rt=new ReadThread(msg);
        WriteThread wt=new WriteThread(msg);
        rt.start();
        wt.start();
    }
}


Test03_synchronized.java
package test02.sync;
class ReadThread1 extends Thread{
    private Message msg;
    public ReadThread1(Message msg){
        this.msg=msg;
    }
    public void run(){
        msg.setMsg("아리랑");
        System.out.println("Message객체에 저장 완료!");
    }
}
class WriteThread1 extends Thread{
    private Message msg;
    public WriteThread1(Message msg){
        this.msg=msg;
    }
    public void run(){
        System.out.println("다운로드된 데이터를 출력합니다.");
        System.out.println(msg.getMsg());
    }
}
public class Test03_synchronized {
    public static void main(String[] args) {
        //공유자원객체 생성
        Message obj=new Message();
        //스레드 실행하기
        new ReadThread1(obj).start();
        new WriteThread1(obj).start();
    }
}


Test04_ThreadStop.java
package test02.sync;
class MyThread extends Thread{
    private boolean stop=true;
    public void setStop(boolean stop){
        this.stop=stop;
    }
    @Override
    public void run() {
        while(stop){
            System.out.println("1.스레드로 작업수행중!");
            System.out.println("2.스레드로 작업수행중!");
            System.out.println("3.스레드로 작업수행중!");
            System.out.println("스레드로 작업완료!");
        }
    }
}
public class Test04_ThreadStop {
    public static void main(String[] args) {
        MyThread th=new MyThread();
        th.start();
        try{
            //2초후 스레드 지연하기
            Thread.sleep(2000);
        }catch(InterruptedException ie){
            System.out.println(ie.getMessage());
        }
        th.setStop(false);//스레드 멈추기
    }
}




 


 

 

'JAVA' 카테고리의 다른 글

Network ( Ⅱ )  (0) 2014.09.12
Network ( Ⅰ )  (0) 2014.09.12
재귀 메소드  (0) 2014.09.12
File 클래스  (0) 2014.09.12
자바 IO ( Ⅱ )  (0) 2014.09.12

 

1. 재귀메소드 


- 자기자신을 호출하는 메소드


ex>재귀메소드를 사용해서 팩토리얼값 구하는 예제

package test01.file;

public class Test04_재귀메소드 {


    public static void main(String[] args){

        int n=4;

        //팩토리얼값 구해오기

        int num=fac(n);

        System.out.println(n+"!="+num);

    }

    public static int fac(int n){

        return (n>1)?n*fac(n-1):n;

    }

}

 

 





ex> c:\\java\\test 폴더를 삭제해 보세요.


package test01.file;

import java.io.File;

public class Quiz01 {


    public static void main(String[] args){


        File f=new File("c:\\java\\test");

        if(f.exists()){

            //test폴더안의 파일목록들 얻어오기

            File[] list=f.listFiles();

            for(File ff:list){

                if(ff.isFile()){

                    //디렉토리 안의 파일지우기

                    ff.delete();

                }

            }

            if(f.delete()){

                System.out.println("디렉토리 삭제 성공!");

            }

        }

    }

}

 

 



ex> c:\\java\\test 폴더를 삭제해 보세요. 

test폴더안에는 파일도 존재하고 디렉토리도 존재한다.

==>재귀메소드를 사용해 보세요.. 

package test01.file;

import java.io.File;


public class Quiz02 {


    public static void main(String[] args){


        File f=new File("c:\\java\\test");

        if(delDir(f)){

            System.out.println("디렉토리 삭제 성공");

        }else{

            System.out.println("디렉토리 삭제 실패");

        }

    }

    public static boolean delDir(File f){

        //디렉토리 안의 목록들 얻어오기

        File []list=f.listFiles();


        //디렉토리 안의 목록들을 삭제하기

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

            //목록이 파일이면

            if(list[i].isFile()){

                //파일삭제하기

                list[i].delete();

            }else{

                //목록이 디렉토리면

                //자신의메소드호출

                //(디렉토리안의목록들을삭제하기위해)

                delDir(list[i]);

            }

        }


        //자기자신의 폴더 삭제하기

        if(f.delete()){

            return true;

        }else{

            return false;

        }        

    }

}

 

 

 

 

 

ex>c:\\java\\test 폴더의 크기를 구해 보세요.

- 쉬운방법 : test폴더에 파일만 존재하는 경우

- 어려운방법 : 폴더안에 또 폴더가 존재하는 경우


package test01.file;

import java.io.File;


public class Quiz03 {

    public static void main(String[] args){

        File f=new File("c:\\java\\test");

        long size=getDirSize(f);

        System.out.println("디렉토리 크기:" + size +"bytes");

    }


    public static long getDirSize(File f){

        long fsize=0;

        File[] list=f.listFiles();

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

            if(list[i].isFile()){

                fsize+=list[i].length();

            }else{

                fsize+=getDirSize(list[i]);

            }

        }

        return fsize;

    }

}   

 

 



 

 

'JAVA' 카테고리의 다른 글

Network ( Ⅰ )  (0) 2014.09.12
스레드(Thread)  (0) 2014.09.12
File 클래스  (0) 2014.09.12
자바 IO ( Ⅱ )  (0) 2014.09.12
자바 IO - Stream ( Ⅰ )  (0) 2014.09.12

+ Recent posts