쌍용교육센터에서 공부한 내용을 정리하며 기록하는 글이고 주관적인 생각이 들어갈 수 있습니다.
잘못된 내용이나 피드백 및 생각 공유는 언제든 환영입니다.
댓글로 남겨주시면 확인 후 수정하겠습니다.
내용에 대한 소스 코드는 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 |