경계의 경계

자바의 네트워킹과 소켓 통신 본문

Java

자바의 네트워킹과 소켓 통신

gigyesik 2024. 2. 27. 03:23

네트워킹과 소켓 통신은 무엇인가

  • 네트워킹 (Networking) 은 복수의 컴퓨터가 연결되어 서로 리소스를 교환하는 것을 의미한다.
  • 소켓 (Socket) 은 서로 다른 두 프로그램이 네트워크 상에서 상호작용할 때 통로, 즉 각 프로그램의 엔드포인트 (Endpoint) 이다.

네트워킹 프로토콜

  • TCP : Transmission Control Protocol. 두 어플리케이션 간 통신을 중재한다. 주로 TCP/IP 라 불리는 인터넷 통신에 쓰인다.
  • UDP : User Datagram Protocol. 두 어플리케이션 간 데이터 패킷을 중재하는 프로토콜

네트워킹 예제

  • 서로 다른 두 어플리케이션을 연결하기 위해 소켓 연결을 설정한다. 소켓 연결은 IP 주소와 포트로 구성되어 있다.
  • 두 어플리케이션이 연결되면, 데이터 이동을 발생시킨다.
  • 필요한 통신을 마치고 나면 연결을 해제한다.

클라이언트 (Client)

  • IP 127.0.0.1, 포트 3000 으로 구성된 소켓을 구성한다.
  • DataInputStream, DataOutputStream 을 통해 사용자로부터 입력을 받고 서버에 전송한다.
  • “End” 문자열을 입력받을 때까지 반복 후 연결을 종료한다.
public class ClientTest {
    private Socket socket = null;
    private DataInputStream input = null;
    private DataOutputStream output = null;

    public ClientTest(String address, int port) {
        try {
            socket = new Socket(address, port);
            System.out.println("Connected");

            // 입력 받기
            input = new DataInputStream(System.in);

            // 소켓에 출력 보내기
            output = new DataOutputStream(socket.getOutputStream());

        } catch (IOException e) {
            System.out.println("IOException");
        }

        String s = "";

        while (!s.equals("End")) {
            try {
                s = input.readLine();
                output.writeUTF(s);
            } catch (IOException e) {
                System.out.println("IOException");
            }
        }

        try {
            input.close();
            output.close();
            socket.close();
        } catch (IOException e) {
            System.out.println("IOException");
        }
    }

    public static void main(String[] args) {
        ClientTest client = new ClientTest("127.0.0.1", 3000);
    }
}

서버 (Server)

  • 3000번 포트로 소켓을 지정한다. 호스트는 localhost (127.0.0.1)
  • 클라이언트의 연결 요청을 accept() 메서드를 통해 허용한다.
  • DataInputStream 을 통해 입력을 받는다.
  • “End” 문자열이 들어오면 연결을 종료한다.
public class ServerTest {
    private Socket socket = null;
    private ServerSocket server = null;
    private DataInputStream input = null;

    public ServerTest(int port) {
        try {
            server = new ServerSocket(port);
            System.out.println("Server Started");

            System.out.println("Waiting for a client");

            socket = server.accept();
            System.out.println("Client Accepted");

            input = new DataInputStream(new BufferedInputStream(socket.getInputStream()));

            String s = "";

            while (!s.equals("End")) {
                s = input.readUTF();
                System.out.println(s);
            }

            System.out.println("Closing Connection");

            socket.close();
            input.close();

        } catch (IOException e) {
            System.out.println("IO Exception");
        }
    }

    public static void main(String[] args) {
        ServerTest server = new ServerTest(3000);
    }
}

Resources

'Java' 카테고리의 다른 글

자바의 Stream  (1) 2024.02.29
자바의 제네릭 (Generic)  (1) 2024.02.28
자바의 직렬화 (Serialization)  (0) 2024.02.22
자바의 Collection Framework  (1) 2024.02.20
자바의 메모리 관리  (1) 2024.02.13