본문 바로가기

Java

네트워크 network

  • 각 지역에 흩어져 있는 방송국이 그물처럼 연결되어 전국적으로 같은 방송을 전달할 수 있도록 만들어진 형태의 방송망
  • 컴퓨터 및 통신 분야에서 복수의 컴퓨터를 통신 회선으로 연결하여 사용하는 것
  • 컴퓨터들끼리 서로 연결하여 데이터를 주고 받거나, 자원을 공유하는 용도로 사용
  • java.net 패키지 제공

기본 용어

클라이언트 client / 서버 server

  • 클라이언트 : 네트워크 상에서 서비스를 서버에 요청하는 컴퓨터(request)
  • 서버 : 네트워크 상에서 클라이언트에 서비스를 제공(응답)하는 컴퓨터(response)
  • http://thedata.kr/thecoding/coding/web-programming

IP Address

  • 네트워크(인터넷)에서 컴퓨터를 구별할 때 사용하는 고유한 값
  • 4바이트(32비트), 0~255의 정수
  • 윈도우 ipconfig, 리눅스 ifconfig 명령어로 확인

포트 port / 소켓 socket

  • 포트 : 네트워크에서 컴퓨터와 컴퓨터가 서로 연결되는 통로
  • 소켓 : 특정 포트를 통해 양방향 통신이 가능하도록 만들어 주는 소프트웨어 장치(접속 끝단, endpoint)

URL

TCP/UDP

  • OSI7 계층의 전송(Transport) 계층에 해당하는 프로토콜
  • TCP(Transmission Control Protocol) : 연결 지향 프로토콜
  • UDP( Universal,User Datagram Protocol) : 비 연결형 프로토콜
  • http://thedata.kr/thecoding/coding/web-programming

네트워크 연결 순서

  1. 클라이언트에서 서버 연결 요청
  2. 서버에서 연결 수락 응답
  3. 클라이언트 서비스 요청
  4. 서버에서 서비스 응답

네트워크 관련 클래스

InetAddress 클래스

  • 특정 IP 주소를 다루기 위한 클래스
package chapter19;

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

public class InetAddressEx {

    public static void main(String[] args) {

        try {
            // getByName메서드로 InetAddress 객체 생성
            InetAddress ip = InetAddress.getByName("www.google.co.kr");
            System.out.println("hostname : " + ip.getHostName());
            System.out.println("ip : " + ip.getHostAddress());

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


            // getLocalHost 메서드로 InetAddress 객체 생성 호출
            InetAddress local = InetAddress.getLocalHost();
            System.out.println("내컴퓨터 IP: " + local);


        } catch (UnknownHostException e) {
            System.out.println(e.getMessage());
        }

    }

}

URL 클래스

  • 특정 URL 주소를 다루는 클래스
  • openStream() : InputStream 리턴
  • getConnection() : URLConnection 객체(추상클래스) 리턴

URL 자원 읽기

package chapter19;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.MalformedURLException;
import java.net.URL;

public class URLEx {

    public static void main(String[] args) {

        try {
            URL url = null;
            url = new URL("https://www.egovframe.go.kr/EgovIntro.jsp?menu=1&submenu=1");
            System.out.println("authority : " + url.getAuthority());
            System.out.println("content : " + url.getContent());
            System.out.println("protocol : " + url.getProtocol());
            System.out .println("host : " + url.getHost());
            System.out.println("port : " + url.getPort());
            System.out.println("path : " + url.getPath());
            System.out.println("file : " + url.getFile());
            System.out.println("query : " + url.getQuery());
            // URL 을 통해서 정보 받기
            int data = 0;
            try {
                Reader is = new InputStreamReader(url.openStream());
                while ((data = is.read()) != -1) {
                    System.out.print((char) data);
                }
                System.out.println();
            } catch (IOException e) {
                e.printStackTrace();
            }

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

    }

}

TCP 소켓 프로그램

  • 소켓을 이용하여 클라이언트와 서버간 1:1 통신하는 프로그램
  • TCP는 서버 먼저 실행해서 클라이언트의 연결 요청 대기 (리스닝)

통신 순서

  1. 서버프로그램의 서버소켓 특정포트에서 클라이언트 연결 요청 리스닝
  2. 클라이언트소켓에서 서버 IP주소와 포트로 셔버 연결 요청
  3. 클라이언트의 연결 요청을 받은 서버는 새로운 소켓을 생성해서 클라이언트소켓과 연결
  4. 클라이언트소켓과 서버소켓 1:1 통신

Socket

  • 클라이언트에서 서버 호스트 연결
  • getInputStream() : 데이트터 입력 스트림
  • getOutputStream() : 데이트터 출력스트림

ServerSocket

  • 서버쪽에 생성
  • accept() : 클라이언트 요청 리스닝 및 통신 위한 Socket 객체 리턴
  • 클라이언트 송신 -> 서버 수신 -> 클라이언트 송신
TCP Server
package chapter19;

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

public class TCPServer {

    public static void main(String[] args) {

        try {
            ServerSocket socket = new ServerSocket(5000);
            System.out.println("== Server Running!! ==");
            while (true) {
                Socket s = socket.accept();
                InputStream is =  s.getInputStream(); // 소켓과 스트림연결 
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);

                System.out.println("== Client Connected!! ==");
                System.out.println(">> " + br.readLine());
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
    }
}
TCPClient

메세지 한번 보내기

package chapter19;

import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

public class TCPClient {

    public static void main(String[] args) {

        try {
            Socket s = new Socket("127.0.0.1", 5000);
            System.out.println("== Client Running!! ==");

            OutputStream os =  s.getOutputStream(); // 소켓과 스트림연결 
            OutputStreamWriter isr = new OutputStreamWriter(os);
            PrintWriter pw = new PrintWriter(isr);
            pw.println("hi~~~hello");
            pw.close();
            s.close();
            System.out.println("== Client Closed!! ==");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 

    }

}

메세지 반복 보내기

package chapter19;

import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class TCPClientLoop {

public static void main(String[] args) {

        try {


            System.out.println("== Client Running!! ==");

            Scanner sc = new Scanner(System.in);
            while(true) {
                System.out.println("msg >> ");                
                String msg = sc.nextLine();
                if(msg.equals("q")) break;
                Socket s = new Socket("127.0.0.1", 5000);
                OutputStream os =  s.getOutputStream(); // 소켓과 스트림연결 
                OutputStreamWriter isr = new OutputStreamWriter(os);
                PrintWriter pw = new PrintWriter(isr);
                pw.println(msg);
                pw.close();
                s.close();
            }
            //pw.close();

            System.out.println("== Client Closed!! ==");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 

    }

}


'Java' 카테고리의 다른 글

회원관리-배열  (0) 2022.03.07
JDBC  (0) 2022.03.07
입출력 Input / Output  (0) 2022.03.07
스레드 thread  (0) 2022.03.07
스트림 stream  (0) 2022.03.07