소켓 프로그래밍

2026. 7. 5. 00:21유튜브/소켓 프로그래밍_김기태의 java를 자바

소켓

  • 소켓은 네트워크 상에서 수행되는 두 프로그램 간의 양방향 통신링크의 한쪽 끝 단을 의미
  • 소켓은 특정 포트 번호와 연결되어 있음 : TCP에서 데이터를 보낼 응용프로그램을 식별할 수 있음
  • 자바에서의 데이터 통신 시 소켓 사용
  • 소켓 종류 : 서버 소켓과 클라이언트 소켓 

소켓을 이용한 서버 클라이언트 통신 프로그램의 구조

  • 서버에 접속하면 소켓을 만들고 서버 클라이언트 소켓간 데이터를 입출력 함 
  • ServerSocket하는일은 새로은 Socket을 만들기만 함
  • ClientSocket은 ServerSocket과 최초 접속후 ServerSocket이만든 Socket과 통신

Socket  클래스

  • 클라이언트 소켓에 사용되는 클래스
  • java.net 패키지에 포함
  • 주요 생성자 

Socket 클래스의 주요 메소드

Client 소켓 생성, 서버 접속, 입출력 스트림 생성

  • 클라이언트 소켓 생성 및 서버에 접속, Socket clientSocket = net Socket("128.12.1.1", 5550);
    • Socket 객체의 생성되면 곧 바로 128.12.1.1의 주소로 자동 접속
  • 네트워크 입출력 스트림 생성
    • BufferedReader in = new Bufferedreader(new InputStremReader(clientSocket.getInputStream()));
    • BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutStream())));
    • 일반 스트림을 입출력 하는 방식과 동일
  • 서버로 데이터 전송
    • out.write("hello"+\n");
    • out.flush(); 
    • flush()를 호출하면 스트림 속에 데이터를 남기지 않고 모두 전송 
  • 서버로부터 데이터 수신
    • int x = in.read(); - 서버로부터 한 개의 문자 수신
    • String line = in.readline(); - 서버로부터 한 행의 문자열 수신
  • 네트워크 접속 종료
    • clientScoket.close();

ServerSocket 클래스, 서버 소캣

  • 서버 소켓에 사용되는 클래스
  • java.net 패키지에 포함
  • 주요 생성자

  • 주요 메소드


클라이언트와 서버

Sever 소켓 생성, 클라이언트 접속, 입출력 스트림 생성

  • 서버 소켓 생성
    • ServerSocket serverSocket = net ServerSocket(5550);
    • 이미 사용 중인 포트 번호를 지정하면 오류가 발생
  • 클라이언트로부터 접속 기다림
    • Socket socket = serverSocket.accept();
    • accept() 메소드는 연결 요청이 오면 새로운 Socket 객체 반환
    • 서버에서 클라이언트와의 데이터 통신은 새로 만들어진 Socket 객체를 통해서 이루어짐
    • ServerSocket 클래스는 Socket 클래스와 달리 주어진 연결에 대해 입출력 스트림을 만들어주는 메소드가 없음
  • 네트워크 입출력 스트림 생성
    • BufferedReader in = new Bufferedreader(new InputStremReader(clientSocket.getInputStream()));
    • BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutStream())));
    • accept() 메소드에서 얻은 Socket 객체의 getInputSteeram()과 getOutputStream() 메소드를 이용하여 데이터 스트림 생성
    • 일반 스트림을 입출력하는 방식과 동일하게 네트워크 데이터 입출력

클라이언트로부터 데이터 수신

  • 클라이언트로부터 데이터 수신
    • int x = in.read(); - 서버로부터 한 개의 문자 수신
    • String line = in.readline(); - 서버로부터 한 행의 문자열 수신
  • 클라이언트로 데이터 전송
    • out.write("hello"+\n");
    • out.flush(); 
    • flush()를 호출하면 스트림 속에 데이터를 남기지 않고 모두 전송 
  • 네트워크 접속 종료
    • socket.close();
  • 서버 응용프로그램 종료
    • serverSocket.close();
    • 더 이상 클라이언트의 접속을 받지 않고 서버 응용 프로그램을 종료하고자 하는 경우 ServerSocket 종료 

소켓을 이용한 클라이언트/서버 채팅

간단한 채팅 프로그램 예제

  • 서버와 클라이언트가 1:1로 채팅 하는 간단한 예제
  • 서버와 클라이언트 간의 메시지 구분을 위해 서버는 메시지 앞에 "서버>"을 접두어로 붙여 메시지를 전송하며 클라이언트는 "클라이언트>"를 접두어로 붙여 메시지 전송
  • 서버와 클라이언트가 번갈아 가면서 메시지 전송 및 수신
  • 클라이언트가 bye를 보내면 프로그램 종료