최원종의 개발 블로그

(소켓 - 2) 1:1 단방향 통신 - 서버 본문

Java/JAVA 유용한 클래스

(소켓 - 2) 1:1 단방향 통신 - 서버

chl6698 2026. 3. 26. 10:52

단방향 통신

단방향 통신:
  클라이언트 ──메시지 전송──► 서버
                         (받기만 함)

서버 코드에서 필요한 것

1. ServerSocket   : 포트를 열고 연결 요청을 기다림
2. Socket         : 연결된 클라이언트와 실제 통신
3. BufferedReader : 클라이언트가 보낸 메시지를 읽음

 

 


-코드

package server.ch01;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerFile {
    public static void main(String[] args) {
        //소켓 통신을 하기 위한 서버측 테스트 코드1
        //(내 IP 주소 당연히 알고 있음)
        //1. 포트 번호를 열고 클라이언트에 연결 요청을 기다리는 서버 소켓
        //Ip : 192.168.4.21
        try (ServerSocket serverSocket = new ServerSocket(5000)) {

            //accept() - 클라이언트가 연결할 때 까지 이 줄에서 멈춤(블로킹)
            Socket clientSocket = serverSocket.accept();
            //2. 코드가 아래로 안내려감 블로킹)
            System.out.println("클라이언트가 연결 됐습니다.");
            //3. 소켓 객체가 생성이 되면 (accept()) 이 소켓이 클라이언트 소켓과 연결되어 있는 소켓
            // I/O 단원에서 배운 체인 그대로
            InputStream input = clientSocket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));


            //4.클라이언트가 보낸 한 줄을 읽음
            String message = reader.readLine();
            // 내 서버 측 콘솔창에 출력
            System.out.println("클라이언트 메세지 : " + message);
            
            //5. 통신 종료 ,연결 해제
            clientSocket.close();

        } catch (IOException e) {
            System.out.println("오류 발생 : 포트 5000 이미 사용 중이거나 연결에 실패 했습니다. ");
        }
    }
}

accept()는 블로킹(Blocking) 메서드

클라이언트가 연결할 때까지 그 줄에서 실행을 멈추고 기다리는 것

서버 실행 흐름:
  new ServerSocket(5000)  → 실행됨
  serverSocket.accept()   → 여기서 멈춤... (클라이언트 기다리는 중)
                            클라이언트 연결됨!
  clientSocket = ...      → 이제 다음 줄 실행

 

스트림 체인 사용(I/O단원에서 배운 스트림 체인이랑 같음)

키보드 : System.in (바이트) → InputStreamReader (문자) → BufferedReader (readLine())
소켓   : socket.getInputStream() (바이트) → InputStreamReader (문자) → BufferedReader (readLine())

실행 방법

1. ServerFile 실행
   → "서버 시작 - 포트 5000 에서 대기 중..." 출력 후 대기

2. 소켓-3 에서 만들 ClientFile 실행
   → "클라이언트가 연결됐습니다." 출력
   → "클라이언트 메시지 : Hello, Server!" 출력

클라이언트 없이 서버만 실행하면 accept() 에서 계속 기다립니다.
강제 종료하려면 IDE 정지 버튼 또는 Ctrl + C 를 누르세요.

핵심 요약

ServerSocket(5000)    → 포트 5000 을 열고 연결 대기
serverSocket.accept() → 클라이언트가 연결할 때까지 블로킹
socket.getInputStream() → 17단원 System.in 과 같은 역할
                          InputStreamReader → BufferedReader 체인으로 감싸기
실행 순서             → 반드시 서버 먼저, 클라이언트 나중