3월 ~ 5월) 자바/java

22Day - InetAddressApp / SeverSocketApp / TimeServerApp & TimeClientApp / EchoServerApp & EchoCliectApp / MessageSendApp & MessageReceiveApp

첼로그 2023. 4. 28. 00:11

InetAddressApp

package xyz.itwill.net;
import java.net.InetAddress;
import java.net.UnknownHostException;

// java.net 패키지 : 네트워크 프로그램을 작성하기 위한 기능의 클래스가 선언된 패키지
public class InetAddressApp {
    public static void main(String[] args) throws UnknownHostException {
        // InetAdress 쿨래스 : 네크워크 식별자(IP 주소 및 호스트이름)를 저장하기 위한 클래스

        // InetAddress.getLocalHost() : 현재 사용중인 컴퓨터의 네트워크 식별자가 저장된
        // InetAddress 객체를 반환하는 메소드
        // > UnknownHostException 발생(일반예외) : 호스트이름의 컴퓨터를 검색할 수 없는 경우 발생되는 예외
        // 현재 사용중인 컴퓨터는 기본적으로 [127.0.01]의 IP 주소가 제공되며 [localhost]라는 이름으로 호스트이름 설정
        InetAddress myComputer = InetAddress.getLocalHost();

        // InetAddress.toString() : InetAddress 객체에 저장된 네트워크 식별자를 문자열로 변환하여 반환하는 메소드
        System.out.println("my Computer = " + myComputer);

        // InetAddress.getHostName() : InetAddewss 객체에 저장된 네트워크 식별자에서 호스트이름을 문자열로 변환하여 반환하는 메소드
        // 호스트이름을 문자열로 변환하여 반환하는 메소드
        System.out.println("my Computer = " + myComputer.getHostName());

        // InetAddress.getHostAddress() : InetAddress 객체에 저장된 네트워크 식별자에서 IP 주소를 문자열로 변환하여 반환하는 메소드
        System.out.println("my Computer = " + myComputer.getHostAddress());
        
        
my Computer = Blood/192.000.00.0 // 유저이름 & 아이피주소
my Computer = Blood  // 유저이름
my Computer = 192.000.00.0  // 유저이름 & 아이피주소
        
        
        

        System.out.println("---------------------------------------------------------------");

        // InetAdress.getByName(Sting name) : 매개변수로 전달받은 호스트이름에 대한 네트워크 식별자가 저장된 InetAddress
        InetAddress itwill = InetAddress.getByName("www.itwil.xyz");
        System.out.println("[www.itwill.xyz]의 IP 주소 = " + itwill.getHostAddress());

        System.out.println("---------------------------------------------------------------");

        // InetAddress.getAllByName(String name) : 매개변수로 전달받은 호스트이름에 대한
        // 네트워크 식별자가 저장된 InetAddress 객체의 배열을 반환하는 메소드
        InetAddress[] naver = InetAddress.getAllByName("www.naver.com");

        for(InetAddress address : naver) {
            System.out.println("[www.naver.com]의 IP 주소 = " + address.getHostAddress());
        }
    }
}

// TCP 프로그램 : ServerSocket 클래스와 Socket 클래스를 이용하여 작성
// > 서버와 클라이언트가 소켓을 사용하여 1:1로 데이터를 송수신하는 네트워크 프로그램

// 서버(Server) : 외부의 컴퓨터(클라이언트)가 접속할 수 있는 환겨오가 서비스를 제공하기 위한 컴퓨터
// > ServerSocket 클래스를 사용하여 서버 프로그램 작성

// SeverSocket 클래스를 사용하여 사용 가능을 포트번호를 검색하는 프로그램 작성

 

SeverSocketApp 

package xyz.itwill.net;
import java.io.IOException;
import java.net.ServerSocket;

