JAVA/Java Platform, Standard Edition
[공식 문서] 자바 클라이언트 소켓(Client Socket) 완벽 정리 : 개념, 생성자, 주요 메소드
yebin0322
2025. 2. 12. 10:05
https://docs.oracle.com/javase/8/docs/api/java/net/Socket.html
Socket
- 클라이언트 소켓을 구현하는 Java의 네트워크 프로그래밍을 위한 클래스
- 두 개의 머신 간 통신을 위한 endpoint(종단점) 역할을 함
- 서버와의 연결을 관리하는 역할
- 바인딩 없이도 사용 가능
public class Socket
extends Object
implements Closeable
- SSLSocket이 직접적인 서브클래스로 존재하며, 이는 보안 소켓(SSL/TLS) 통신을 제공함
용어
- Remote Address(원격 주소) : 상대방(서버)의 주소
- Local Address(로컬 주소) : 내 주소(클라이언트 또는 서버 자신)
- Binding(바인딩) : 소켓을 특정 IP와 포트에 연결하는 과정. 바인딩을 하지 않으면 OS가 자동으로 IP와 포트 할당
- Nagle 알고리즘 : 작은 패킷을 모아서 한 번에 보이는 알고리즘. 네트워크 트래픽을 줄여서 효율적이지만 실시간 응답이 필요한 애플리케이션에서는 delay 발생 가능성이 있음
- SO_KEEPALIVE : TCP 연결이 살아있는지 주기적으로 확인하는 옵션. 클라이언트가 갑자기 죽었거나, 네트워크가 끊긴 경우 감지하는 기능. 기본적으로 비활성화 되어 있어 직접 켜야 함. 유령 연결을 방지하지만, 주기적인 패킷 전송이므로 불필요한 네트워크 부하 발생 가능성이 있음
- SO_REUSEADDR : TIME_WAIT 상태에서도 같은 포트로 재사용이 가능하게 하는 옵션. 서버가 종료된 후 같은 포트로 바로 다시 실행하면 '포트가 이미 사용중'인 오류가 발생하기 때문에 해당 포트를 재사용할 수 있도록 허용해 주는 것. 서버가 자주 재시작되는 환경에서 유용하지만, 보안적으로 위험할 수 있음(포트 하이재킹)
- Port Hijacking : 악의적인 사용자가 특정 포트를 가로채 원래 서비스처럼 속이는 방식.
Constructor(생성자)
생성자 |
설명 |
Socket() |
시스템 기본 소켓 타입을 사용하여 연결되지 않은 소켓을 생성 |
Socket(InetAddress address, int port) |
지정된 IP 주소와 포트에 연결되는 스트림 소켓 생성 |
Socket(String host, int port) |
지정된 호스트명과 포트에 연결되는 스트림 소켓 생성 |
Socket(InetAddress address, int port, InetAddress localAdd, int localPort) |
특정 로컬 주소와 포트에서 원격 주소 및 포트로 연결 |
Socket(String host, int port, InetAddress localAddr, int localPort) |
특정 로컬 주소와 포트에서 원격 주소 및 포트로 연결 |
Socket(Proxy proxy) |
특정 프록시를 사용하여 연결되지 않은 소켓을 생성 |
protected Socket(SocketImpl impl) |
사용자 정의 SocketImpl을 사용하는 소켓 생성 |
- UDP 통신을 하려면 DatagramSocket을 사용해야 함
Method(메소드)
연결 및 바인딩
메소드 |
설명 |
bind(SocketAddress bindpoint) |
소켓을 특정 로컬 주소에 바인딩 |
connect(SocketAddress endpoint) |
지정된 주소에 소켓을 연결 |
connect(SocketAddress endpoint, int timeout) |
타임아웃을 지정하여 소켓을 연결 |
소켓 정보 조회
메소드 |
설명 |
getInetAddress() |
연결된 원격 주소 반환 |
getLocalAddress() |
소켓이 바인딩된 로컬 주소 반환 |
getPort() |
연결된 원격 포트 반환 |
getLocalPort() |
바인딩된 로컬 포트 반환 |
getRemoteSocketAddress() |
연결된 원격 소켓 주소 반환 |
getLocalSocketAddress() |
바인딩된 로컬 소켓 주소 반환 |
데이터 송수신
메소드 |
설명 |
getInputStream() |
소켓의 입력 스트림 반환(데이터 수신) |
getOutputStream() |
소켓의 출력 스트림 반환(데이터 전송) |
sendUrgentData(int data) |
한 바이트의 긴급 데이터 전송(TCP Urgent Mode) |
소켓 설정 및 옵션
메소드 |
설명 |
setSoTimeout(int timeout) |
수신 대기 시간(Timeout) 설정 |
getSoTimeout() |
현재 설정된 수신 대기 시간 반환 |
setTcpNoDelay(boolean on) |
Nagle 알고리즘 사용 여부 설정 |
getTcpNoDelay() |
Nagle 알고리즘 사용 여부 반환 |
setKeepAlive(boolean on) |
SO_KEEPALIVE 설정(연결 유지) |
getKeepAlive() |
SO_KEEPALIVE 상태 반환 |
setReuseAddress(boolean on) |
SO_REUSEADDR 설정(포트 재사용) |
getReuseAddress() |
SO_REUSEADDR 상태 반환 |
setSendBufferSize(int Size) |
송신 버퍼 크기 설정 |
getSendBufferSize() |
현재 송신 버퍼 크기 반환 |
setReceiveBufferSize(int size) |
수신 버퍼 크기 설정 |
getReceiveBufferSize() |
현재 수신 버퍼 크기 반환 |
소켓 종료 및 상태 확인
메소드 |
설명 |
isConnected() |
소켓이 연결되었는지 여부 반환 |
isBound() |
소켓이 바인딩되었는지 여부 반환 |
isClosed() |
소켓이이 닫혔는지 여부 반환 |
isInputShutdown() |
입력 스트림이 닫혔는지 확인 |
isOutputShutdown() |
출력 스트림이 닫혔는지 확인 |
shutdownInput() |
입력 스트림 종료 |
shutdownOutput() |
출력 스트림 종료 |
close() |
소켓 닫기 |
저수준 설정
메소드 |
설명 |
setTrafficClass(int tc) |
IP 헤더의 트래픽 클래스(TOS) 설정 |
getTrafficClass() |
현재 트래픽 클래스 값 반환 |
setPerformancePreferences(int connectionTime, int latency, int bandwidth) |
연결 성능 설정 |