아무거나

JAVA 네트워크 본문

Java & Kotlin/Java

JAVA 네트워크

전봉근 2019. 8. 17. 00:02
반응형

[JAVA 네트워크]

JAVA는 다른 언어에 비해 네트워크 기능이 뛰어난다. 그 외에도 다양한 API가 많은 고수준의 언어이다.

 

1. InetAddress

-> 호스트의 IP주소를 비롯한 네트워크상의 정보를 얻어오는 클래스 입니다.

ex) [MainClass.java]

public class MainClass {
    public static void main(String[] args) {
    	new InetAdressEx();
    }
}

 

 

[InetAdressEx.java]

import java.net.InetAddress;
import java.util.Scanner;

public class InetAdressEx {
    Scanner scanner;

    public InetAdressEx() {
        System.out.println("Host 이름을 입력하세요");

        scanner = new Scanner(System.in);
        try {
            InetAddress inetAddress = InetAddress.getByName(scanner.next());

            System.out.println("Computer NAME : " + inetAddress.getHostName());
            System.out.println("Computer IP : " + inetAddress.getHostAddress());
        } catch (Exception e) {
        	System.out.println(e.getMessage());
        }
    }
}

 

 

[결과]

Host 이름을 입력하세요
www.google.com
Computer NAME : www.google.com
style="white-space:pre"> Computer IP : 74.125.204.105

 

 

 

2. URLConnection

-> (1) URL 클래스 : DNS를 통한 IP정보를 이용하여, URL객체를 만든 후 네트워크 접속 및 URL정보를 얻어 온다.

ex) www.naver.com -> DNS(영어의 글자(www.naver.com) 같다가 IP주소를 찾게 만들어 준다.) -> IP(xxx.xxx.xxx.xxx)

(2) URLConnection 클래스 : 추상클래스로 URL객체로부터 생성 됩니다. URL클래스의 openConnection() 메소드를 이용한다.

 

ex) [MainClass.java]

public class MainClass {
    public static void main(String[] args) {
    	new URLConEx();
    }
}

 

 

[URLConEx.java]

import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Scanner;

public class URLConEx {
    public URLConEx() {
        String code = null;
        System.out.println("웹 주소를 입력 하세요.");
        Scanner scanner = new Scanner(System.in);
        String address = scanner.next();


        try {
            URL url = new URL(address); // 네트워크 접속해서 URL정보 얻어옴
            URLConnection con = url.openConnection(); // URL커넥션
            BufferedReader webData = new BufferedReader(new InputStreamReader(con.getInputStream())); // 데이터를 가져올 준비를 함
            FileWriter fw = new FileWriter("C:\\Users\\bkjeon\\Desktop\\file.html"); // 한줄씩 계속 읽어서 뽑아옴

            while ((code = webData.readLine()) != null) {
            	fw.write(code); // 한줄씩 쓴다.
            }
            System.out.println("The End");


            fw.close();
            webData.close();
        } catch (Exception e) {
        	e.printStackTrace();
        }
    }
}

 

 

[결과]

웹 주소를 입력 하세요.
http://www.google.com
The End

* http://www.google.com 에서 읽어온 내용을 html 파일로 저장.

 

 

 

3. Socket의 이해

-> 네트워크상에서 서로 다른 호스트 사이의 통신을 위한 수단

SERVER(socket) <-----------------------> CLIENT(socket)

I/O stream

(1) Server에서 ServerSocket을 만들고, 클라이언트의 요청을 기다림.

(2) Client에서 Socket을 만들고, I/O Stream을 만들어 Server로 요청을 함.

(3) Server에서 Client의 요청을 받아 Socket을 만들고, I/O Stream읆 ㅏㄴ듬.

(4) 통신함

(5) Socket 닫음.

 

ex) [MakeServerSocket.java]

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

public class MakeServerSocket {
    ServerSocket serverSocket = null; // Server 소켓
    Socket socket = null; // Socket 객체
    PrintWriter writer = null; // 출력(Client한테 보낼때 사용하는 Writer)
    BufferedReader reader = null; // 데이터를 읽어올때 사용
    String lineStr;

    public MakeServerSocket() {
        try {
            serverSocket = new ServerSocket(2000);

            while (true) {
                socket = serverSocket.accept(); // client에서 요청이 왔을 때 다시 응답을 해줄 소켓이 반환되서 나온다.
                System.out.println("Client 요청");

                writer = new PrintWriter(socket.getOutputStream(), true);
                reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));


                // Client에서 온거를 읽어서 출력스트림(write)에다가 다시 쓴다.
                // 즉, Client에서 온것을 그대로 읽어서 응답해준다.
                while ((lineStr = reader.readLine()) != null) {
                    writer.write(lineStr);
                    System.out.println("input : " + lineStr);
                }

                writer.close();
                reader.close();
                socket.close();
            }
        } catch (Exception e) {}
    }


    public static void main(String[] args) {
    	new MakeServerSocket();
    }

}

 

 

[MakeClientSocket.java]

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class MakeClientSocket {
    Socket socket = null; // server 소켓처럼 client 소켓을 기다릴 필요가 없으므로 socket 객체 하나만 만든다.
    PrintWriter writer = null;
    BufferedReader reader = null;

    public MakeClientSocket() {
        try {
            socket = new Socket("localhost", 2000);
            writer = new PrintWriter(socket.getOutputStream(), true);
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            String str = null;
            BufferedReader sReader = new BufferedReader(new InputStreamReader(System.in));

            while ((str = sReader.readLine()) != null) {
                writer.println(str);
                System.out.println("output:" + str);
            }

            writer.close();
            reader.close();
            sReader.close();
            socket.close();
        } catch (Exception e) {}
        }

    public static void main(String[] args) {
    	new MakeClientSocket();
    }
} 

 

 

[결과]

(1) client
ㅎㅇ
output:ㅎㅇ
(2) server
Client 요청
input : ㅎㅇ

 

반응형

'Java & Kotlin > Java' 카테고리의 다른 글

[Design Pattern] Strategy Pattern  (0) 2019.10.27
iterator vs foreach  (0) 2019.08.17
JAVA 그래픽  (0) 2019.08.16
스레드(Thread)  (0) 2019.08.16
입출력(I/O)  (0) 2019.08.16
Comments