public class SeverSocketApp {
    public static void main(String[] args) {
        for (int i = 2000; i <= 9000; i+=1000 ) {
            try {
                // ServerSocket 클래스 : 서버 프로그램을 작성하기 위해 사용하는 클래스
                // > ServerSocket 클래스의 ServerSocket(int port) 생성자를 이용하여
                // 매개변수로 전달받은 포트번호를 활성화하여 ServerSocket 객체 생성
                // > ServerSocket 객체를 생성하여 클라이언트가 접속할 수 있는 환경 제공
                // > 매개변수로 전달받은 포트번호를 이미 다른 네트워크 프로그램에 사용중인 경우 IOException 발생
                ServerSocket serverSocket = new ServerSocket(i);

                System.out.println("[메세지]" + i + "번 포트는 네트워크 프로그램에서 사용 가능합니다.");

                // SeverSocket.close() : ServerSocket 객체를 제거하는 메소드
                // > 클라이언트가 접속할 수 있는 환경 소멸
                serverSocket.close();
            } catch (IOException e) {
                System.out.println("[메세지]" + i + "번 포트는 이미 다른 네트워크 프로그램에서 사용했습니다.");
            }
        }
    }
}

[메세지]2000번 포트는 네트워크 프로그램에서 사용 가능합니다.
[메세지]3000번 포트는 네트워크 프로그램에서 사용 가능합니다.
[메세지]4000번 포트는 네트워크 프로그램에서 사용 가능합니다.
[메세지]5000번 포트는 네트워크 프로그램에서 사용 가능합니다.
[메세지]6000번 포트는 네트워크 프로그램에서 사용 가능합니다.
[메세지]7000번 포트는 네트워크 프로그램에서 사용 가능합니다.
[메세지]8000번 포트는 네트워크 프로그램에서 사용 가능합니다.
[메세지]9000번 포트는 네트워크 프로그램에서 사용 가능합니다.

TimeServerApp

package xyz.itwill.net;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

// 접속된 클라이언트에게 서버 컴퓨터의 현재 날짜와 시간을 전달하는 서버 프로그램 작성
// > NTP(Network Time Protocol) Server : 날짜와 시간을 제공하는 서버 컴퓨터
public class TimeServerApp {
    public static void main(String[] args) {
        ServerSocket ntpServer = null;

        try {
            // ServerSocket 객체 생성 : 포트를 활성화하여 클라이언트가 접속할 수 있는 환경 제공
            ntpServer = new ServerSocket(2000);

            // ServerSocket.toString() : ServerSocket 객체에 저장된 접속 관련 정보를 문자열로 반환하는 메소드
            // System.out.println("ntpServer = "+ntpServer);

            System.out.println("[메세지]NTP Server Running...");

            // 서버 프로그램에 다수의 클라이언트 접속을 허용하도록 무한루프 사용
            while(true) {
                // ServerSocket.accept() : 클라이언트가 접속되면 클라이언트와 값을 주고 받을 수 있는 Socket 객체를 반환하는 메소드
                // > 클라이언트가 접속되기 전까지 스레드가 일시 중지되며 클라이언트가 접속되면
                // 클라이언트의 소켓과 연결될 소켓을 생성하여 반환하고 스레드 재실행
                Socket socket=ntpServer.accept();

                //System.out.println("socket = "+socket);

                /**
                 //Socket.getOutputStream() : Socket 객체의 출력스트림(OutputStream 객체)을
                 //반환하는 메소드
                 OutputStream stream=socket.getOutputStream();
                 //OutputStream 객체를 전달받아 객체를 전달할 수 있는 출력스트림으로 확장
                 ObjectOutputStream out=new ObjectOutputStream(stream);

                 //출력스트림을 이용하여 시스템의 현재 날짜와 시간이 저장된 Date 객체를 생성
                 //하여 전달 - 클라이언트에게 날짜와 시간을 전송
                 out.writeObject(new Date());
                 */

                new ObjectOutputStream(socket.getOutputStream()).writeObject(new Date());

                // 로그 처리 - 기록
                //Socket.getInetAddress() : 소켓과 연결된 외부 컴퓨터의 네트워크 식별자가
                //저장된 InetAddress 객체를 반환하는 메소드
                System.out.println("[정보]클라이언트["+socket.getInetAddress()
                        .getHostAddress()+"]에게 날짜와 시간을 제공 하였습니다.");

                // 클라이언트와의 접속 해제
                socket.close();
            }
        } catch (IOException e) {
            System.out.println("[에러]서버 네트워크에 문제가 발생 되었습니다.");
        }
    }
}

[메세지]NTP Server Running...

 


TimeClientApp 

package xyz.itwill.net;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;

