728x90
https://jaeseo0519.tistory.com/168
[Network] TCP/IP Socket 통신
소켓의 존재를 올해 처음 네트워크 스터디를 통해 처음 알아보긴 했었는데, 여전히 알 것 같다가도 종종 헷갈릴 때가 많다. 그래도 이론을 모두 공부해두고 프로그래밍 단계로 넘어가니 나름 할
jaeseo0519.tistory.com
##############
소켓 통신에서 사용한 소켓(Socket)과 스트림(InputStream, OutputStream)은 꼭 close 해줘야 합니다.
💡 왜 close()가 필요할까?
소켓 통신에서 Socket은 내부적으로:
- 서버와 클라이언트 간의 연결(Connection)
- 데이터 송수신용 InputStream, OutputStream
을 관리합니다.
이 연결과 스트림은 운영체제(OS) 리소스를 점유하기 때문에,
- close()를 안 하면 → OS에 열려 있는 연결이 남아서 메모리 누수, 포트 고갈, 프로그램 오작동 발생
- close()를 해주면 → 연결 해제, 스트림 정리, OS 리소스 반환
결국, DB 커넥션과 비슷하게 반드시 닫아줘야 안전합니다.
##############
💡 Socket과 OutputStream의 차이
구분SocketOutputStream
역할 | 서버-클라이언트 간 연결(통신 채널) 담당 | 연결된 채널(Socket)을 통해 데이터 출력 담당 |
포함 관계 | Socket 안에 InputStream / OutputStream이 포함됨 | Socket.getOutputStream()으로 꺼내서 사용 |
예시 | Socket socket = new Socket("localhost", 8080); | OutputStream out = socket.getOutputStream(); |
닫기 | socket.close() → 스트림도 같이 닫힘 | out.close() → 해당 스트림만 닫힘 (Socket은 살아있을 수 있음) |
📦 그림으로 이해
scss
복사편집
[Socket] ├── InputStream (데이터 읽기) └── OutputStream (데이터 쓰기)
- Socket = 전화선
- OutputStream = 전화선에 대고 말하는 쪽 (데이터 보내는 쪽)
- InputStream = 전화선으로 들리는 쪽 (데이터 받는 쪽)
💡 Socket과 OutputStream의 차이
구분 Socket OutputStream
역할 서버-클라이언트 간 연결(통신 채널) 담당 연결된 채널(Socket)을 통해 데이터 출력 담당
포함 관계 Socket 안에 InputStream / OutputStream이 포함됨 Socket.getOutputStream()으로 꺼내서 사용
예시 Socket socket = new Socket("localhost", 8080); OutputStream out = socket.getOutputStream();
닫기 socket.close() → 스트림도 같이 닫힘 out.close() → 해당 스트림만 닫힘 (Socket은 살아있을 수 있음)
📦 그림으로 이해
scss
복사
편집
[Socket]
├── InputStream (데이터 읽기)
└── OutputStream (데이터 쓰기)
Socket = 전화선
OutputStream = 전화선에 대고 말하는 쪽 (데이터 보내는 쪽)
InputStream = 전화선으로 들리는 쪽 (데이터 받는 쪽)
주의
- socket.close() 하면 out도 자동으로 닫힘
- 하지만 out.close()만 하면 socket은 살아있을 수 있음 → 주의 필요
✅ 정리 한 줄 요약
Socket은 통신 연결이고, OutputStream은 그 연결 위에서 데이터를 쓰는 도구입니다.
###################
💡 socket.getOutputStream()이란?
socket.getOutputStream() →
소켓(Socket)에서 데이터를 내보내는 스트림(OutputStream)을 가져오는 메서드예요.
쉽게 말하면:
- Socket = 서버와 연결된 통신선
- OutputStream = 그 통신선으로 데이터를 보내는 파이프
이걸로 서버나 클라이언트로 데이터를 보낼 수 있습니다.
import java.io.*;
import java.net.*;
public class SimpleClient {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost", 8080);
OutputStream out = socket.getOutputStream();
String message = "Hello, server!";
out.write(message.getBytes()); // 문자열 → 바이트로 변환해서 전송
out.flush(); // 버퍼 강제 비움 (즉시 전송)
out.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
📌 주의할 점
- getOutputStream()은 한 번만 꺼내서 계속 쓰세요.
- 여러 번 꺼내는 것보다는 한 번만 꺼내서 계속 쓰는 게 좋아요.
- flush() 호출
- OutputStream은 내부에 버퍼(buffer)를 가지고 있어서 flush()로 강제로 내보내야 함.
- 닫을 때 순서
- out.close() → socket.close()
- 또는 socket.close()만 해도 out은 자동으로 닫힘.
####################
💡 API vs 소켓통신 비교
구분REST API (HTTP)Socket 통신 (예: TCP, WebSocket)
통신 방식 | 요청(Request)-응답(Response) 1회성 | 연결 유지(keep-alive) + 양방향 통신 가능 |
연결 관리 | 요청할 때마다 연결, 요청 끝나면 끊김 | 한 번 연결 후 계속 유지, 데이터 주고받음 |
용도 | 게시판, 쇼핑몰, 뉴스, API 서버 등 데이터 중심 서비스 | 채팅, 게임, 실시간 주식, 실시간 알림 같은 빠른 데이터 교환 |
속도/지연 | 상대적으로 느림 (HTTP 헤더, 반복 연결 비용) | 빠름 (연결 유지, 헤더 부담 적음) |
상태 관리 | Stateless (요청마다 독립) | Stateful (연결에 상태 유지 가능) |
📦 소켓통신을 쓰는 주된 이유
- 실시간성이 중요할 때
→ 채팅, 게임, 실시간 알림, 주식 트레이딩 등은 빠르게 데이터 주고받아야 해서 소켓이 유리함. - 양방향 통신 필요할 때
→ REST API는 클라이언트 → 서버로만 요청하고, 서버는 응답만 함.
→ 소켓은 클라이언트 ↔ 서버 양쪽에서 자유롭게 데이터 보낼 수 있음. - 지속적인 연결로 속도 최적화
→ HTTP는 요청할 때마다 연결, 헤더, 인증 등 오버헤드 발생.
→ 소켓은 한 번 연결하면 그다음부터는 오로지 데이터만 주고받음 → 훨씬 가벼움. - 상태 관리가 필요할 때
→ 예: 게임 서버에서 각 플레이어의 상태 유지, 채팅방에서 누가 있는지 관리
🚫 언제 API가 더 좋은가?
- 게시판, 쇼핑몰, 블로그 같은 “요청-응답만 있으면 충분한 서비스”
- 서버 확장, 보안, 장애 처리에서 HTTP 기반 솔루션이 더 쉽고 검증됨
✅ 한 줄 요약
소켓통신은 실시간성, 양방향, 빠른 속도, 상태 유지가 필요할 때 선택한다. API는 요청-응답 중심의 정적인 서비스에 적합하다.
728x90
'JAVA' 카테고리의 다른 글
얕은복사/깊은복사, 스택/힙, 가비지컬렉션 (0) | 2025.02.20 |
---|---|
Garbage Collection (0) | 2025.01.31 |
@Override의 의미 (0) | 2025.01.10 |
stream에 대한 궁금증 (0) | 2025.01.10 |
java 튜토리얼 (0) | 2024.11.14 |