동기/비동기
- 멀티스레드 프로그래밍에서 동기화는 하나의 데이터에 대한 동시 접근을 하나의 스레드로 한정한다는 의미
- 비동기 호출을 지원하는 디자인 패턴은 다양함(Future, Observer, Callback, Reactor)
- netty는 비동기 호출을 위한 API들을 프레임워크 레벨에서 제공하므로 개발자가 스레드 동기화 이슈를 신경쓰는 대신 구현할 기능에 집중할 수 있다.
블로킹/논블로킹 소켓
- 블로킹은 요청한 작업이 성공하거나 에러가 발생하기 전까지 응답을 돌려주지 않는 것
- 논블로킹은 요청한 작업의 성공 여부와 상관없이 바로 결과를 돌려주는 것
- 블로킹 소켓과 논블로킹 소켓은 데이터 송수신을 위한 함수의 동작 방식에 따른 분류
블로킹 소켓
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class BlockingServer {
public void run() throws IOException {
ServerSocket server = new ServerSocket(8888);
System.out.println("접속 대기중");
while(true) {
Socket socket = server.accept();
System.out.println("클라이언트 연결됨");
OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream();
while(true) {
try {
int request = in.read();
out.write(request);
} catch (IOException e) {
break;
}
}
}
}
}
- 디버그 모드로 실행하면 server.accept()에서 멈춘다.
- 연결되는 클라이언트가 없으면 프로그램은 아무런 동작도 하지 않으며 스레드는 해당 함수의 완료를 기다리며 대기한다.
telnet localhost 8888
- 서버에 접속하면 accept() 실행이 완료되고 클라이언트와 연결된 소켓을 생성한다.
- 데이터를 읽기 위한 read 명령에서 다시 멈추게 되고 클라이언트로부터 데이터가 수신되기를 기다리면서 스레드가 블로킹된다.
이벤트 기반 프로그래밍