// NTP 서버에 접속하여 서버에서 보내온 날짜와 시간을 제공받아 출력하는 클라이언트 프로그램 작성
public class TimeClientApp {
    public static void main(String[] args) throws ClassNotFoundException {
        try {
            // Socket 클래스 : TCP 프로그램에서 타겟 컴퓨터와 연결을 위한 정보를 저장하기 위한 클래스
            // - 다른 컴퓨터의 소켓과 연결되어 값을 송수신할 수 있는 입출력 스트림 제공
            // > Socket 클래스의 Socket(String host, int port) 생성자를 이용해 매개변수에
            // 접속 컴퓨터의 네트워크 식별자(호스트이름 또는 IP주소)와 활성화된 포트번호를 전달하여 Socket 객체 생성 - 서버 접속
            Socket socket = new Socket("192.168.30.8", 2000); // 192.168.13.24 는 컴퓨터 아이피주소

            // System.out.println("socket = "+socket);

            // Socket.getInputStream() : Socket 객체의 입력스트림(InputStream 객체)를 반환하는 메소드
            InputStream stream = socket.getInputStream();

            // InputStream 객체를 전달받아 객체를 받을 수 있는 입력스트림으로 확장
            ObjectInputStream in = new ObjectInputStream(stream);

            // 입력스트림을 이용하여 서버에서 보내온 Date 객체를 반환받아 저장
            Date date = (Date) in.readObject();

            // Date 객체에 저장된 날짜와 시간을 원하는 형식의 문자열로 변환하여 출력
            System.out.println("[결과]서버에서 보내온 날짜와 시간 = "
                    + new SimpleDateFormat("yyyy년 MM월 dd일 HH시 mm분 ss초").format(date));

            // Socket.close() : Socket 객체를 제거하는 메소드 - 접속 해제
            socket.close();
        } catch (UnknownHostException e) {
            System.out.println("[에러]서버를 찾을 수 없습니다.");

        }  catch (IOException e) {
            System.out.println("[에러]서버에 접속 할 수 없습니다.");
        }
    }
}

[에러]서버에 접속 할 수 없습니다.

EchoServerApp

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;


// 클라이언트에서 보내온 메세지를 제공받아 출력하는 서버 프로그램 작성
public class EchoServerApp {
    public static void main(String[] args) {
        ServerSocket echoServer = null;

        try {
            echoServer = new ServerSocket(3000);
            System.out.println("[메세지]Echo Server Running...");

            while(true) {
                Socket socket = echoServer.accept();

                // 소켓의 입력스트림을 제공받아 대량의 문자데이타를 입력받을 수 있는 입력스트림 확장
                BufferedReader in = new BufferedReader
                        (new InputStreamReader(socket.getInputStream()));

                // 클라이언트의 소켓과 연결된 입력스트림을 이용하여 문자열(메세지)를 반환받아 출력
                System.out.println("[" + socket.getInetAddress().getHostAddress()
                        +"]님이 보내온 메세지 = " + in.readLine());

                socket.close();
            }
        } catch (IOException e) {
            System.out.println("[에러]서버 네트워크에 문제가 발생 되었습니다.");
        }
    }
}

[메세지]Echo Server Running...

 


EchoCliectApp

 

import java.io.*;
import java.net.Socket;

// 키보드로 메세지를 입력받아 접속 서버에 전달하는 클라이언트 프로그램 작성
public class EchoCliectApp {
    public static void main(String[] args) throws IOException {
        // 키보드 입력스트림을 대량의 문자데이타를 입력받을 수 있는 입력스트림으로 확장
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

        System.out.print("전달 메세지 입력 >> ");
        String message = in.readLine();

        try {
            Socket socket=new Socket("192.168.13.31", 3000);

			/*
			// 소켓의 출력스트림을 제공받아 대량의 문자데이타를 전달할 수 있는 출력스트림으로 확장
			BufferedWriter out=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

			// 서버의 소켓과 연결된 출력스트림을 이용하여 문자열(메세지) 전달
			out.write(message);

			// 출력스트림의 버퍼에 존재하는 문자데이타를 출력스트림으로 전달
			out.flush();
			*/

            // 소켓의 출력스트림을 제공받아 모든 자료형의 값을 문자열로 변환하여 전달할 수 있는 기능의 출력스트림으로 확장
            PrintWriter out = new PrintWriter(socket.getOutputStream());

            // PrintWriter.println(Object o) : 매개변수로 전달받은 모든 자료형의 값(객체)를 문자열로 변환하여 전달하는 메소드
            out.println(message);
            out.flush();

            socket.close();
        } catch (IOException e) {
            System.out.println("[에러]서버에 접속할 수 없습니다.");
        }
    }
}


