학습목표(1)
❖ 입력과 출력의 개념을 이해하고 바이트 기반의 다양한 입출력을 활용할 수 있다
• 입력과 출력, 스트림의 이해
• InputStream과 OutputStream의 이해
• FileInputStream과 FileOutputStream의 이해
• BufferedInputStream과 BufferdOutputStream의 이해
❖ 문자 기반의 다양한 입출력을 활용할 수 있다.
• 바이트 기반의 입출력과 차이점을 이해
• Reader와 Writer의 이해
• FileReader와 FileWriter의 이해
• 파일을 읽어 새로운 파일을 생성하는 방법의 이해
• 버퍼링을 사용하여 효율적인 파일 처리
▪
• IP 주소의 이해 및 정보 처리▪
• 웹 페이지를 접근하여 내용 출력 방법의 이해❖ 자료 통신을 위한 소켓 프로그래밍을 이해하고 프로그래밍에 활용할 수 있다.
▪
• TCP와 UDP의 차이를 이해▪
• 통신을 위한 TCP 소켓 프로그래밍의 이해▪
• 통신을 위한 UDP 소켓 프로그래밍의 이해1. 입력과 출력
❖ 자료의 이동
▪
입출력•
컴퓨터와 장치 그리고 프로그램 사이에서 자료를 주고받는 일을 총칭❖ 스트림
▪
입출력에 필요한 정보 흐름의 통로 역할▪
정보의 입력을 위해서는 입력 장소와 입력 스트림이 필요▪
마찬가지로 출력을 위해서는 출력 장소와 출력 스트림이 필요바이트 단위와 문자 단위의 스트림
❖ 바이트 중심
▪
추상 클래스인 InputStream과OutputStream을 최상위 클래스
•
이름이 ~InputStream과~OutputStream
❖ 문자 중심
▪
추상 클래스인 Reader와 Writer를 최상위 클래스•
이름이 ~Reader와~Writer
❖ 보조 스트림
Section 1 입력과 출력
❖ 바이트 중심의 입출력을 담당하는 클래스
▪
InputStream▪
OutputStream입출력 클래스 계층구조
❖ 클래스인 InputStream과 OutputStream의 하위 클래스
Section 1 입력과 출력
❖ 바이트 배열 형태의 입출력 위한 클래스
▪
ByteArrayInputStream 메소드▪
ByteArrayOutputStream 메소드실습예제 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();
클래스 FileInputStream
❖ 파일로부터 내용을 바이트 기반으로 입력하기 위한 스트림
▪
생성자•
인자 유형이 각각 String, File, FileDescriptor•
인자의 유형이 String과 File인 경우– 지정된 인자의 파일이 존재하지 않는 경우에는 FileNotFoundException을 발생 – 처리를 위한 try~catch 문을 이용
Section 1 입력과 출력
❖ 소스 파일 출력
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();
}
클래스 FileOutputStream
❖
파일로 출력하기 위한 스트림을 제공▪
생성자로는 네 가지가 제공•
인자 유형이 각각 String, File, FileDescriptor•
마지막 생성자는 두 개의 인자가 필요•
인자의 유형이 String과 File인 경우– 지정된 인자의 파일을 출력하기 위한 스트림의 생성에 문제가 발생하면 IOException을 발생 – 예외처리를 위한 try~catch 문을 이용
▪
주요 메소드Section 1 입력과 출력
❖ 파일 내용을 읽어 다른 파일에 출력
기본 스트림을 활용하는 필터스트림
❖ 클래스 BufferedInputStream과 BufferedOutputStream
▪
추상 클래스 FilterInputStream과 FilterOutputStream의 하위 클래스▪
버퍼링을 사용하여 입출력의 성능을 향상시키는 스트림❖ 버퍼링
▪
자료 처리 속도가 다른 두 장치 간에 일정 크기의 임시 저장 장치를 이용하여 정보 처리를 보다 빠르게 하는 방법▪
파일에 BufferedOutputStream을 이용하여 바이트 배열의 출력을 수행하는 소스▪
파일에서 바이트 배열에 입력을 수행하는 소스Section 1 입력과 출력
❖ 버퍼링을
사용하여
파일에 출력
및 입력
2. 문자 중심의 입출력과
파일 정보
❖
클래스 Reader와 Writer▪
문자 중심의 입출력을 담당하는 추상 클래스▪
클래스 Reader의 주요 메소드▪
클래스 Writer의 주요 메소드입출력 클래스 계층구조
❖ 추상 클래스인 Reader와 Writer의 하위 클래스
▪
문자 중심의 입출력을 담당하는 클래스의 계층구조Section 2 문자중심의 입출력과 파일정보
❖
소스 파일‘MyFileReaderWriter.java’를 읽어 콘솔에 표준 출력하고 소스 파일
‘MyFileReaderWriter.back’에 출력
실습예제 11-6
❖
바이트 기반으로 파일을 열 어 문자 기반의 파일 스트 림으로 연결하여 다시 문자 기반의 버퍼링을 이용하여 콘솔에 출력Section 2 문자중심의 입출력과 파일정보
▪
파일과 폴더에 대한 여러 연산을 수행하기 위한 클래스▪
생성자▪
주요 메소드실습예제 11-8
❖
File의 메소드createNewFile()에 의해 내용이 전혀 없는 새로운 파일을 만들어 FileWriter 로 원하는 문자열을 파일에 저장
Section 2 문자중심의 입출력과 파일정보
네트워크와 IP 정보
❖
클래스 InetAddress▪ IP 주소를 처리하기 위한 클래스
•
컴퓨터마다 고유한 주소인 IP 주소▪
정적 메소드 getByName()을 사용•
도메인 이름으로 InetAddress를 반환•
UnknownHostException 예외를 발생할 수 있으므로– try 문을 사용
•
반환된 InetAddress를 출력하면 ‘도메인이름/ip주소’가 출력▪
주요 메소드Section 3 네트워크와 인터넷 p508
❖
네크워크 ip 주소에 대한 정보 출력웹 페이지 정보 처리
❖ 클래스 URL과 URLConnection
▪
클래스 java.net.URL•
웹의 리소스인 URL(Uniform Resource Locator)을 표현하는 클래스▪
클래스 java.net.URLConnection•
응용프로그램과 URL 간의 통신연결을 나타내는 클래스의 최상위 추상 클래스❖ 웹 페이지 표준 출력
▪
URL 객체의 openStream()으로 입력 스트림을 열어 처리Section 3 네트워크와 인터넷
❖
웹 페이지를 접속하여 문서 를 표준출력으로 출력4. 소켓 프로그래밍
소켓
❖ 자료 전송
▪
소켓(socket)•
호스트(host) 간의 자료 전송을 위한 호스트의 끝단(endpoint) 필요▪
스트림(stream)•
통신의 끝단인 소켓에 연결된 전송 통로❖ TCP 와 UDP
▪ TCP
Section 4 소켓 프로그래밍 p512
❖ 차이
❖
서버와 클라이언트가 서로 자료를 교환하기 위한 통신▪
서버 소켓 (ServerSocket)•
클라이언트의 연결 요청을 기다리다가 요청이 들어오면 통신을 위하여 소켓을 생성▪
서버와 클라이언트의 각자의 소켓(Socket)•
서버와 클라이언트의 실제 통신을 담당▪
서버와 클라이언트가 통신하기 위한 절차• ➊
[서버]: 포트번호를 이용해서 ServerSocket을 열어 클라이언트의 요청을 기다림• ➋
[클라이언트]: 서버의 주소와 포트번호를 이용해서 Socket을 열어 서버와 연결• ➌
[서버]: 클라이언트의 요청을 받아 들여 서버의 Socket을 생성• ➍
[서버와 클라이언트]: 서버와 클라이언트에서 연결된 Socket에서 자료를 교환할 수 있도록 입력스트림 과 출력스트림을 생성하여 서로 통신클래스 ServerSocket, Socket
❖
클래스 java.net.ServerSocket▪
서버 소켓을 구현•
메소드 accept()는 클라이언트의 요청에 통신을 위한 Socket을 반환❖
클래스 java.net.Socket▪
소켓을 구현, 두 시스템의 통신을 위한 지점•
메소드 getInputStream()과 getOutputStream()– 입력과 출력 스트림을 생성
Section 4 소켓 프로그래밍
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
실습예제 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 {
❖ 1:1 로 채팅을 수행
▪
서버나 클라이언트 모두▪
어느 때나 메시지를 입력한 후 [Enter] 키를 누르면•
상대에게 전송되며 전송된 메시지는 표준출력에 출력•
Receiver: 수신자•
Sender: 송신자메시지 송수신을 위한 스레드 처리
❖ MsgSender 와 MsgReceiver
▪
메시지의 송수신을 처리 하는 클래스▪
Thread를 상속받아 run() 메소드를 구현Section 4 소켓 프로그래밍
수신을 위한 클래스 MsgReceiver
Section 4 소켓 프로그래밍
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();
} }
채팅 클라이언트인 클래스 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() {
❖ UDP: User Datagram Protocol
▪ UDP는 TCP와는 다르게 비연결성connectionless이며,
▪
속도는 빠르지만 TCP보다 신뢰성이 떨어지는 통신 프로토콜❖
UDP의 특징▪
① 송수신할 정보는 DatagramPacket에 저장하며, 이 패킷을 보낼 때마다 수신 측의 주소와 포트번호를 함께 전송해야 한다.▪
② DatagramSocket의 메소드 send()와 receive()로 송수신할 DatagramPacket을 전달하고 받는다.▪
③ UDP는 데이터를 전송할 때만 연결되는 비연결성인 특징클래스 DatagramSocket과 DatagramPacket
❖ UDP 로 데이터그램패킷(DatagramPacket)인 정보를 송수신
▪
객체 DatagramSocket을 생성•
서비스할 포트번호를 지정하거나 또는 기본 생성자로 생성❖ DatagramSocket 에 자료를 전송하려면
▪
먼저 DatagramPacket을 생성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 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,
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() {