성장 일기/쌍용교육센터 / / 2023. 1. 12. 13:03

0112/Socket, Thread

쌍용교육센터에서 공부한 내용을 정리하며 기록하는 글이고 주관적인 생각이 들어갈 수 있습니다.
잘못된 내용이나 피드백 및 생각 공유는 언제든 환영입니다.
댓글로 남겨주시면 확인 후 수정하겠습니다.
내용에 대한 소스 코드는 https://github.com/2jaehoon/ssangyonng.git에 올려두었습니다.

 

컴퓨터간 데이터를 주고 받기

  - 연결은 Socket을 사용하고

  - 데이터 송, 수신은 Stream을 사용한다.

public class Server(){
	// 1.서버에서 50000 포트 열기
	ServerSocket server = new ServerSocket(50000);
    // 3. 서버에 클라이언트 소켓이 들어오면 클라이언트 소켓을 받음
	Socket client = server.accept();
    // 4. 서버에 들어온 클라이언트 소켓에서 출력 스트림 얻기(클라이언트랑 서버 동시에 스트림 얻음)
    // packet이 1byte(8bit) 고정
	DataOutputStream dos  = new DataOutStream(client.getOutputStream());
    // 5. 서버에서 출력 스트림에 데이터 쓰기
	dos.writeUTF("한글"); //%xx%xx식으로 인코딩이 된다.
    // 6. 서버에서 목적지 Socket으로 분출해 접속된 소켓으로 전달
    dos.flush();
    // 8. 서버에 들어온 클라이언트 소켓에서 입력스트림 얻기(클라이언트랑 서버 동시에 스트림 얻음)
	DataInputStream dis = new DataInputStream(client.getInputStream());
	// 11. 서버에서 데이터 읽기
	String msg = dis.readUTF();
}

public class Client(){
	// 2.클라이언트에서 소켓 생성 후 서버로 접속을 시도
	Socket client = new Socket("서버ip",50000);
    // 4.클라이언트 소켓에서 입력스트림 얻기(클라이언트랑 서버 동시에 스트림 얻음)
    // packet이 1byte(8bit) 고정
	DataInputStream dis = new DataInputStream(client.getInputStream());
    // 7. 클라이언트에서 서버에서 보낸 데이터 읽기
	String msg = dis.readUTF();
	// 8. 클라이언트에서 출력스트림을 얻기(클라이언트랑 서버 동시에 스트림 얻음)
	DataOutputStream dos  = new DataOutStream(client.getOutputStream());
	// 9. 클라이언트에서 스트림에 데이터를 쓰기
	dos.writeUTF("한글");
	// 10.클라이언트에서 스트림이 데이터를 목적지로 분출
	dos.flush();
}

 

Thread

  - 동시에 일 즉 메서드를 수행해야 할 때 사용된다.

  - 작은 Process이고 Multi Thread를 지원한다.

  - 실행할 때마다 순서가 달라지고 종료시간을 알 수 없다.

  - 자바에서는 상속과 구현으로 사용할 수 있다.

  - 자바에서 Thread  사용법으로는 아래와 같다.

 

* Process

  - Process는 cpu 한 번에 처리하는 일의 단위이고

  - 사용자가 실행하는 프로그램,  OS가 필요에 의해 실행하는 프로그램이다.

 

* cpu scheduling

  - cpu scheduling은 시분할, 선점형으로 구분된다.

 

* 시분할(time sharing)

  - 시분할(time sharing)은 OS에서 사용되고 프로세스 이외에 작업관리자 필요하다.

 

* 선점형(running time)

  - 선점형(running time)은 Java에서 사용돠고 작업관리자가 필요 없고

    먼저 생성되는 Process가 먼저 처리되다가 순서가 섞인다.

 

* 상속으로 Thread 사용

// 1.Thread를 상속받는다.
public class Test extends Thread{

	//2. Run method override
	public void run(){
	//3. 동시에 실행되어야할 코드 작성
	}
}

public static void main(String[] args) {
	//4. 객체 생성
	//클래스명 객체명 = new 생성자();
	Test t = new Test();

	//5. start()를 호출하여 run()가 동시에 동작하도록 한다.
	t.start();
}

* 상속으로 Thread 사용

//1. Thread를 상속받는다.
public class UseThread extends Thread {

	// 2. run method를 Override
	@Override
	public void run() {
		// 3. Thread로 동작해야할 코드(동시에 실행되어야 할 코드)
		for (int i = 0; i < 1000; i++) {
			System.out.println("rum i =====> " + i);
		} // end for
	}// run

	public void work() {
		for (int i = 0; i < 1000; i++) {
			System.out.println("work i =====> " + i);
		} // end for
	}// work

	public static void main(String[] args) {
		// 4. 객체화
		UseThread ut = new UseThread();
		// 5. start method를 호출하여 Thread가 동작하도록 한다.
		ut.start(); //run에 있는 코드를 시작
		System.out.println("------------------"); //구분선
		ut.work();
	}// main
}// class

* Runnable interface 구현해 Thread 사용

// 1. Runnable interface를 구현
public class Test implements Runnable{

	//2. abstract method override
	public void run(){
	//3. Thread로 동작해야 할 코드
	}
}

	public static void main(String[] args) {
	//4. 클래스 객체화
	Test t = new test();

	//5. Runnable 구현한 객체와 has a로 Thread 클래스를 객체화한다.
	Thread th = new Thread(t);

	//6. Thread클래스의 start 호출(has a 관계의 객체가 구현한 run()가 호출)
	th.start();
	}
}

 

* Thread의 생명주기

  - Thread는 생명주기를 가진다. 

  - ready : Process에서 Thread가 생성되기 위해 준비하는 상태이다.

                 start(), yield()를 사용해 ready 상태에서 running 상태로 진행된다.

  - running : CPU를 사용하는 상태이다.

                     sleep(), wait()를 사용해 block으로 진행된다.

                     sleep()은 알아서 다시 block에 갔다가 오는데

                     wait()은 notify(), notifyAll()로 깨우고 다시 오게 해야함

                     stop()은 thread를 죽이는 것인데 쓰지 말라고 권장

  - block : CPU를 사용하지 않는 즉, 일을 수행하지 않는 상태이다.

  - dead : Thread가 죽는 상태이다. 프로그램 실행 중에 한 번 죽은 Thread는 다시 살아나지 못한다.

 

 

 

'성장 일기 > 쌍용교육센터' 카테고리의 다른 글

0116/DBMS  (0) 2023.01.16
0113/다 대 다 채팅  (0) 2023.01.16
0111/네트워크, 소켓 통신  (0) 2023.01.11
0110/Stream  (0) 2023.01.10
0109/Stream, File  (0) 2023.01.09
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유