2학기 10주차_1

오늘의 힌트. 그래픽스 객체를 가져올때는 setVisible 이후에 와야한다.

○멀티쓰레드.
지금까지는 싱글쓰레드의 프로그램을 설계해왔다. 음.. 말하자면.. 단반향통신 이었는데.
이제 다중방향 통신을 한다고 생각하면 되겟다. ㅋㅋㅋㅋ
뭐..;; 난 통신과니까.
아무튼 쓰레드는 두가지 방법이 있다.



java.lang.Thread 클래스를 상속하는 방법
java.lang.Runnable 인터페이스를 구현하는 방법

이 두가지 방법인데..;;
상황에 맞게 상속하는걸 쓸것이냐 인터페이스 구현을 하느냐 하는 그정도 차이가 되겠다.
결국에는 리스너와 어댑터 정도의 차이인가 ㅡㅡㅋ
파고들면 아니긴 하지만 ㅋ

상속받는 경우에 Thread 클래스를 상속받은 클래스 에서는 run 메소드를 오버라이딩해서
정의한다. 그러면,,;;

run 메소드는 쓰레드가 실행될때 자동으로 실행이 된다. 흠.. ㅋㅋㅋ


예제문.
public class Study1112_1 {
 
 public static void main(String args[]){
  
  Thread thread = new ThreadExam();
  thread.start();
  for(int i =0 ; i <10 ; i++){
   try{
    Thread.sleep(1000);
   }catch(Exception e){}
   System.out.println("현재수:"+i);
  }
  
 }
}


class ThreadExam extends Thread{
 
 public void run(){
  
  for (int i = 100; i < 110 ; i++){
   try{
    Thread.sleep(1000);
   }catch(Exception e){}
   System.out.println("현재수:"+i);   
  }
  
 }
 
}

그냥.. 간단히 맛보기라고 할수 있겟다. 흠..;; ㅋㅋㅋ

Thread를 또 다른 클래스에서 상속받으면..;; 3중 숫자세기도 가능은 하다.

런어블을 구현해서 하는 멀티쓰레드는 그 클래스의 객체를 만들고
그 객체를 쓰레드 객체에 인수로 넣어 사용한다. 무슨말인지 이해가 잘안되겠지만..;;


  ThreadExam1 th = new ThreadExam1();
  Thread thread1 = new Thread(th);
  Thread thread2 = new ThreadExam2();
  thread1.start();
  thread2.start();

이런 식이다. 
runnable을 구현한 클래스 객체 생성
-> 다시 쓰레드객체생성
-> 쓰레드객체에 runnable을 구현한 클래스객체를 인수로 넣기
-> 객체명.start();

흠..
멀티쓰레드는 엄밀히 말해서 병렬적으로 진행이 되는것이기 때문에
어떤 한개의 목표를 두고 두개의 쓰레드가 경쟁을 할경우
둘다 목표를 취하는 경우등의 레이즈 상황이 발생하는데
이것을 주의하여 프로그래밍 해야겟다.


○네트워크프로그래밍

InetAddress 클래스
-특이한점이 객체를 생성할때 생성자를 호출하는게 아니라, 클래스내의 스태틱메소드를
호출하여 생성한다.

○소켓

getInputStream 하면 어떻게 읽어들이는가?


-ServerSocket 클래스

서버 프로그램에서만 사용하고 포트를 열고 연결 요청이 오기를 기다린다.
연결요청이 오면? 거기에 맞는 클라이언트 소켓을 생성하여 반환한다.

생성자는 다음과 같다.

ServerSocket(int port) 
port에 연결된 서버 소켓 생성. port는 1-65535 사이의 값 중에서 다른 프로그램이 사용하지 않는 값을 이용해야 한다.
ServerSocket(int port, int backlog)  
port에 연결된 서버 소켓 생성. backlog값은 동시에 연결대기 상태(SYN_RECVED)에 있을 수 있는 최대 수.

두개의 사용법중 아래는 별로 쓰지 않지만 위는 기본으로 알고 가야한다!!

메서드는 다음과 같다.

Socket accept() TCP 연결요청을 기다리다가 요청이 들어오면 소켓을 만들어 연결하고 그 소켓을 반환한다.
void close() ServerSocket을 닫고 사용되고 있는 모든 리소스를 해제한다.

서버프로그램은 서버소켓을 이용하여 포트를 열고 기다리고 클라이언트는 서버소켓으로 요청을 하고
서버소켓은 요청을 받으면 다른 소켓을 만들어 그 클라이언트와 연결하여 통신이 되도록 만든다.

