ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] #9 네트워크(Network)
    Software engineer/Java 2023. 5. 4. 13:43

    네트워크(Network)

    Java Networking은 Java에서 제공하는 네트워크 프로그래밍 API입니다. Java에서는 네트워크 프로그래밍을 위한 클래스와 인터페이스를 제공하여 TCP/IP, UDP, HTTP, FTP, SMTP/POP3 등 다양한 프로토콜을 사용하는 네트워크 애플리케이션을 개발할 수 있습니다.

     

    Client/Server

    Java Networking에서는 클라이언트(Client)와 서버(Server) 모델을 사용하여 네트워크 프로그래밍을 구현합니다.

     

    클라이언트(Client)는 서버에 요청을 보내는 역할을 하며, 서버(Server)는 클라이언트의 요청에 대해 응답을 반환하는 역할을 합니다. 이 모델을 사용하여 네트워크 애플리케이션을 구현할 때는 다음과 같은 순서로 작업을 진행합니다.

    1. 서버(Server) 구현: 서버는 ServerSocket 클래스를 사용하여 서버 소켓을 생성하고, accept() 메서드를 호출하여 클라이언트의 접속 요청을 대기합니다. 클라이언트가 접속하면, 서버는 클라이언트와 통신할 소켓(Socket)을 생성합니다.
    2. 클라이언트(Client) 구현: 클라이언트는 Socket 클래스를 사용하여 서버에 접속합니다. 이 때, 서버의 IP 주소와 포트 번호를 지정하여 접속합니다.
    3. 데이터 송수신: 클라이언트와 서버는 InputStream 클래스와 OutputStream 클래스를 사용하여 데이터를 송수신합니다. 이 때, BufferedReader와 BufferedWriter 클래스를 사용하여 데이터를 버퍼링하여 성능을 향상시킬 수 있습니다.
    4. 소켓 종료: 데이터 송수신이 완료되면, 클라이언트와 서버 모두 close() 메서드를 호출하여 소켓을 종료합니다.

    Java Networking에서는 클라이언트와 서버가 분리된 프로세스로 실행될 수도 있고, 같은 프로세스에서 실행될 수도 있습니다. 또한, 멀티스레드를 이용하여 여러 클라이언트와 동시에 통신할 수도 있습니다.

     

    Java Networking을 사용하여 개발할 때는, 서버와 클라이언트 간의 프로토콜을 정의하고, 이를 기반으로 데이터를 송수신하는 것이 중요합니다. 또한, 보안 및 예외 처리와 같은 부분도 신경써야 합니다.

     

    Socket통신을 이용한 채팅 클라이언트/서버 코드

    클라이언트

    import java.io.*;
    import java.net.*;
    
    public class Client {
        public static void main(String[] args) throws IOException {
            String serverHostname = "localhost";
            int serverPort = 8080;
    
            Socket socket = new Socket(serverHostname, serverPort);
            System.out.println("서버에 접속되었습니다.");
    
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    
            BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
            String userInput;
            while ((userInput = stdIn.readLine()) != null) {
                out.write(userInput);
                out.newLine();
                out.flush();
    
                String response = in.readLine();
                if (response == null) {
                    break;
                }
                System.out.println("서버로부터 받은 메시지: " + response);
            }
    
            in.close();
            out.close();
            stdIn.close();
            socket.close();
        }
    }

    서버

    import java.io.*;
    import java.net.*;
    
    public class Server {
        public static void main(String[] args) throws IOException {
            ServerSocket serverSocket = new ServerSocket(8080);
            System.out.println("서버가 시작되었습니다.");
    
            Socket clientSocket = serverSocket.accept();
            System.out.println("클라이언트가 접속했습니다.");
    
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
    
            while (true) {
                String inputLine = in.readLine();
                if (inputLine == null) {
                    break;
                }
                System.out.println("클라이언트로부터 받은 메시지: " + inputLine);
                out.write(inputLine);
                out.newLine();
                out.flush();
            }
    
            in.close();
            out.close();
            clientSocket.close();
            serverSocket.close();
        }
    }

    위 코드는 간단한 채팅 프로그램으로, 클라이언트(Client)가 서버(Server)에 접속한 후, 서로 대화하는 과정을 구현한 예시입니다. 이 코드에서는 Socket 클래스를 사용하여 서버에 접속하고, ServerSocket 클래스를 사용하여 서버 소켓을 생성합니다. 데이터 송수신은 InputStream 클래스와 OutputStream 클래스를 사용하여 이루어집니다.

     

     

    InetAddress

    Java에서 IP 주소를 다루는 클래스는 InetAddress입니다. InetAddress 클래스는 IP 주소를 표현하기 위한 클래스로, IP 주소에 대한 정보를 다루는 기능을 제공합니다.

     

    InetAddress 클래스는 IP 주소의 정보를 얻기 위한 메서드들을 제공합니다. 예를 들어, getByName() 메서드를 사용하면 IP 주소에 대한 InetAddress 객체를 생성할 수 있습니다.

    InetAddress address = InetAddress.getByName("www.google.com");

    InetAddress 클래스는 다양한 정보를 제공하는 메서드를 제공합니다. 예를 들어, getHostName() 메서드를 사용하면 IP 주소에 해당하는 호스트의 이름을 얻을 수 있습니다.

    String hostname = address.getHostName();

    또한 InetAddress 클래스는 IP 주소와 호스트 이름 간의 매핑 정보를 얻기 위한 메서드들도 제공합니다. 예를 들어, getAllByName() 메서드를 사용하면 동일한 호스트 이름에 대한 여러 IP 주소를 얻을 수 있습니다.

    InetAddress[] addresses = InetAddress.getAllByName("www.google.com");

    이렇게 InetAddress 클래스를 사용하여 IP 주소에 대한 정보를 다룰 수 있습니다.

     

     

    URLConnection

    Java에서는 URL 클래스를 사용하여 URL 주소로 데이터를 송수신할 수 있습니다. URL 클래스는 java.net 패키지에 포함되어 있으며, HTTP, FTP, SMTP 등 다양한 프로토콜을 지원합니다.

     

    URL 클래스를 사용하여 URL 주소를 파싱하고 연결을 설정한 후, URLConnection 클래스를 사용하여 데이터를 송수신합니다. 다음은 Java에서 URL 통신을 위한 간단한 예시 코드입니다.

    import java.net.*;
    
    public class URLExample {
        public static void main(String[] args) throws Exception {
            URL url = new URL("https://www.google.com");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    
            conn.setRequestMethod("GET");
            conn.setRequestProperty("User-Agent", "Mozilla/5.0");
    
            int responseCode = conn.getResponseCode();
            System.out.println("Response Code : " + responseCode);
    
            BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String inputLine;
            StringBuffer response = new StringBuffer();
    
            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
    
            in.close();
    
            System.out.println(response.toString());
        }
    }

    위 코드에서는 URL 클래스를 사용하여 "https://www.google.com" 주소에 대한 객체를 생성합니다. 이후 openConnection() 메서드를 사용하여 URLConnection 객체를 생성하고, setRequestMethod() 메서드와 setRequestProperty() 메서드를 사용하여 요청 메시지를 설정합니다. getResponseCode() 메서드를 사용하여 서버로부터 받은 응답 코드를 확인한 후, getInputStream() 메서드를 사용하여 서버로부터 받은 데이터를 읽습니다.

     

    이렇게 URL 클래스와 URLConnection 클래스를 사용하여 Java에서 URL 통신을 구현할 수 있습니다.

     

Designed by Tistory.