본문 바로가기

개발(합니다)/Java&Spring

[java-기초-18] 네트워크 기초

반응형

네트워크란

네트워크는 여러 대의 컴퓨터를 통신 회선으로 연결하는 것을 의미하며 인터넷은 지역 네트워크를 통신 회선으로 연결한 것을 의미합니다.

서버와 클라이언트

데이터를 주고 받는 행위는 프로그램이 하며 각각의 프로그램의 역할을 서버와 클라이언트라고 하며, 받는 프로그램을 클라이언트, 주는 프로그램을 서버라고 합니다.

IP 주소와 포트

인터넷 상의 고유한 주소를 IP주소라고 하고 집의 호수를 같은 지정 된 위치를 포트라고 합니다.
IP보다 외우기 쉽게 문자로 변환한게 DNS입니다.

구분명 범위 설명
Well Know Port Numbers 0~1023 국제인터넷주소관리기구(ICANN)가 특정 애플리케이션용으로 미리 예약한 포트
Registered Port Numbers 1024~49151 회사에서 등록해서 사용할 수 있는 포트
Dynamic Or Private Port Numbers 49152~65535 운영체제가 부여하는 동적 포트 또는 개인적인 목적으로 사용할 수 있는 포트

IP 주소 얻기

package networks;

import java.net.InetAddress;
import java.net.UnknownHostException;


public class Network1 {
    public static void main(String[] args) {
        try {
            InetAddress local = InetAddress.getLocalHost();
            System.out.println(" 내 컴퓨터 IP " + local.getHostAddress());

            InetAddress[] naver = InetAddress.getAllByName("www.naver.com");
            for (InetAddress i : naver) {
                System.out.println(i.getHostAddress());
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
}

TCP 네트워킹

TCP는 연결 지향적 프로토콜로 클라이언트와 서버가 연결된 상태에서 데이터를 주고 받는 프로토콜 방식을 의미합니다.
모든 데이터는 고정된 통신 선로를 통해서 순차적으로 전달되어 데이터가 정확하고 안전하고 전달됩니다.
다만, 데이터를 보내기 전에 반드시 연결이 형성되어야 하는데(가장 많이 걸리는 작업), 고정된 통신 선로가 최단선(네트워크 길이 측면)이 아닐 경우 상대적으로 UDP보다 데이터 전송 속도가 느릴 수 있습니다.

  • java.net.ServerSocket
  • java.net.Socket

TCP 서버의 역할

TCP 서버의 역할은 두 가지이며, 하나는 클라이언트가 연결 요청하면 연결을 수락하고 다른 하나는 연결된 클라이언트와 통신하는 것입니다.
자바에서는 두 역할을 별도의 클래스로 제공하며, 클라이언트의 연결 요청을 기다리면서 연결 수락을 담당하는 것이 java.net.ServerSocket 클래스이고, 연결된 클라이언트와 통신을 담당하는 것이 java.net.Socket 클래스입니다.
클라이언트가 연결 요청하면 ServerSocket은 연결을 수락하고 통신용 Socket을 만듭니다.

서버는 클라이언트가 접속할 포트를 가져야 하며 이를 바인딩 포트라고 합니다.

서버

package networks;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;


public class Network2Server {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket();
            serverSocket.bind(new InetSocketAddress("localhost", 5001));

            while (true) {
                System.out.println("연결 기다림");
                Socket socket = serverSocket.accept();
                InetSocketAddress isa = (InetSocketAddress) socket.getRemoteSocketAddress();
                System.out.println("[연결 수락함] " + isa.getHostName());

                byte[] bytes = null;
                String message = null;

                InputStream is = socket.getInputStream();
                bytes = new byte[100];
                int readByteCount = is.read(bytes);
                message = new String(bytes, 0, readByteCount, "UTF-8");
                System.out.println("데이터 받기 성공 : " + message);

                OutputStream os = socket.getOutputStream();
                message = "Hellow Client";
                bytes = message.getBytes(StandardCharsets.UTF_8);
                os.write(bytes);
                os.flush();
                System.out.println("데이터 보내기 성공");
                is.close();
                os.close();

            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        if(!serverSocket.isClosed()){
            try {
                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

클라이언트

package networks;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;


public class Network2Client {
    public static void main(String[] args) {
        Socket socket = null;
        try {
            socket = new Socket();
            System.out.println("연결 요청");
            socket.connect(new InetSocketAddress("localhost", 5001));
            System.out.println("연결 성공");

            byte[] bytes = null;
            String message = null;

            OutputStream os = socket.getOutputStream();
            message = "Hello Server";
            bytes = message.getBytes(StandardCharsets.UTF_8);
            os.write(bytes);
            os.flush();
            System.out.println("데이터 보내기 성공");

            InputStream is = socket.getInputStream();
            bytes = new byte[100];
            int readByteCount = is.read(bytes);
            message = new String(bytes, 0, readByteCount, "UTF-8");
            System.out.println("데이터 받기 성공 : " + message);

            os.close();
            is.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

        if (!socket.isConnected()) {
            try {
                socket.close();
            }catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

반응형