IT Developer/Java

Java 기초 <11. Java 네트워크 프로그래밍 – Socket, HTTPClient, WebSocket>

TEMA_ 2025. 3. 12. 09:03
반응형

자바 Java

11. Java 네트워크 프로그래밍 – Socket, HTTPClient, WebSocket

 

안녕하세요! 태마입니다.

Java 기초 강좌입니다.

 

강좌의 경우 

1. 주제 간단 정리

2. 상세 주제 정리

으로 이루어져 있습니다.

 

자바 Java

포스팅 시작하겠습니다 :)

1. 주제 간단 정리

 

1. 네트워크 프로그래밍이란?

네트워크 프로그래밍컴퓨터 네트워크를 통해 데이터를 송수신하는 프로그램을 개발하는 기술입니다.
TCP/IP와 같은 프로토콜을 사용하여 다양한 시스템 간에 데이터 통신을 가능하게 합니다.
✔ Java는 **소켓(Socket)**을 이용하여 네트워크 프로그래밍을 지원하며, HTTP와 WebSocket을 통한 통신도 제공합니다.

📌 네트워크 프로그래밍을 사용하는 이유
분산 시스템을 구축하여 여러 서버와 클라이언트가 데이터를 주고받을 수 있음
실시간 데이터 통신을 구현할 수 있음 (예: 채팅 프로그램, 실시간 게임)
웹과의 통신을 통해 웹 애플리케이션과 상호작용 가능


 

2. Socket 프로그래밍

Socket네트워크 상에서 연결된 두 지점 사이에서 데이터를 전송하는 양방향 통신 채널입니다.
TCP 소켓과 UDP 소켓이 있으며, TCP는 연결 기반의 신뢰성 있는 통신을, UDP는 비연결성으로 빠른 통신을 제공합니다.
✔ Java에서 Socket은 java.net 패키지에 포함되어 있습니다.

TCP 소켓 서버 예제

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

public class TCPServer {
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(5000)) {
            System.out.println("서버가 시작되었습니다.");

            while (true) {
                Socket socket = serverSocket.accept();  // 클라이언트 연결 대기
                System.out.println("클라이언트 연결됨: " + socket.getInetAddress());

                // 클라이언트에게 메시지 전송
                PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                out.println("Hello, Client!");

                // 클라이언트로부터 메시지 받기
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String message = in.readLine();
                System.out.println("클라이언트 메시지: " + message);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

📌 ServerSocket을 사용하여 클라이언트의 연결을 기다리고, Socket으로 데이터 송수신

TCP 소켓 클라이언트 예제

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

public class TCPClient {
    public static void main(String[] args) {
        try (Socket socket = new Socket("localhost", 5000)) {
            // 서버로부터 받은 메시지 출력
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String message = in.readLine();
            System.out.println("서버 메시지: " + message);

            // 서버로 메시지 보내기
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            out.println("Hello, Server!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

📌 Socket을 사용하여 서버에 연결하고 데이터를 송수신


 

3. HTTPClient를 이용한 HTTP 요청 처리

HTTPClientHTTP 프로토콜을 이용해 서버와 클라이언트 간에 데이터를 송수신하는 클래스입니다.
✔ Java 11부터 HttpClient 클래스를 내장하여, HTTP 요청을 쉽게 처리할 수 있게 되었습니다.

HTTP GET 요청 예제

import java.net.http.*;
import java.net.URI;
import java.io.IOException;

public class HTTPClientExample {
    public static void main(String[] args) throws IOException, InterruptedException {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://jsonplaceholder.typicode.com/todos/1"))
                .build();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.statusCode());  // 응답 상태 코드 출력
        System.out.println(response.body());        // 응답 본문 출력
    }
}

📌 HttpClient를 사용하여 HTTP 요청을 보내고 응답을 처리


 

4. WebSocket을 이용한 실시간 통신

WebSocket양방향 통신을 지원하는 프로토콜로, 클라이언트와 서버 간에 지속적인 연결을 통해 실시간으로 데이터를 주고받을 수 있습니다.
✔ WebSocket은 주로 실시간 채팅, 게임, 주식 거래 시스템 등에서 사용됩니다.
✔ Java에서는 javax.websocket 패키지를 사용하여 WebSocket 클라이언트와 서버를 구현할 수 있습니다.

WebSocket 서버 예제

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;

@ServerEndpoint("/chat")
public class WebSocketServer {
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("클라이언트 연결됨: " + session.getId());
    }

    @OnMessage
    public void onMessage(Session session, String message) throws IOException {
        System.out.println("클라이언트로부터 메시지: " + message);
        session.getBasicRemote().sendText("서버에서 응답: " + message);  // 클라이언트에게 응답
    }

    @OnClose
    public void onClose(Session session) {
        System.out.println("클라이언트 연결 종료: " + session.getId());
    }
}

📌 WebSocket 서버는 지속적으로 클라이언트와 연결을 유지하며 실시간 데이터를 주고받을 수 있음.

WebSocket 클라이언트 예제

import javax.websocket.*;
import java.net.URI;

@ClientEndpoint
public class WebSocketClient {
    public static void main(String[] args) throws Exception {
        WebSocketContainer container = ContainerProvider.getWebSocketContainer();
        container.connectToServer(WebSocketClient.class, URI.create("ws://localhost:8080/chat"));

        // 클라이언트로 메시지 보내기
        Session session = container.connectToServer(WebSocketClient.class, URI.create("ws://localhost:8080/chat"));
        session.getBasicRemote().sendText("Hello, Server!");
    }

    @OnMessage
    public void onMessage(String message) {
        System.out.println("서버로부터 메시지: " + message);
    }
}

📌 WebSocket 클라이언트는 서버와 연결하여 실시간 데이터를 송수신

반응형

2. 상세 주제 정리

 

1. HTTPClient를 사용한 POST 요청 예제

HTTPClient를 사용하여 POST 요청을 보내는 방법을 살펴보겠습니다.

HTTP POST 요청 예제

import java.net.http.*;
import java.net.URI;
import java.io.IOException;

public class HTTPClientPostExample {
    public static void main(String[] args) throws IOException, InterruptedException {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://jsonplaceholder.typicode.com/posts"))
                .header("Content-Type", "application/json")
                .POST(HttpRequest.BodyPublishers.ofString("{ \"title\": \"foo\", \"body\": \"bar\", \"userId\": 1 }"))
                .build();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.statusCode());  // 응답 상태 코드 출력
        System.out.println(response.body());        // 응답 본문 출력
    }
}

📌 HTTP POST 요청을 통해 데이터를 서버에 전송하고 응답을 받는 방법


 

2. WebSocket을 이용한 실시간 채팅 시스템

WebSocket을 사용하여 간단한 실시간 채팅 시스템을 구현해보겠습니다.
클라이언트와 서버가 실시간으로 메시지를 주고받는 채팅 기능을 구현할 수 있습니다.

📌 채팅 기능 구현 예제는 앞서 다룬 WebSocket 예제를 활용하면 실시간 통신 가능


지금까지 Java 네트워크 프로그래밍에 대해 배웠어요!
👉 "이제 Java 5~17 주요 기능 변화에 대해 배우고 싶다면?"
다음 회차에서 Java의 최신 기능 변화에 대해 다뤄봅시다!

반응형