• 검색 결과가 없습니다.

입출력과 네트워크

N/A
N/A
Protected

Academic year: 2022

Share "입출력과 네트워크"

Copied!
55
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)
(2)

학습목표(1)

❖ 입력과 출력의 개념을 이해하고 바이트 기반의 다양한 입출력을 활용할 수 있다

• 입력과 출력, 스트림의 이해

• InputStream과 OutputStream의 이해

• FileInputStream과 FileOutputStream의 이해

• BufferedInputStream과 BufferdOutputStream의 이해

❖ 문자 기반의 다양한 입출력을 활용할 수 있다.

• 바이트 기반의 입출력과 차이점을 이해

• Reader와 Writer의 이해

• FileReader와 FileWriter의 이해

• 파일을 읽어 새로운 파일을 생성하는 방법의 이해

• 버퍼링을 사용하여 효율적인 파일 처리

(3)

• IP 주소의 이해 및 정보 처리

• 웹 페이지를 접근하여 내용 출력 방법의 이해

❖ 자료 통신을 위한 소켓 프로그래밍을 이해하고 프로그래밍에 활용할 수 있다.

• TCP와 UDP의 차이를 이해

• 통신을 위한 TCP 소켓 프로그래밍의 이해

• 통신을 위한 UDP 소켓 프로그래밍의 이해

(4)

1. 입력과 출력

(5)

❖ 자료의 이동

입출력

컴퓨터와 장치 그리고 프로그램 사이에서 자료를 주고받는 일을 총칭

❖ 스트림

입출력에 필요한 정보 흐름의 통로 역할

정보의 입력을 위해서는 입력 장소와 입력 스트림이 필요

마찬가지로 출력을 위해서는 출력 장소와 출력 스트림이 필요

(6)

바이트 단위와 문자 단위의 스트림

❖ 바이트 중심

추상 클래스인 InputStream과

OutputStream을 최상위 클래스

이름이 ~InputStream과

~OutputStream

❖ 문자 중심

추상 클래스인 Reader와 Writer를 최상위 클래스

이름이 ~Reader와

~Writer

❖ 보조 스트림

Section 1 입력과 출력

(7)

❖ 바이트 중심의 입출력을 담당하는 클래스

InputStream

OutputStream

(8)

입출력 클래스 계층구조

❖ 클래스인 InputStream과 OutputStream의 하위 클래스

Section 1 입력과 출력

(9)

❖ 바이트 배열 형태의 입출력 위한 클래스

ByteArrayInputStream 메소드

ByteArrayOutputStream 메소드

(10)

실습예제 11-1

❖ 바이트 배열 형태의 입출력 예제

Section 1 입력과 출력

package basicio;

 

import java.io.*;

import java.util.Arrays;

 