(본그림의 저작권은 동양공업전문대학 김교일 교수님께 있음을 알려드립니다.)

이걸이용해서 간단하게 문자가 왓다갓다 하는 프로그램은..;;
흠...
import java.net.*;
import java.io.*;


class Client{
 private Socket csocket;
 
 public Client(String add, int port){
  
  try{
   
   csocket = new Socket(add,port);
   
  }catch(IOException e){
   System.out.println("예외처리:"+e.getMessage());
  }
  
 }
 
 public void Connection(){
     try{
        BufferedReader in = new BufferedReader(new
                                      InputStreamReader(csocket.getInputStream()));
        PrintWriter out = new PrintWriter(csocket.getOutputStream(),true);
        BufferedReader reader = new BufferedReader(
                      new InputStreamReader(System.in));
        while(true){
         String str = reader.readLine();
         if(str.equals("bye")) break;
         out.println(str);
        }
        csocket.close();
    } catch(IOException e){
        System.out.println("IOException: "+e.getMessage());
    }
  }

 
 
 
 
 
}

 

public class Study1116_4 {

 public static void main(String args[]){
  
        String add="203.237.163.177";
        int port=8088;
        if (args.length>0){
            add = args[0];
            port = Integer.parseInt(args[1]);
        }
        Client c =new Client(add,port);
        c.Connection();
        
 }  
}


=====================================


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


class TCPserver {
 private int port;
    private ServerSocket servSocket;
    private Socket clntSocket;
   
    public TCPserver(int port){
     
     this.port = port;
     
    }
   
    public void listen(){
     
     try{
      servSocket = new ServerSocket(port);
      clntSocket = servSocket.accept();
      
     }catch(IOException e){
      System.out.println("예외검출:"+e.getMessage());
     }
     
     
    }
   
    public void Connection(){
     
     try{
      
      BufferedReader in = new BufferedReader
      (new InputStreamReader(clntSocket.getInputStream()));
      PrintWriter out = new PrintWriter(clntSocket.getOutputStream(),true);      
      while(true){
    String str = in.readLine();
    if(str == null ) break;
    System.out.println("클라이언트: "+str);
      }
      clntSocket.close();
      
     }catch(IOException e){
      System.out.println("예외검출:"+e.getMessage());
     }    
    }     
}

public class Study1116_3{
 
 public static void main(String args[]){
  
  int port = 8088;
  if (args.length > 0){
   port = Integer.parseInt(args[0]);
  }
  TCPserver sv = new TCPserver(port);
  sv.listen();
  sv.Connection();
  
  
 }
 
 
 
}


대충 이렇게 해서 돌리면 문자가 왓다갓다하는 프로그램이 된다.
아니지 ㅡㅡㅋ
클라이언트에서만 되는거지 ㅡㅡㅋ ㅋ클라이언트가 하는말이
서버에 보이는거지 ㅋㅋㅋㅋ 아..;;
이거는 내가 구현할 프로젝트에서도 쓰이기 때문에 유용하다.

보면..;; 리슨에서 소켓을 만들고
커넥션에서 일을처리한다.
클라이언트는 보내고 서버는 화면에 뿌려주는.. ㅋㅋㅋㅋ
굉장히 단순하기 때문에
복잡할것이 없다.

서버나 클라이언트나 크게 다를건 없다.

단지 자바프로그래밍에 네트워크 분야가 나오니 좀 신선한듯..; ㅋㅋㅋ
채팅프로그램도 해야하는데..;;
꼭해봐야 하는데..;;

서버와 클라언트 부분을 이용해서 각부분을
서로 상호연동하겟금해주면..;;

쌍방향 통신도 어렵지 않을듯하다..; 실시간으로 통신을 하려면..;;
쓰레드를 이용해야 겠지?

자기가 입력 받는 차례라고 남이 입력하는거 안보이면 안되니까 ㅋㅋㅋ
흠..;;

분야는 점점 넓어지고.
안타깝네 ㅋㅋㅋ
열심히 공부하지 않으면..
안되겠어~ ㅋㅋ

이 글과 관련있는 글을 자동검색한 결과입니다 [?]

by 날아라숑카 | 2008/11/17 11:08 | 트랙백 | 덧글(1)

트랙백 주소 : http://dduckjava.egloos.com/tb/1114234
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 김교수 at 2008/11/20 17:41
쓰레드를 이용하는 것은 통신프로그램에서는 거의 반드시 필요하죠..

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