일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 리눅스
- 자바
- Lv 2
- programmers
- db
- Kubernetes
- 쿠버네티스
- 정처기
- Java
- Python
- 알고리즘
- docker
- 파이썬
- 데이터베이스
- mysql
- 깃
- 코딩테스트
- github
- DevOps
- LV 0
- 자료구조
- 인공지능
- Linux
- 코테
- git
- 머신러닝
- Ai
- ubuntu
- 우분투
- 프로그래머스
Archives
- Today
- Total
Myo-Kyeong Tech Blog
[ JAVA ] 클라이언트 요청 순차적 처리 - Stateful VS Stateless 본문
728x90
반응형
Stateful 방식이란?
- 서버가 클라이언트의 상태 정보를 계속 유지하며 서버 간의 연결을 유지하는 방식
- 클라이언트가 요청을 보내면, 서버가 그 요청을 처리하고 클라이언트의 상태 정보를 업데이트
- 클라이언트가 다시 요청을 보낼 때 서버는 클라이언트 상태 확인하고 이를 기반으로 요청 처리
Stateful 방식 활용 예시
- 온라인 채팅 어플리케이션 : 온라인 채팅은 클라이언트 간 실시간 메시지 교환을 위해 상태 정보를 유지해야 합니다. 클라이언트가 채팅에 참여하고 있는 동안 상대방의 메시지를 수신하고 전송할 수 있어야 하므로, 클라이언트와 서버 간의 연결을 유지하는 Stateful 방식이 적합합니다.
- 온라인 게임 : 온라인 멀티플레이어 게임에서는 플레이어 간의 실시간 상호 작용과 게임 상태 정보를 유지해야 합니다. 플레이어의 위치, 점수, 아이템 보유 여부 등 게임 상태는 서버에서 관리되어야 하며, 클라이언트와 서버 간의 연결은 게임 세션 동안 유지되어야 합니다.
Stateful 방식 채팅 어플리케이션 구현 코드
[Client 코드]
import java.io.*;
import java.net.*;
public class StatefulChatClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 8888);
System.out.println("Connected to server.");
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
String message;
while ((message = reader.readLine()) != null) {
out.println(message);
String response = in.readLine();
System.out.println("Server response: " + response);
}
socket.close();
}
}
[Server 코드]
import java.io.*;
import java.net.*;
public class StatefulChatServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("Server started. Waiting for clients...");
while (true) {
Socket socket = serverSocket.accept();
System.out.println("Client connected: " + socket.getInetAddress().getHostAddress());
// Handle client request in a separate thread
Thread thread = new Thread(new ClientHandler(socket));
thread.start();
}
}
}
class ClientHandler implements Runnable {
private Socket socket;
public ClientHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try (
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
) {
String message;
while ((message = in.readLine()) != null) {
// Process the client message
String response = processMessage(message);
out.println(response);
}
} catch (IOException e) {
e.printStackTrace();
}
}
private String processMessage(String message) {
// Process and handle the client message
return "Server response: " + message;
}
}
Stateful의 경우, ClientHandler의 run() 메서드는 BufferedReader를 통해 클라이언트의 메시지를 읽은 후, 읽은 메시지를 처리하고 처리한 결과를 클라이언트에게 전송합니다. 이 과정은 클라이언트와의 연결을 유지하는 동안 반복적으로 이루어집니다. 따라서, 클라이언트와 서버 간의 상태를 유지하고 클라이언트의 요청을 순차적으로 처리합니다.
Stateless 방식이란?
- 서버가 클라이언트의 상태 정보를 유지하지 않는 통신 방식
- 클라이언트가 요청을 보낼 때마다 필요한 모든 정보를 함께 보내야 함
- 서버는 요청을 처리한 후 바로 클라이언트의 정보를 삭제하므로, 클라이언트의 연결 상태를 유지하지 않음
Stateless 방식 활용 예시
- RESTful API : RESTful API는 상태 정보를 유지하지 않고 클라이언트의 요청에 응답하는 Stateless 방식을 채택합니다. 클라이언트가 각각의 요청에 필요한 모든 정보를 함께 전송하므로 서버는 클라이언트의 상태를 유지하지 않습니다.
Stateless 방식 채팅 어플리케이션 구현 코드
[Client 코드]
import java.io.*;
import java.net.*;
public class StatelessChatClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 8888);
System.out.println("Connected to server.");
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
String message = reader.readLine();
out.println(message);
String response = in.readLine();
System.out.println("Server response: " + response);
socket.close();
}
}
[Server 코드]
import java.io.*;
import java.net.*;
public class StatelessChatServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("Server started. Waiting for clients...");
while (true) {
Socket socket = serverSocket.accept();
System.out.println("Client connected: " + socket.getInetAddress().getHostAddress());
// Handle client request in a separate thread
Thread thread = new Thread(new ClientHandler(socket));
thread.start();
}
}
}
class ClientHandler implements Runnable {
private Socket socket;
public ClientHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try (
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
) {
String message = in.readLine();
// Process the client message
String response = processMessage(message);
out.println(response);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private String processMessage(String message) {
// Process and handle the client message
return "Server response: " + message;
}
}
Stateless의 경우, ClientHandler의 run() 메서드는 한 번의 요청에 대해 한 번의 응답을 처리하는 단일 작업을 수행합니다. 클라이언트로부터 메시지를 한 번 읽은 후, 해당 메시지를 처리하고 처리된 결과를 클라이언트에게 전송하며 클라이언트와의 연결을 종료합니다. 이후 다른 클라이언트의 연결을 처리하기 위해 다시 accept() 메서드를 호출하며 대기합니다.
728x90
반응형
'Programming > Java' 카테고리의 다른 글
[ JAVA ] 스레드 풀(Thread Pool) - Java로 Thread Pool의 구현 및 서버 애플리케이션 활용 (0) | 2023.07.16 |
---|---|
[ JAVA ] 스레드 풀(Thread Pool) - Thread Pool을 사용해야 하는 이유 (0) | 2023.07.16 |
[ JAVA ] JAVA 예외 처리 (Exception) - Try-Catch-Finally 문법, 예외 메시지와 스택 추적 (0) | 2023.07.10 |
[ JAVA ] JAVA 익명 클래스(Anonymous Class) (0) | 2023.07.08 |
[ JAVA ] FileInputStream 확장하여 DataInputStream 클래스 구현하기 ( java.io.DataInputStream ) (0) | 2023.06.29 |