※ TCP/IP 프로토콜
- TCP는 Transmission Control Protocol
- 두 시스템 간에 신뢰성 있는 데이터의 전송을 관장하는 프로토콜
- 프로토콜: 통신할 때 사용하는 약속
- 예) 무전기의 ‘오버’
- 동시에 두 사람이 같이 말할 수 없다. 등 규칙이 필요
- 프로토콜: 통신할 때 사용하는 약속
- TCP에서 동작하는 응용프로그램 사례
- e-mail, FTP, 웹(HTTP) 등
※ IP
- Internet Protocol
- 패킷 교환 네트워크에서 송신 호스트와 수신 호스트가 데이터를 주고 받는 것을 관장 하는 프로토콜
- TCP보다 하위 레벨 프로토콜
=> 이와 같이 통신기기와 환경의 특성에 따라 대화자 간에 약속을 정한 것이 프로토콜
인터넷에 연결된 컴퓨터 간 에는 TCP/IP라는 프로토콜 사용, 대표적인 것으로 http, ftp 모두 TCP/IP를 기반으로 하는 프로토콜
※ TCP/IP : 송신자가 수신자에게 IP 주소를 사용하여 데이터를 전달하고 그 데이터가 제대로 갔는지, 너무 빠르지는 않는지, 제대로 받았다고 연락은 오는지에 대한 이야기를 하는 것
※ 프로토콜(Protocal)
- 프로토콜(Protocol)은 컴퓨터 간에 상호통신을 할 때 데이터를 원활하고 신뢰성 있게 주고 받기 위해 필요한 약속을 규정하는 것
※ IP 주소
- 네트워크 상에서 유일하게 식별될 수 있는 컴퓨터 주소
- 숫자로 구성된 주소
- 4개의 숫자가 '.' 으로 연결
- ex) 127.0.0.1
- 숫자로 된 주소는 기억하기 어려우므로 www.naver.com과 같은 문자열로 구성된 도메인 이름으로 바꿔 사용
- DNS(Domain Name System) 서버
- => 문자열로 구성된 도메인 이름을 숫자로 구성된 IP 주소로 자동 변환
- DNS(Domain Name System) 서버
- 현재는 32비트의 IP 버전 4 IPv4 가 사용되고 있음
- IP 주소 고갈로 인해 128비트의 IP 버전 6 IPv6이 점점 사용되는 추세
※ 포트(Port)
- 통신하는 프로그램 간에 가상의 연결단 포트 생성
- IP 주소는 네트워크 상의 컴퓨터 또는 시스템을 식별하는 주소
- 포트 번호를 이용하여 통신할 응용프로그램 식별
- 모든 응용프로그램은 하나 이상의 포트 생성 가능
- 포트를 이용하여 상대방 응용프로그램과 데이터 교환
- 잘 알려진 포트(well-known ports)
- 시스템이 사용하는 포트 번호
- 잘 알려진 응용프로그램에서 사용하는 포트 번호
- " 0 ~ 1023 " 사이의 포트 번호
- ex) FTP 21, SSH 22 HTTP 80, HTTPS 443
- 잘 알려진 포트 번호는 개발자가 사용하지 않는 것이 좋음
- (0부터 1023 사이의 포트 번호를 제외한 나머지 ~ 65535까지의 포트 사용)
- 충돌 가능성 있음
※ 소켓 프로그래밍
- 소켓 (socket)
- TCP/IP 네트워크를 이용하여 쉽게 통신 프로그램을 작성하도록 지원하는 기반 기술
- 두 응용프로그램 간의 양방향 통신 링크의 한쪽
- 소켓끼리 데이터를 주고받음
- 소켓은 특정 IP 포트 번호와 결합
- 자바는 소켓 통신할 수 있는 라이브러리 지원
- 소켓 종류
- 서버 소켓
- 클라이언트 소켓
※ 소켓을 이용한 웹 서버와 클라이언트 사이의 통신 사례
※ 소켓을 이용한 서버 클라이언트 통신 프로그램의 전형적인 구조
※ Socket 클래스: 클라이언트 소켓
- Socket 클래스
- 클라이언트 소켓에 사용되는 클래스
- java.net 패키지에 포함
생성자)
※ Socket 클래스의 메소드
※ 클라이언트에서 소켓으로 서버에 접속하는 코드
- 클라이언트 소켓 생성 및 서버에 접속
- Socket clientSocket = new Socket("128.12.1.1", 5550);
- => Socket 객체가 생성되면 곧 바로 128.12.1.1의 주소의 5550포트에 자동 접속
- Socket clientSocket = new Socket("128.12.1.1", 5550);
- 소켓으로부터 데이터를 전송할 입출력 스트림 생성
- BufferedReader in = new BufferedReader( new InputStreamReader(clientSocket.getInputStream()));
- BufferedWriter out = new BufferedWriter( new OutputStreamWriter(clientSocket.getOutputStream()));
- 서버로 데이터 전송
- flush()를 호출하면 스트림 속에 데이터를 남기지 않고 모두 전송
- out.write("hello"+"\n");
- out.flush();
- 서버로부터 데이터 수신
- String line = in.readline(); //서버로부터 한 행의 문자열 수신
- 네트워크 접속 종료
- clientSocket.close();
※ ServerSocket 클래스: 서버 소켓
- 서버 소켓에 사용되는 클래스
- java.net 패키지에 포함
생성자)
함수)
※ 서버에 클라이언트가 연결되는 과정
- 서버는 서버 소켓으로 들어오는 연결 요청을 기다림(listen)
- 클라이언트가 서버에게 연결 요청
- 서버가 연결 요청 수락(accept)
- 새로운 클라이언트 소켓을 만들어 클라이언트와 통신하게 함
- 그리고 다시 다른 클라이언트의 연결을 기다림
※ 서버가 클라이언트와 통신하는 과정
- 서버 소켓 생성
- ServerSocket serverSocket = new ServerSocket(5550);
- => 서버는 접속을 기다리는 포트로 5550 선택
- ServerSocket serverSocket = new ServerSocket(5550);
- 클라이언트로부터 접속 기다림
- Socket socket = serverSocket.accept();
- accept() 메소드는 연결 요청이 오면 새로운 Socket 객체 반환
- 접속 후 새로 만들어진 Socket 객체를 통해 클라이언트와 통신
- Socket socket = serverSocket.accept();
- 네트워크 입출력 스트림 생성
- BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream())); BufferedWriter out = new BufferedWriter( new OutputStreamWriter(socket.getOutputStream()));
- Socket 객체의 getInputStream()과 getOutputStream() 메소드를 이용하여 입출력 데이터 스트림 생성
- BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream())); BufferedWriter out = new BufferedWriter( new OutputStreamWriter(socket.getOutputStream()));
※ 스트림
- 스트림 입출력
- 버퍼를 가지고 순차적으로 이루어지는 입출력
- 자바의 입출력 스트림
- 응용프로그램과 입출력 장치를 연결하는 소프트웨어 모듈
- 입력 스트림 : 입력 장치로부터 자바 프로그램으로 데이터를 전달
- 출력 스트림 : 출력 장치로 데이터 출력
- 응용프로그램과 입출력 장치를 연결하는 소프트웨어 모듈
※ 자바의 입출력 스트림 특징
- 스트림의 양끝에 입출력장치와 자바 응용프로그램 연결
- 스트림은 단방향
- 입력과 출력을 동시에 하는 스트림 없음
- 입출력 스트림 기본 단위
- 바이트 스트림의 경우 : 바이트
- 문자 스트림의 경우 : 문자 (자바에서는 문자1개 : 2바이트)
- 선입선출 구조 (FIFO)
※ 자바의 입출력 스트림 종류
- 바이트 스트림
- 입출력되는 데이터를 단순 바이트로 처리
- 문자 스트림
- 문자만 입출력하는 스트림
- 문자가 아닌 바이너리 데이터는 스트림에서 처리하지 못함
- JDK는 입출력 스트림을 구현한 다양한 클래스 제공
※ JDK의 바이트 스트림 클래스 계층 구조
- 최상위 클래스는 InputStream, OutputStream
- 클래스 이름이 공통적으로 Stream으로 끝남
※ JDK의 문자 스트림 클래스 계층 구조
- 최상위 클래스는 Reader, Writer
- 클래스 이름이 공통적으로 Reader/Writer로 끝남
※ 스트림은 연결될 수 있다
- 표준 입력 스트림 System.in에 InputStreamReader 스트림을 연결한 사례
- InputStreamReader rd = new InputStreamReader(System.in);
- int c = rd.read(); // 키보드에서 문자 읽음
- System.in도 InputStream 클래스의 객체
※ 문자 스트림
- 유니 코드(2바이트) 문자를 입출력 하는 스트림
- 문자로 표현되지 않는 데이터는 다루지 못함
- 이미지, 동영상과 같은 바이너리 데이터는 입출력 할 수 없음
- 문자 스트림을 다루는 클래스
- Reader/Writer
- InputStreamReader/OutputStreamWriter
- FileReader/FileWriter
- 텍스트 파일에서 문자 데이터 입출력