❗️ 소켓 프로그래밍에 대한 기본 개념을 익히고, 데이터 직렬화/역직렬화 대해 알아보자
서버는 정보(데이터)나 서비스를 제공하는 쪽
👉 특징
클라이언트는 정보를 요청하는 쪽
👉 특징
대체로 하나의 Server와 다수의 Client로 이루어져 있다.
둘은
Request ↔ Response
방식으로 통신한다.
구조를 단순화하면 이렇게 된다👇
클라이언트(나, 사용자) → 요청(Request) → 서버
클라이언트(나, 사용자) ← 응답(Response) ← 서버
🔹 예시: 네이버 접속할 때
1. 브라우저(클라이언트): “네이버 메인 페이지 주세요!”
2. 네이버 서버: “여기 있습니다!” 하고 HTML, CSS, JS 파일 전달
3. 브라우저: 받아서 화면에 보여줌
컴퓨터와 컴퓨터를 연결하는 통신망
👉 예시
네트워크에서 서버와 클라이언트가 실제로 대화(데이터 교환)할 수 있게 해주는 창구
👉 특징
소켓들이 연동되고 나면 데이터 전송을 위한 스트림을 생성 가능하다.
1. 소켓(Socket)은 연결통로
2. 스트림(Stream)은 데이터 흐름통로
👉 즉, 소켓 + 스트림 = 실제 데이터 송수신 가능
3. TCP 소켓에서 스트림
InputStream
: 상대방이 보낸 데이터를 읽는 통로OutputStream
: 내가 상대방한테 데이터를 보내는 통로👉 프로그래밍적으로는 보통 이렇게 한다. 👇 (Java 예시)
Socket socket = new Socket("127.0.0.1", 8080);
// 보내는 스트림 (클라이언트 → 서버)
OutputStream out = socket.getOutputStream();
out.write("Hello Server".getBytes());
// 받는 스트림 (서버 → 클라이언트)
InputStream in = socket.getInputStream();
byte[] buffer = new byte[1024];
int len = in.read(buffer);
System.out.println("서버 응답: " + new String(buffer, 0, len));
socket.close();
4. 비유 🍔
InputStream
= 전화에서 내 귀로 들어오는 소리OutputStream
= 전화에서 내 입에서 나가는 소리import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) {
int port = 5000; // 서버 포트 번호
try (ServerSocket serverSocket = new ServerSocket(port)) {
System.out.println("서버가 시작되었습니다. 포트: " + port);
// 클라이언트 연결 대기
Socket socket = serverSocket.accept();
System.out.println("클라이언트 연결됨: " + socket.getInetAddress());
// 데이터 송수신 스트림 생성
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
// 클라이언트 메시지 받기
String message = in.readLine();
System.out.println("클라이언트로부터: " + message);
// 서버 응답 보내기
out.println("안녕 클라이언트! 나는 서버야 😎");
// 소켓 닫기
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) {
String host = "127.0.0.1"; // 서버 주소 (로컬호스트)
int port = 5000; // 서버 포트 번호
try (Socket socket = new Socket(host, port)) {
System.out.println("서버에 연결되었습니다.");
// 데이터 송수신 스트림 생성
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
// 서버에 메시지 보내기
out.println("안녕 서버! 나는 클라이언트야 🖐️");
// 서버 응답 받기
String response = in.readLine();
System.out.println("서버로부터: " + response);
// 소켓 닫기 (try-with-resources가 자동 닫음)
} catch (IOException e) {
e.printStackTrace();
}
}
}
Server
실행 → 포트 5000
에서 대기Client
실행 → 서버에 연결[서버]
서버가 시작되었습니다. 포트: 5000
클라이언트 연결됨: /127.0.0.1
클라이언트로부터: 안녕 서버! 나는 클라이언트야 🖐️
[클라이언트]
서버에 연결되었습니다.
서버로부터: 안녕 클라이언트! 나는 서버야 😎
ServerSocket
으로 대기 → 클라이언트가 연결하면 Socket
생성.Socket
으로 서버에 연결 시도.InputStream
/ OutputStream
으로 메시지를 주고받음.