public class ByteArrayIO {

public static void main(String args[]) throws IOException {

int c;

byte b [] = {'a', 'b', 'c', 'd'};

//배열 b를 읽는 ByteArrayInputStream 객체를 생성 ByteArrayInputStream bInput = new

ByteArrayInputStream(b);

//배열 b를 소문자를 대문자로 출력하는 ByteArrayOutputStream 객체를 생성

ByteArrayOutputStream bOutput = new ByteArrayOutputStream();

(11)
(12)

클래스 FileInputStream

❖ 파일로부터 내용을 바이트 기반으로 입력하기 위한 스트림

생성자

인자 유형이 각각 String, File, FileDescriptor

인자의 유형이 String과 File인 경우

– 지정된 인자의 파일이 존재하지 않는 경우에는 FileNotFoundException을 발생 – 처리를 위한 try~catch 문을 이용

Section 1 입력과 출력

(13)

❖ 소스 파일 출력

package basicio;

 

import java.io.*;

 

public class ReadFiles {

public static void main(String[] args) { int data;

//읽을 파일 이름 지정

String fname = "src/basicio/ReadFiles.java";

try {

//읽을 파일 이름으로 FileInputStream 생성

FileInputStream fis = new FileInputStream(fname);

//한 바이트씩 읽어 문자로 변환하여 출력

while ((data = fis.read()) != -1) { char c = (char) data;

System.out.print(c);

}

} catch (FileNotFoundException e) {

System.err.println("다음 파일이 없습니다. : " + fname);

} catch (IOException e) { System.err.println(e);

}

System.out.println();

}

(14)

클래스 FileOutputStream

파일로 출력하기 위한 스트림을 제공

생성자로는 네 가지가 제공

인자 유형이 각각 String, File, FileDescriptor

마지막 생성자는 두 개의 인자가 필요

인자의 유형이 String과 File인 경우

지정된 인자의 파일을 출력하기 위한 스트림의 생성에 문제가 발생하면 IOException을 발생 예외처리를 위한 try~catch 문을 이용

주요 메소드

Section 1 입력과 출력

(15)

❖ 파일 내용을 읽어 다른 파일에 출력

(16)

기본 스트림을 활용하는 필터스트림

❖ 클래스 BufferedInputStream과 BufferedOutputStream

추상 클래스 FilterInputStream과 FilterOutputStream의 하위 클래스

버퍼링을 사용하여 입출력의 성능을 향상시키는 스트림

❖ 버퍼링

자료 처리 속도가 다른 두 장치 간에 일정 크기의 임시 저장 장치를 이용하여 정보 처리를 보다 빠르게 하는 방법

파일에 BufferedOutputStream을 이용하여 바이트 배열의 출력을 수행하는 소스

파일에서 바이트 배열에 입력을 수행하는 소스

Section 1 입력과 출력

(17)

❖ 버퍼링을


사용하여


파일에 출력


및 입력

(18)

2. 문자 중심의 입출력과


파일 정보

(19)

클래스 Reader와 Writer

문자 중심의 입출력을 담당하는 추상 클래스

클래스 Reader의 주요 메소드

클래스 Writer의 주요 메소드

(20)

입출력 클래스 계층구조

❖ 추상 클래스인 Reader와 Writer의 하위 클래스

문자 중심의 입출력을 담당하는 클래스의 계층구조

Section 2 문자중심의 입출력과 파일정보

(21)

소스 파일


‘MyFileReaderWriter.java’를
 읽어 콘솔에 표준 출력하고
 소스 파일


‘MyFileReaderWriter.back’에
 출력

(22)

실습예제 11-6

바이트 기반으로 파일을 열 어 문자 기반의 파일 스트 림으로 연결하여 다시 문자 기반의 버퍼링을 이용하여 콘솔에 출력

Section 2 문자중심의 입출력과 파일정보

(23)

파일과 폴더에 대한 여러 연산을 수행하기 위한 클래스

생성자

주요 메소드

(24)

실습예제 11-8

File의 메소드

createNewFile()에 의해 내용이 전혀 없는 새로운 파일을 만들어 FileWriter 로 원하는 문자열을 파일에 저장

Section 2 문자중심의 입출력과 파일정보

(25)
(26)

네트워크와 IP 정보

클래스 InetAddress

IP 주소를 처리하기 위한 클래스

컴퓨터마다 고유한 주소인 IP 주소

정적 메소드 getByName()을 사용

도메인 이름으로 InetAddress를 반환

UnknownHostException 예외를 발생할 수 있으므로

– try 문을 사용

반환된 InetAddress를 출력하면 ‘도메인이름/ip주소’가 출력

주요 메소드

Section 3 네트워크와 인터넷 p508

(27)

네크워크 ip 주소에 대한 정보 출력

(28)
(29)
(30)

웹 페이지 정보 처리

❖ 클래스 URL과 URLConnection

클래스 java.net.URL

웹의 리소스인 URL(Uniform Resource Locator)을 표현하는 클래스

클래스 java.net.URLConnection

응용프로그램과 URL 간의 통신연결을 나타내는 클래스의 최상위 추상 클래스

❖ 웹 페이지 표준 출력

URL 객체의 openStream()으로 입력 스트림을 열어 처리

Section 3 네트워크와 인터넷

(31)

웹 페이지를 접속하여 문서 를 표준출력으로 출력

(32)

4. 소켓 프로그래밍

(33)
(34)

소켓

❖ 자료 전송

소켓(socket)

호스트(host) 간의 자료 전송을 위한 호스트의 끝단(endpoint) 필요

스트림(stream)

통신의 끝단인 소켓에 연결된 전송 통로

❖ TCP 와 UDP

TCP

Section 4 소켓 프로그래밍 p512

(35)

❖ 차이

(36)
(37)

서버와 클라이언트가 서로 자료를 교환하기 위한 통신

서버 소켓 (ServerSocket)

클라이언트의 연결 요청을 기다리다가 요청이 들어오면 통신을 위하여 소켓을 생성

서버와 클라이언트의 각자의 소켓(Socket)

서버와 클라이언트의 실제 통신을 담당

서버와 클라이언트가 통신하기 위한 절차

[서버]: 포트번호를 이용해서 ServerSocket을 열어 클라이언트의 요청을 기다림

[클라이언트]: 서버의 주소와 포트번호를 이용해서 Socket을 열어 서버와 연결

[서버]: 클라이언트의 요청을 받아 들여 서버의 Socket을 생성

[서버와 클라이언트]: 서버와 클라이언트에서 연결된 Socket에서 자료를 교환할 수 있도록 입력스트림 과 출력스트림을 생성하여 서로 통신

(38)

클래스 ServerSocket, Socket

클래스 java.net.ServerSocket

서버 소켓을 구현

메소드 accept()는 클라이언트의 요청에 통신을 위한 Socket을 반환

클래스 java.net.Socket

소켓을 구현, 두 시스템의 통신을 위한 지점

메소드 getInputStream()과 getOutputStream()

– 입력과 출력 스트림을 생성

Section 4 소켓 프로그래밍

(39)

import java.io.*;

import java.net.*;

 

public class MyServerSocket { int port = 7070;

ServerSocket server;

Socket socket;

BufferedReader in;

PrintWriter out;

public MyServerSocket (int port) { this.port = port;

System.out.println(">> 서버를 시작합니다.");

try {

server = new ServerSocket(7070);

} catch (IOException e) {

System.out.println(e.toString());

} }

public void waitForClient() {

System.out.println(">> 클라이언트가 접속하길 기다리고 있습니다.");

try {

// 클라이언트 접속때까지 대기 socket = server.accept();

printInfo();

//클라이언트 소켓에 스트림을 연결 in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));

} catch (IOException e) {

System.out.println(e.toString());

} }

public void receive() { try {

>> 서버를 시작합니다.

>> 클라이언트가 접속하길 기다리고 있습니다.

>> 클라이언트가 접속에 성공했습니다.

서버 포트번호: 7070

(40)

실습예제 11-14: 표준입력을 서버에 전송하는 클라이언트 소켓 프로그래밍

Section 4 소켓 프로그래밍

package socket;

 

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.Socket;

import java.util.Scanner;

 

public class MyClientSocket { Socket socket;

BufferedReader in;

PrintWriter out;

public MyClientSocket (String ip, int port) { try {

socket = new Socket(ip, port);

//서버 소켓에 스트림을 연결

in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));

printInfo();

} catch (IOException e) {

System.out.println(e.toString());

} }  

public void receive() { try {

(41)

❖ 1:1 로 채팅을 수행

서버나 클라이언트 모두

어느 때나 메시지를 입력한 후 [Enter] 키를 누르면

상대에게 전송되며 전송된 메시지는 표준출력에 출력

Receiver: 수신자

Sender: 송신자

(42)

메시지 송수신을 위한 스레드 처리

❖ MsgSender 와 MsgReceiver

메시지의 송수신을 처리 하는 클래스

Thread를 상속받아 run() 메소드를 구현

Section 4 소켓 프로그래밍

(43)
(44)

수신을 위한 클래스 MsgReceiver

Section 4 소켓 프로그래밍

(45)

package chat;

  import java.io.*;

import java.net.*;

  public class ChatServer { int port = 7070;

ServerSocket server;

Socket socket;

public ChatServer (int port) { this.port = port;

System.out.println(">> 서버를 시작합니다.");

try {

server = new ServerSocket(port);

} catch (IOException e) { e.printStackTrace();

} }

public void communicate() {

System.out.println(">> 클라이언트가 접속하길 기다리고 있습니 다.");

try {

// 클라이언트 접속 때까지 대기 socket = server.accept();

printInfo();

//서버 소켓에 입력과 출력을 위한 sender와 receiver를 연결 MsgSender sender = new MsgSender("서버", socket);

MsgReceiver receiver = new MsgReceiver("서버", socket);

//sender와 receiver의 스레드를 실행 receiver.start();

sender.start();

} catch (IOException e) { e.printStackTrace();

} }

(46)

채팅 클라이언트인 클래스 ChatClient

Section 4 소켓 프로그래밍

package chat;

 

import java.io.BufferedReader;

import java.io.IOException;

import java.io.PrintWriter;

import java.net.Socket;

 

public class ChatClient { Socket socket;

BufferedReader in;

PrintWriter out;

public ChatClient(String ip, int port) { try {

socket = new Socket(ip, port);

printInfo();

} catch (IOException e) { e.printStackTrace();

} }  

public void communicate() {

//클라이언트 소켓에 입력과 출력을 위한 sender와 receiver를 연결 MsgSender sender = new MsgSender("클라이언트", socket);

MsgReceiver receiver = new MsgReceiver("클라이언트", socket);

//sender와 receiver의 스레드를 실행 sender.start();

receiver.start();

}

public void close() {

(47)
(48)
(49)

UDP: User Datagram Protocol

UDP는 TCP와는 다르게 비연결성connectionless이며,

속도는 빠르지만 TCP보다 신뢰성이 떨어지는 통신 프로토콜

UDP의 특징

① 송수신할 정보는 DatagramPacket에 저장하며, 이 패킷을 보낼 때마다 수신 측의 주소와 포트번호를 함께 전송해야 한다.

② DatagramSocket의 메소드 send()와 receive()로 송수신할 DatagramPacket을 전달하고 받는다.

③ UDP는 데이터를 전송할 때만 연결되는 비연결성인 특징

(50)

클래스 DatagramSocket과 DatagramPacket

❖ UDP 로 데이터그램패킷(DatagramPacket)인 정보를 송수신

객체 DatagramSocket을 생성

서비스할 포트번호를 지정하거나 또는 기본 생성자로 생성

❖ DatagramSocket 에 자료를 전송하려면

먼저 DatagramPacket을 생성

Section 4 소켓 프로그래밍

(51)

package udp;

 

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.io.BufferedReader;

import java.io.InputStreamReader;

 

public class BasicUDPServer { DatagramSocket dsock;

DatagramPacket sPack, rPack;

InetAddress client;

int sport = 7777, cport;

public BasicUDPServer(int sport) { try {

// DatagramPacket을 sport로 지정하여 생성 this.sport = sport;

System.out.println(">> 서버를 시작합니다.");

System.out.println(">> 클라이언트가 접속하길 기다리고 있습니 다." + "\n");

this.dsock = new DatagramSocket(sport);

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

} }

public void communicate() { try {

//키보드로부터 전송할 문자열을 입력받기 위해 BufferedReader 형태로 변환

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

while (true) {

byte[] buffer = new byte[1024];

//클라이언트에서 전송되는 DatagramPacket을 받기 위해 rPack 생성한 후 대기

rPack = new DatagramPacket(buffer,

(52)

UDP 통신을 위한 클라이언트 구현

Section 4 소켓 프로그래밍

package udp;

 

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.io.BufferedReader;

import java.io.InputStreamReader;

 

public class BasicUDPClient { DatagramSocket dsock;

DatagramPacket sPack, rPack;

InetAddress server;

int port = 8888;

public BasicUDPClient(String ip, int port) { try {

// DatagramPacket에 들어갈 ip 주소가 InetAddress 형태여 야 함 server = InetAddress.getByName(ip);

this.port = port;

this.dsock = new DatagramSocket();

System.out.println(">> 서버에 접속합니다.");

System.out.println(">> 서버에 전달할 메시지를 쓰고 Enter를 누르세요.");

System.out.println(">> 종료하려면 quit를 쓰고 Enter를 누르세요." + "\n");

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

} }

public void communicate() {

(53)
(54)
(55)

참조

관련 문서

어머니는 영어를 가르치는 교사입니다... 여행

• 애플리케이션의 여러 자원들과 메인 프레임 클래스, View 클래스, Document 클래스 등을 하나의 묶 음으로 가지는

 같은 문자에 대응하는 BigChar 클래스의 인스턴스가 이미 존재하 는 경우에는, 이것을 이용하고 새로운 인스턴스는 만들지 않는다..  지금까지 만들어진

 다만, 관찰대상이 NumberGenerator의 하위 클래스의 인스턴스 이고 getNumber 메소드를 가지고 있다는 것만 알고 있다.. – Observer는 입력인자로

이 학생들의 숙제1, 숙제2, 숙제3의 성적을 가상으로 만들어서 exam.txt 파일에 아래와

vector 클래스의 사용 list 클래스의 사용 이터레이터의 이해 이터레이터의 사용 이터레이터의 종류 알고리즘의 이해 알고리즘의

 클래스는 필드와 메소드로

상속에 의한 클래스 인스턴스의