상세 컨텐츠

본문 제목

TCP Socket 통신 InetAddress, ServerSocket

기록 - 프로그래밍/Java

by wjjun 2024. 3. 6. 12:20

본문

 

InetAddress

자바 ip address 표기 InetAddress 객체로 표현.

여러 대의 서버가 있을 때 해당 클래스를 이용하여 서버명으로 슬랙알림을 전송할 수 있다.

 

InetAddress ia = InetAddress.getByName(String host);
InetAddress[] iaArr = InetAddress.getAllByName(String host);

getByName(도메인 이름) DNS에서 하나의 IP를 얻어와 InetAddress를 생성하고 리턴한다

DNS에 등록된 모든 ip 주소를 얻고 싶을 땐 getAllByName() 메서드를 사용한다.

 

TCP

연결지향 프로토콜로 클라이언트 서버가 연결된 상태에서 데이터를 주고받는다.

모든 데이터는 고정된 통신 선로를 통해 순차적으로 전달된다. 그래서 정확하면서 안정적으로 데이터 전달이 가능하다.

단점은 데이터를 보내기 위해 사전에 연결하는 작업이 선행 되어야만 한다.

 

ServerSocket, Socket 용도

TCP 역할을 클래스로 만든 것이 ServerSocket, Socket 클래스다.

TCP 서버 역할은 두 가지이다. 하나는 클라이언트가 연결 요청을 해오면 연결을 수락하는 것 다른하나는 연결된 클라이언트와 통신하는 것이다.

연결 수락을 담당하는 것이 java.net.ServerSocket 클래스 입니다.

연결된 클라이언트와 통신을 담당하는 것이 java.net.Socket 클래스입니다.

클라이언트가 연결 요청을 해오면 ServerSocket은 연결을 수락하고 통신용 Socket을 만듭니다.

 

Client : Socket -> Server : ServerSocket accept() -> Server : Socket 연결수락 -> Client Socket 통신

 

ServerSocket 생성과 연결 수락

ServerSocket serverSocket = new ServerSocket(5001);
serverSocket.bind(new InetSocketAddress(5001));

서버를 개발하기 위해서는 먼저 ServerSocket 객체를 얻어야 합니다.

 

1. 생성자에 바인딩할 포트를 넣고 객체를 생성해주면 됩니다.

2. 다른 방법으로 디폴트 생성자로 객체를 생성하고 포트 바인딩을 위해 bind() 메서드로 호출하면 됩니다.

 

만약 서버 PC에 멀티 IP가 할당된 경우 특정 IP로 접속할 때만 연결 수락을 하고 싶다면 아래와 같이 IP를 작성해주면 됩니다.

ServerSocket serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress("IP 주소", 5001));

ServerSocket을 생성할 때 포트가 이미 사용중이라면 BindException이 발생합니다.

포트 바인딩이 끝났다면 ServerSocket을 클라리언트 연결 수락을 위해 accept() 메서드를 실행해야 합니다.

accept() 메서드는 클라이언트가 연결 요청 전까지 대기 상태인 블로킹 상태로 있습니다.

 

연결 수락의 기본코드

SeverSocket serverSocket = null;
try {
    serverSocket = new ServerSocket();
    serverSocket.bind(new InetSocketAddress("IP", 5001));
    
    while(true) {
        Socket socket = serverSocket.accept(); // 클라이언트 연결수락
        InetSocketAddress isa = (InetSocketAddress) socket.getRemoteSocketAddress();
    }
} catch (Exception e) { }

// serverSocket이 닫혀있지 않은 경우 닫아준다
if (!serverSocket.isClosed()) {
    try {
        serverSocket.close();
    } catch (IOException e) {}
}

 

서버 : OutputStream >> 클라이언트 : InputStream

클라이언트 : OutputStream >> 서버 : InputStream

InputStream is = socket.getInputStream();

OutputStream os = socket.getOutputStream();

String data = "보내는 데이터";
byte[] byteArr = data.getBytes("UTF-8");
OutputStream outputStream = socket.getOutputStream();
outputStream.write(byteArr);
outputStream.flush();

관련글 더보기

댓글 영역