40. 자바와 네트워킹
40.1. 네트워킹 개요
네트워킹은 컴퓨터들이 서로 데이터를 주고받기 위해 연결되는 과정입니다. 자바에서는 네트워킹을 지원하는 다양한 클래스와 인터페이스가 제공됩니다. 이를 통해 소켓 프로그래밍, HTTP 통신, 웹소켓 등을 사용할 수 있습니다.
40.2. 소켓 프로그래밍
소켓 프로그래밍은 컴퓨터들 간에 네트워크를 통해 데이터를 주고받는 기술입니다. 자바에서는 java.net 패키지의 Socket과 ServerSocket 클래스를 이용하여 소켓 프로그래밍을 할 수 있습니다.
예시) 간단한 에코 서버와 클라이언트 구현
- 서버
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class EchoServer {
public static void main(String[] args) throws Exception {
int port = 12345;
try (ServerSocket serverSocket = new ServerSocket(port)) {
System.out.println("Server is listening on port " + port);
while (true) {
try (Socket clientSocket = serverSocket.accept()) {
BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter writer = new PrintWriter(clientSocket.getOutputStream(), true);
String message = reader.readLine();
System.out.println("Received: " + message);
writer.println("Echo: " + message);
}
}
}
}
}
- 클라이언트
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class EchoClient {
public static void main(String[] args) throws Exception {
String serverAddress = "localhost";
int port = 12345;
try (Socket socket = new Socket(serverAddress, port)) {
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer.println("Hello, server!");
String response = reader.readLine();
System.out.println("Server response: " + response);
}
}
}
40.3. URL과 HttpURLConnection 클래스
자바에서는 java.net 패키지의 URL과 HttpURLConnection 클래스를 사용하여 웹 서버와 통신할 수 있습니다. 이를 통해 HTTP 요청(GET, POST 등)을 보내고 응답을 처리할 수 있습니다.
예시) HttpURLConnection을 이용한 GET 요청
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpGetExample {
public static void main(String[] args) throws Exception {
String urlString = "https://jsonplaceholder.typicode.com/todos/1";
URL url = new URL(urlString);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
System.out.println("Response Code: " + responseCode);
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
StringBuilder response = new StringBuilder();
while ((line = reader.readLine()) != null) {
response.append(line);
}
reader.close();
System.out.println("Response: " + response.toString());
connection.disconnect();
}
}
40.4. 자바 NIO (Non-blocking I/O)
자바 NIO는 자바에서 비동기(non-blocking) 입출력을 지원하는 프레임워크입니다. 기존 I/O 방식과 달리, NIO를 사용하면 복수의 클라이언트와의 연결을 처리할 때 스레드를 적게 사용하면서도 높은 효율성을 얻을 수 있습니다. 자바 NIO를 사용하려면 java.nio 패키지의 클래스와 인터페이스를 사용해야 합니다.
40.5. 웹소켓과 자바
웹소켓은 양방향 통신을 위한 프로토콜로, 일반적인 HTTP 통신과 달리 지속적인 연결을 유지하면서 데이터를 주고받을 수 있습니다. 자바에서는 Java API for WebSocket (JSR 356)을 사용하여 웹소켓 서버와 클라이언트를 구현할 수 있습니다. 또한, 자바 기반의 웹 애플리케이션 서버인 Apache Tomcat, Jetty 등에서도 웹소켓을 지원합니다.
예시) 간단한 웹소켓 서버와 클라이언트 구현
- 서버 (WebSocketEndpoint.java)
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/websocket")
public class WebSocketEndpoint {
@OnOpen
public void onOpen(Session session) {
System.out.println("WebSocket opened: " + session.getId());
}
@OnMessage
public void onMessage(String message, Session session) {
System.out.println("Received message: " + message);
session.getAsyncRemote().sendText("Echo: " + message);
}
@OnClose
public void onClose(Session session) {
System.out.println("WebSocket closed: " + session.getId());
}
@OnError
public void onError(Throwable throwable) {
System.err.println("WebSocket error: " + throwable.getMessage());
}
}
- 클라이언트 (WebSocketClient.java)
import javax.websocket.ClientEndpoint;
import javax.websocket.ContainerProvider;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.WebSocketContainer;
import java.io.IOException;
import java.net.URI;
@ClientEndpoint
public class WebSocketClient {
@OnOpen
public void onOpen(Session session) {
System.out.println("Connected to server");
}
@OnMessage
public void onMessage(String message) {
System.out.println("Received message from server: " + message);
}
@OnClose
public void onClose(Session session) {
System.out.println("Disconnected from server");
}
@OnError
public void onError(Throwable throwable) {
System.err.println("Error: " + throwable.getMessage());
}
public static void main(String[] args) {
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
URI uri = URI.create("ws://localhost:8080/your-context-path/websocket");
try (Session session = container.connectToServer(WebSocketClient.class, uri)) {
session.getBasicRemote().sendText("Hello, server!");
Thread.sleep(3000); // Wait for server's response before closing the session
} catch (Exception e) {
e.printStackTrace();
}
}
}
위 예제 코드는 간단한 웹소켓 서버와 클라이언트를 구현한 것입니다. 웹소켓 서버는 @ServerEndpoint 어노테이션을 사용하여 구현되며, 클라이언트는 @ClientEndpoint 어노테이션을 사용하여 구현됩니다. 각각의 이벤트(@OnOpen, @OnMessage, @OnClose, @OnError)를 처리하는 메서드를 작성하여 웹소켓 통신을 구현할 수 있습니다.
이상으로 자바와 네트워킹에 관한 강좌를 마치겠습니다. 이 강좌를 통해 소켓 프로그래밍, HttpURLConnection, 자바 NIO, 웹소켓 등 다양한 네트워킹 기술을 학습하셨길 바랍니다. 이러한 기술을 활용하면 자바로 웹 서버와 클라이언트 애플리케이션을 개발할 수 있으며, 다양한 네트워크 기반의 서비스를 구축할 수 있습니다.
'GD's IT Lectures : 기초부터 시리즈 > 자바(JAVA) 기초부터 ~' 카테고리의 다른 글
[자바(JAVA)] 기타 자바 라이브러리 및 유용한 도구 (0) | 2023.04.30 |
---|---|
[자바(JAVA)] 자바와 암호화 (0) | 2023.04.30 |
[자바(JAVA)] 자바와 디자인 패턴 (0) | 2023.04.30 |
[자바(JAVA)] 자바의 동시성과 병렬 처리 (0) | 2023.04.30 |
[자바(JAVA)] 자바와 데이터베이스 (0) | 2023.04.30 |
댓글