[JAVA] 소켓 프로그래밍 1번

2024. 7. 8. 12:19·자바

Java 소켓 프로그래밍: 기본 개념과 첫 번째 예제

소개

Java 소켓 프로그래밍은 네트워크를 통해 데이터를 송수신할 수 있게 해주는 기술입니다. 소켓은 네트워크 상의 두 호스트 간의 양방향 통신 링크를 말합니다. 이 포스트에서는 소켓의 기본 개념을 설명하고, 간단한 예제를 통해 Java에서 소켓 프로그래밍을 시작하는 방법을 다룹니다.

소켓의 기본 개념

소켓이란?

소켓은 네트워크 상에서 통신을 위해 끝점을 정의하는 추상화된 개념입니다. 소켓은 IP 주소와 포트 번호로 구성되며, 이를 통해 두 호스트 간의 통신이 이루어집니다.

소켓의 종류

Java에서 소켓은 크게 두 종류로 나뉩니다:

  • TCP 소켓: 연결 지향적 소켓으로, 신뢰성 있는 데이터 전송을 보장합니다.
  • UDP 소켓: 비연결 지향적 소켓으로, 빠른 속도의 데이터 전송을 제공합니다.

이번 포스트에서는 신뢰성 있는 데이터 전송을 보장하는 TCP 소켓을 중점적으로 다루겠습니다.

TCP 소켓의 동작 원리

TCP 소켓은 클라이언트와 서버 간의 통신을 위해 사용됩니다. 기본적인 동작 과정은 다음과 같습니다:

  1. 서버 소켓 생성: 서버는 특정 포트에서 클라이언트의 연결을 기다립니다.
  2. 클라이언트 소켓 생성: 클라이언트는 서버의 IP 주소와 포트 번호를 사용하여 연결을 시도합니다.
  3. 연결 수립: 서버와 클라이언트 간의 연결이 수립됩니다.
  4. 데이터 송수신: 수립된 연결을 통해 데이터를 주고받습니다.
  5. 연결 종료: 통신이 끝나면 연결을 종료합니다.

간단한 예제: 에코 서버

서버 코드

먼저 서버 코드를 작성해보겠습니다. 서버는 클라이언트의 연결을 받아들여, 클라이언트가 보낸 메시지를 다시 클라이언트에게 돌려줍니다.

import java.io.*;
import java.net.*;

public class EchoServer {
    public static void main(String[] args) {
        int port = 12345;
        try (ServerSocket serverSocket = new ServerSocket(port)) {
            System.out.println("Echo server is listening on port " + port);
            while (true) {
                try (Socket socket = serverSocket.accept()) {
                    InputStream input = socket.getInputStream();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(input));

                    OutputStream output = socket.getOutputStream();
                    PrintWriter writer = new PrintWriter(output, true);

                    String text;
                    while ((text = reader.readLine()) != null) {
                        System.out.println("Received: " + text);
                        writer.println("Echo: " + text);
                    }
                } catch (IOException ex) {
                    System.out.println("Server exception: " + ex.getMessage());
                    ex.printStackTrace();
                }
            }
        } catch (IOException ex) {
            System.out.println("Server exception: " + ex.getMessage());
            ex.printStackTrace();
        }
    }
}

클라이언트 코드

다음으로 클라이언트 코드를 작성하겠습니다. 클라이언트는 서버에 연결하여 사용자의 입력을 서버에 보내고, 서버로부터 다시 돌려받은 메시지를 출력합니다.

import java.io.*;
import java.net.*;

public class EchoClient {
    public static void main(String[] args) {
        String hostname = "localhost";
        int port = 12345;

        try (Socket socket = new Socket(hostname, port)) {
            OutputStream output = socket.getOutputStream();
            PrintWriter writer = new PrintWriter(output, true);

            InputStream input = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));

            BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
            String text;

            System.out.println("Connected to the echo server. Type your messages:");
            while ((text = consoleReader.readLine()) != null) {
                writer.println(text);
                String response = reader.readLine();
                System.out.println(response);
            }
        } catch (UnknownHostException ex) {
            System.out.println("Server not found: " + ex.getMessage());
        } catch (IOException ex) {
            System.out.println("I/O error: " + ex.getMessage());
        }
    }
}

코드 설명

EchoServer

  • ServerSocket: 특정 포트에서 클라이언트의 연결을 기다립니다.
  • accept(): 클라이언트의 연결을 수락합니다.
  • InputStream과 OutputStream: 클라이언트와 데이터를 주고받기 위한 스트림입니다.
  • BufferedReader와 PrintWriter: 편리하게 데이터를 읽고 쓰기 위해 사용합니다.

EchoClient

  • Socket: 서버에 연결합니다.
  • PrintWriter와 BufferedReader: 서버와 데이터를 주고받기 위해 사용합니다.
  • BufferedReader (콘솔 입력): 사용자의 입력을 읽어 서버로 전송합니다.

결론

이 포스트에서는 Java 소켓 프로그래밍의 기본 개념과 TCP 소켓을 이용한 간단한 에코 서버와 클라이언트를 구현해보았습니다. 다음 포스트에서는 더 복잡한 예제와 함께, 멀티스레딩을 이용한 서버 구현 방법을 다룰 예정입니다.

'자바' 카테고리의 다른 글

[JAVA] 자바 메서드 심화: 오버로딩과 오버라이딩  (0) 2024.07.19
[JAVA] 자바 함수(메서드)의 기초: 선언부터 사용까지  (1) 2024.07.19
[API] Python API와 Java 클라이언트를 이용한 CPK 분석 및 히스토그램 생성  (0) 2024.07.19
[JAVA] 소켓 프로그래밍 3번  (0) 2024.07.08
[JAVA] 소켓 프로그래밍 2번  (0) 2024.07.08
'자바' 카테고리의 다른 글
  • [JAVA] 자바 함수(메서드)의 기초: 선언부터 사용까지
  • [API] Python API와 Java 클라이언트를 이용한 CPK 분석 및 히스토그램 생성
  • [JAVA] 소켓 프로그래밍 3번
  • [JAVA] 소켓 프로그래밍 2번
뚤떡이
뚤떡이
프로그래밍을 알아가며 저와 함께 성장하는 블로그 입니다
  • 뚤떡이
    뚤떡이의 발개벗긴개발
    뚤떡이
  • 전체
    오늘
    어제
    • 분류 전체보기 (73)
      • Docker (2)
      • 자바 (29)
        • start (10)
        • calcu (4)
        • process (7)
      • 플러터 (1)
      • 알고리즘 (12)
        • 개념 (2)
        • 구현 (5)
        • 백준 (0)
        • 프로그래머스 (5)
      • 이클립스 (4)
        • 초기설정 (4)
      • SQL (5)
      • IT 잡동사니 (10)
      • 개발 관련 (10)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    스팸메일 #메일보안 #gophish #it보안 #오픈소스
    요구사항 정의서
    #번역
    #python
    #개발일지
    #자동화
    MAC 크롬 원격
    #프로젝트
    개발일지 #프로젝트후기 #gpt4 #번역 #자동화 #python #electron
    IT자산관리
    시놀로지
    윈도우 크롬 원격
    크롬 원격
    #python #개발일지 #번역 #메모리최적화 #websocket #redis #비동기프로그래밍
    #electron
    synology
    GLPI
    크롬 원격 데스크톱
    #apachesuperset #시놀로지 #db2 #데이터시각화 #기술블로그
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
뚤떡이
[JAVA] 소켓 프로그래밍 1번
상단으로

티스토리툴바