본문 바로가기
GD's IT Lectures : 기초부터 시리즈/자바(JAVA) 기초부터 ~

[자바(JAVA)] 자바와 네트워킹

by GDNGY 2023. 4. 30.

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, 웹소켓 등 다양한 네트워킹 기술을 학습하셨길 바랍니다. 이러한 기술을 활용하면 자바로 웹 서버와 클라이언트 애플리케이션을 개발할 수 있으며, 다양한 네트워크 기반의 서비스를 구축할 수 있습니다.

반응형

댓글