자바 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 요청 처리
HTTPClient는 HTTP 프로토콜을 이용해 서버와 클라이언트 간에 데이터를 송수신하는 클래스입니다.
✔ 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의 최신 기능 변화에 대해 다뤄봅시다!
'IT Developer > Java' 카테고리의 다른 글
Java 기초 <15. Java의 리플렉션(Reflection)과 애노테이션(Annotation) 활용> (1) | 2025.03.16 |
---|---|
Java 기초 <14. JVM 내부 구조 및 GC 원리 (G1 GC, ZGC, Shenandoah)> (1) | 2025.03.15 |
Java 기초 <13. Java 18~현재 최신 트렌드 – Virtual Threads, GraalVM, CRaC> (1) | 2025.03.14 |
Java 기초 <12. Java 5~17 주요 기능 변화 (제네릭, 스트림, 람다, 레코드 등)> (1) | 2025.03.13 |
Java 기초 <10. Java 입출력 스트림 (I/O) 기본과 활용> (1) | 2025.03.11 |
Java 기초 <9. 멀티스레딩과 동시성 프로그래밍> (1) | 2025.03.10 |
Java 기초 <8. 예외 처리와 사용자 정의 예외> (0) | 2025.03.09 |
Java 기초 <7. 컬렉션 프레임워크 (List, Set, Map) 활용 및 성능 비교> (2) | 2025.03.08 |