전달 메세지 입력 >> 랄라

 

 

 

 MessageSendApp

package xyz.itwill.net;
// UDP 프로그램 : DatagramSocket 클래스와 DatagramPacket 클래스를 이용하여 작성
// > 값을 전달하는 컴퓨터와 값을 전달받는 컴퓨터로 구분
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

// UDP 프로그램 : DatagramSocket 클래스와 DatagramPacket 클래스를 이용하여 작성
// > 값을 전달하는 컴퓨터와 값을 전달받는 컴퓨터로 구분하여 처리

// 키보드로 메세지를 입력받아 다른 컴퓨터에게 전달하는 UDP 프로그램 작성
public class MessageSendApp {
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

        System.out.print("전달 메세지 입력 >> ");
        String message=in.readLine();

        // DatagramSocket 클래스 : 다른 컴퓨터와 연결하기 위한 정보를 저장하기 위한 클래스
        DatagramSocket socket = new DatagramSocket();

        // 연결할 컴퓨터의 네트워크 식별자가 저장된 InetAddress 객체를 반환받아 저장
        InetAddress address=InetAddress.getByName("192.168.13.31");

        // String.getBytes() : String 객체에 저장된 문자열을 byte 배열로 변환하여 반환하는 메소드
        byte[] data=message.getBytes();

        // DatagramPacket 클래스 : 연결 컴퓨터에게 보낼 패킷정보를 저장하기 위한 클래스
        // > DatagramPacket 클래스의 DatagramPacket(byte[] data, int length, InetAddress address, int port)
        // 생성자를 사용하여 데이타를 보내기 위한 패킷정보가 저장된 DatagramPacket 객체 생성
        DatagramPacket packet=new DatagramPacket(data, data.length, address, 4000);

        // DatagramSocket.send(DatagramPacket packet) : 매개변수로 전달받은 DatagramPacket
        // 객체의 패킷정보를 이용하여 데이타(패킷)를 전달하는 메소드
        socket.send(packet);

        // DatagramSocket.close() : DatagramSocket 객체를 제거하는 메소드
        socket.close();

        System.out.println("[결과]연결 컴퓨터에게 메세지를 보냈습니다.");
    }
}

전달 메세지 입력 >> 왼손은 거들뿐
[결과]연결 컴퓨터에게 메세지를 보냈습니다.

 MessageReceiveApp

package xyz.itwill.net;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

// 다른 컴퓨터에서 보내온 메세지를 얻어와 출력하는 UDP 프로그램 작성
public class MessageReceiveApp {
    public static void main(String[] args) throws IOException {
        // 다른 컴퓨터에서 보내온 데이타를 전달받기 위한 DatagramSocket 객체 생성
        // > DatagramSocket 클래스의 DatagramSocket(int port) 생성자를 사용하여 포트를 활성화 처리하여 DatagramSocket 객체 생성
        DatagramSocket socket=new DatagramSocket(4000);

        // 전달받은 값(메세지)을 저장하기 위한 byte 배열 선언
        byte[] data=new byte[1024];

        // 연결 컴퓨터에서 보내온 값을 byte 배열에 저장하기 위한 DatagramPacket 객체 생성
        // > DatagramPacket 클래스의 DatagramPacket(byte[] buf, int length) 생성자를 이용하여 DatagramPacket 객체 생성
        DatagramPacket packet = new DatagramPacket(data, data.length);

        System.out.println("메세지 수신중...");

        // DatagramSocket.receive(DatagramPacket packet) : 연결 컴퓨터에서 보내온 값을 얻어와 DatagramPacket 객체의 byte 배열에 저장하기 위한 메소드
        // > 패킷을 받기 전까지 스레드 일시 중지
        socket.receive(packet);

        // byte 배열에 저장된 원시데이타를 문자열로 변환하여 저장
        String message = new String(data);

        System.out.println("[결과]메세지 = "+message);

        socket.close();
    }
}

메세지 수신중...