네트워크 Socket 통신
public void run(){
go();
}
public void go(){
System.out.println("-0-;");
}
}
public class ThreadTester {
public static void main(String[] args){
Runnable threadJob = new MyRunnable();
Thread myThread = new Thread(threadJob);
myThread.start();
}
- 클라이언트와 서버 APP는 Socket 연결을 통해서 통신한다.
- Socket은 서로 다른 물리적인 시스템 두 개에서 실행될 가능성이 있는 애플리케이션 두 개사이의 연결을 나타낸다.
- 클라이언트는 서버 애플리케이션의 IP주소와 TCP포트 번호를 알아야 한다.
- TCP포트는 특정 서버 애플리케이션에 할당된 16비트 부호가 없는 정수이다. TCP 포트 번호는 서로 다른 클라이언트가 똑같은 시스템에 접속하여 그 시스템에서 돌아가고 있는 서로 다른 애플리케이션과 통신을 할 수 있게 해주는 역할을 한다.
- 클라이언트에서 서버 Socket을 만드는 방법으로 서버에 연결을 한다.
Socket s = new Socket("127.0.0.1",4200);
- 일단 연결되고 나면 클라이언트는 소켓으로부터 입력 및 출력 스트림을 얻을 수 있다. 이런 스트림은 저수준 '연결' 스트림이다.
sock.getInputStream();
- 서버로부터 텍스트 데이터를 읽고 싶다면 Socket으로부터 가져온 입력 스트림에 연쇄된 InputStreamReader와 이와 연쇄된 BufferReader를 만들면 된다.
- InputStreamReader는 바이트를 받아서 텍스트 데이터로 변환해주는 '다리' 역할을 하는 스트림이다. 주로 고수준의 BufferedReader와 저수준의 Socket 입력 스트림 사이에 들어가는 가운데 고리 역할을 한다.
- 서버로 텍스트 데이터를 보낼 때는 소켓의 출력 스트림에 직접 연쇄된 PrintWriter를 만들면 된다. 이 객체의 Print() 또는 println()메소드를 호출하면 서버로 String을 보낼 수 있다.
- 서버에서는 특정 포트 번호로 들어오는 클라이언트 요청을 기다리기 위해 ServerSocket을 사용한다.
- ServerSocket으로 요청이 들어오면 그 클라이언트와 Socket 연결을 함으로써 그 요청을 수락한다.
스레드
- thread는 자바에서의 실행 스레드를 의미한다.
- 자바에서는 스레드마다 각각의 호출 스택이 있다.
- 대문자 T로 시작하는 Therad는 java.lang.Thread 클래스를 의미한다. Thread 객체는 실행 스레드를 나타낸다.
- Thread에는 처리할 작업, 즉 해야할 일이 있어야 한다. Thread에서 처리할 작업은 Runnable 인터페이스를 구현하는 클래스의 인스턴스로 지정할 수 있다.
- Runnable 인터페이스에는 메소드가 run() 하나밖에 없다. 새로운 Call stack의 맨 밑으로 들어가는 것이 바로 이 메소드이다. 즉 새롱누 스레드에서 가장 먼저 실행되는 것이 바로 run()메소드이다.
- 새로운 스래드를 시작하려면 Thread의 생성자에 전달 할 Runnable 객체가 필요하다.
- Thread의 인스턴스를 만들긴 했는데 아직 start() 메소드를 호출하지 않았으면 그 스레드는 아직 새 스레드 상태에 있다고 부른다.
- (Thred 객체의 start() 메소드를 호출하여) 스레드를 시작하면 새로운 stack이 생성되며 Runnable의 Run()메소드가 stack 맨 아래에 들어간다. 그러면 그 스레드는 이제 실행되기를 기다리고 있는 실행 가능한 상태가 된다.
- JVM의 스레드 스케줄러에 의해 현재 실행중인 스레드로 선택 받으면 그 스레드는 실행중인 상태가 된다. 프로세서가 하나뿐인 시스템에서는 현재 실행중인 스레드가 하나밖에 있을 수 없다.
- 스레드가 실행 중인 상태에서 봉쇄된 상태로 옮겨지는 경우도 있다. 스트림으로부터 들어오는 데이터를 기다리고 있을 때, 대기 상테로 들어갔을 때, 객체에 대한 잠금이 해제되기를 기다리고 있을 때와 같은 상황에서 스레드가 봉쇄돌 수 있다.
- 스레드 스케줄링은 어떤 특정한 방식으로 작동한다는 보장이 없기 때문에 모든 스레드가 공평하게 기회를 부여받을 수 있으리라는 가정은 하지 말아야 한다. 스레드를 주기적으로 대기 상태로 전화시키는 방식으로 순번이 돌아가는 것에 영향을 미칠 수는 있다.
스레드 예제 소스
public void run(){
go();
}
public void go(){
System.out.println("-0-;");
}
}
public class ThreadTester {
public static void main(String[] args){
Runnable threadJob = new MyRunnable();
Thread myThread = new Thread(threadJob);
myThread.start();
}
}
'개발 이야기 > 유용한 Coding' 카테고리의 다른 글
간단한 ChatClient (0) | 2008.05.14 |
---|---|
자바관련 잡다한 이야기 - 스레드의 동기화 문제 (1) | 2008.05.14 |
자바관련 잡다한 이야기 - 인터페이스와 다형성 (0) | 2008.05.13 |
자바관련 잡다한 이야기 - 상속성과 다양성 핵심정리 (0) | 2008.05.11 |
자바관련 잡다한 이야기 - static과 final (0) | 2008.05.05 |