본문 바로가기
JAVA

Socket 통신

by Wanado 2025. 5. 8.
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();
        }
    }
}

 

 

📌 주의할 점

  1. getOutputStream()은 한 번만 꺼내서 계속 쓰세요.
    • 여러 번 꺼내는 것보다는 한 번만 꺼내서 계속 쓰는 게 좋아요.
  2. flush() 호출
    • OutputStream은 내부에 버퍼(buffer)를 가지고 있어서 flush()로 강제로 내보내야 함.
  3. 닫을 때 순서
    • out.close() → socket.close()
    • 또는 socket.close()만 해도 out은 자동으로 닫힘.

 

 

####################

 

💡 API vs 소켓통신 비교

구분REST API (HTTP)Socket 통신 (예: TCP, WebSocket)
통신 방식 요청(Request)-응답(Response) 1회성 연결 유지(keep-alive) + 양방향 통신 가능
연결 관리 요청할 때마다 연결, 요청 끝나면 끊김 한 번 연결 후 계속 유지, 데이터 주고받음
용도 게시판, 쇼핑몰, 뉴스, API 서버 등 데이터 중심 서비스 채팅, 게임, 실시간 주식, 실시간 알림 같은 빠른 데이터 교환
속도/지연 상대적으로 느림 (HTTP 헤더, 반복 연결 비용) 빠름 (연결 유지, 헤더 부담 적음)
상태 관리 Stateless (요청마다 독립) Stateful (연결에 상태 유지 가능)
 

📦 소켓통신을 쓰는 주된 이유

  1. 실시간성이 중요할 때
    → 채팅, 게임, 실시간 알림, 주식 트레이딩 등은 빠르게 데이터 주고받아야 해서 소켓이 유리함.
  2. 양방향 통신 필요할 때
    → REST API는 클라이언트 → 서버로만 요청하고, 서버는 응답만 함.
    → 소켓은 클라이언트 ↔ 서버 양쪽에서 자유롭게 데이터 보낼 수 있음.
  3. 지속적인 연결로 속도 최적화
    → HTTP는 요청할 때마다 연결, 헤더, 인증 등 오버헤드 발생.
    → 소켓은 한 번 연결하면 그다음부터는 오로지 데이터만 주고받음 → 훨씬 가벼움.
  4. 상태 관리가 필요할 때
    → 예: 게임 서버에서 각 플레이어의 상태 유지, 채팅방에서 누가 있는지 관리

🚫 언제 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