최원종의 개발 블로그

(소켓-3) 1:1 단방향 통신 -클라이언트 본문

Java/JAVA 유용한 클래스

(소켓-3) 1:1 단방향 통신 -클라이언트

chl6698 2026. 3. 26. 12:12

소켓-2에서 만든 서버에 연결해 메시지를 보내는 클라이언트 설계.

클라이언트 ── 메시지 전송 ──►  서버
(이번 단원)                  (소켓-2)

서버 vs 클라이언트

서버   : ServerSocket (대기) + Socket (통신) + BufferedReader (읽기)
클라이언트 :                   Socket (통신) + PrintWriter   (쓰기)

 

 


-코드

package client.ch01;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

//소켓 통신을 위한 클라이언트 측 도구
public class ClientFile {

    public static void main(String[] args) {

        //클라이언트는 접글할 서버 컴퓨터에 IP 주소와 포트 번호를 알고 있어야 한다
        try (Socket socket = new Socket("192.168.4.21", 5000)) {

            //Socket socket = new Socket("localhost", 5000)
            //위 코드가 실행되는 순간 내부적으로 이미 서버 컴퓨터와 연결을 시도한 상태

            PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
            //writer.write("Hello ~ Server ~~" + "\n"); //개행문자까지 보내야 정상 보내짐
            writer.println("안녕 반가워");
            
        } catch (UnknownHostException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
        }
    }
}

 


소켓에서 PrintWriter를 쓰는 이유는 바로 auto flush 때문이다

  PrintWriter BufferedWriter
제공 메서드 print(), println(), printf() write(), newLine()
String 직접 출력 가능 가능
auto flush 있음 (생성자 두 번째 인자 true/false) 없음, 직접 flush() 호출 필요
적합한 용도 소켓 통신 파일 쓰기

 

 


localhost란?

localhost = 내 컴퓨터 자신을 가리키는 주소 (IP: 127.0.0.1)

new Socket("localhost", 5000)
  → 내 컴퓨터의 5000번 포트로 연결 (같은 컴퓨터에서 테스트할 때)

실제 다른 컴퓨터와 통신할 때:
  new Socket("192.168.0.5", 5000)  ← 상대방의 IP 주소

 


서버와 클라이언트 전체 흐름

서버 (ServerFile)                       클라이언트 (ClientFile)
        |                                         |
ServerSocket(5000)                                |
accept() 대기 ──────────────────── new Socket("localhost", 5000)
        |         연결 수락!                       |
        |                                         |
reader.readLine() ◄─── "Hello, Server!" ─── writer.println()
        |                                         |
"Hello, Server!" 출력                           종료
        |
      종료

 

실행 방법 및 결과

1. ServerFile 실행 → "서버 시작 - 포트 5000 에서 대기 중..."
2. ClientFile 실행 → "서버에 연결됐습니다." / "메시지를 보냈습니다."
3. ServerFile 콘솔 → "클라이언트가 연결됐습니다." / "클라이언트 메시지 : Hello, Server!"

핵심 요약

new Socket("localhost", 5000) → 서버 주소와 포트로 연결 요청
PrintWriter(out, true)        → 서버로 메시지를 보내는 출력 스트림, true = 즉시 전송
writer.println()              → 줄바꿈 자동 추가, 서버 readLine() 과 맞물림
실행 순서                     → 서버 먼저 → 클라이언트 나중