버퍼스트림
Aug 05, 2024
















버퍼 스트림
버퍼라는 공간을 정해 놓고 한 번 읽을 때 왕창 읽어놓고 → 하나씩 꺼내 쓴다.
ex) 친구 새우깡 먹을 때 하나씩 가져 가는 것이 아니라 손의 한 뭉치씩 가져가면 왔다 갔다하는 시간을 줄일 수 있다.
-프로그램이 입력을 요구하면 버퍼에서 꺼내서 반환
-버퍼가 비었을 때만 입력 장치에서 read
버퍼 생성
inputStream = new BufferedReader(new FileReader(”input.txt”));
outputStream = new BufferedWriter(new FileWriter(”output.txt”));
inputstreamReader : byte stream → 문자 stream으로 변환. 문자로 읽는 거
예 맞는지 확인-V
keyboard 값 ‘a’ enter >> 키보드 선(stream)으로 오면, bit로 바꾸는데 우리는 보통 1byte로 읽음
(즉, 선에서는 2인수의 값으로 읽는다. ) 예를 들어 01000010로 읽음 >>컴퓨터에서
컴퓨터는 App / OS / HW 층 생각.
예를 들어 a 65→ 00101101(8bit)→os에서 비트를 정수로(2인수→ 10진수로) 바꾼다.-v
EX) AB를 치면 (B인 01010001 A인 00101101)가 Stream에서 읽히고 1byte씩 읽힘.(이때는 16bit=2byte 필요)
A를 치면
>HW단계에서는 01010100로 읽고
> OS에서 파싱하여 (Operation System이 읽기 쉽게 하기 위해) 65로 읽고
>app단계에서 inputstreamreader에서 보조스트림(고정 길이크기)에서 A로 읽음.
Output stream writer
App 단계에서 os로 넘어오면서 65로 읽고???


if)버퍼 만들어 사용하는데 다차면, d는? 대기?



외부 컴퓨터와 연결하기 위해 소캣 필요.
문법공부(System.in)보다는 buffer 타겟이 되는 게 중요-v



EX) 쌤 주혁님 쪽지로 소통하는 것
InputStreamReader & OutputStreamWriter
입력 장치에서 한번에
경로(2)
-상대경로 : 내 위치 기반으로 적는 거
-절대경로 : 전부 다 적는 거
package ex15;
//상대 경로 : 내 파일(.class)에 위치를 기반으로 경로 정하는 것
//절대 경로 : 루트에서부터 경로를 찾는 것
//윈도우 : (최상의 경로, \씀)C:\workspace\hello.txt
//맥, 리눅스 : (최상의 경로, / 씀) /workspace/hello.txt
// 위와 같이 경로 다름
public class StreamEx05 {
public static void main(String[] args) {
System.out.println("안녕 난 \"홍길동\"이야");
//\이후를 문법으로 보지마,escape처리
System.out.println("c\\workspace\\hello.txt");
// \무시하지 말라고 \\함
}
}
.jAVA->OUT 파일에서 읽음

in reader out writer같이 있어야 함???
버퍼 : 연어 잡는 그물??
버퍼를 만들려면 Buffer~~~써줘야 생김
flush는 버퍼 생성 후 쓸 수 있음
키보드) a 치면 >> stream에서 01000001로 인코딩?해서 가고, 8bit(1byte)로 끊어 읽음 >>컴퓨터(app/os/hw)생각
컴퓨터os에서 01000001을 파싱하여 65로 읽는다.(이해하기 쉽게)
즉, hw 레벨에서 01000.. 해서 os 65로 읽고 app에서 inputstreamread?로 A로 읽음. 그리고 보조스트림???뭐라고 함.(보조스트림은 고정길이 크기를 가지고 있다.)
절대?


절대경로?
실행이 되는 위치는 툴마다 다른데
자바에서 실행이 되는 프로젝트?? → study???
보통 일반적으로 프로젝트

타겟만 알면 걸면 끝?



윈도우 기반 기본 저장 C 드라이브 저장 더 하는 거 D?(용량 더 커서 여기에 저장을 많이 함.) SDD를 써서 이런 드라이브 저장공간을 더 늘리는 그런 느낌?
단방향/전방향/전이중/반이중
소켓통신



외부컴퓨터가 연결하려면 파일이 소캣이 됨.
카카오,네이트, 다
받는 이 소캣리더? 패킷을 만들어주는 차이?요청하는이?
카카오, 네이트 중 어떤 ㅌ통신을 할지는 port결정 2^16승?
소캣통신의 기본 서버통신이 필요, 서브는 기다리고 있음.소캣ip와 port번호가 있어야 함.
버퍼드 reader,writer ss s s 그림
멀티소캣..
스레드 필요함
한 번 연결하면 스레드 버림. -v
가정집 : 전봇대 라우터~ world w~~ w.w.w.~~
바깥세상 when : wileless원거리 네트워크
lan 공유기 세상: local~~network 공유기가 만들어낸 자기만의 세상
외부에서는 와이파이까지만 접근가능-v
포트포어딩~으로 안함. 다이렉트하게 꼽음.-v
e.printStackTrace(); : 에러볼때
에러는 제일 위에서부터 봄?
10클릭?
client server 연결?? 단방향으로 전송??
buffered writer에 -모니터, 소캣, 키보드?
package ex17.oneway;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
//localhost = 127.0.0.1(루프백)_본인 것?
try {
Socket socket = new Socket("127.0.0.1", 10000);
//버퍼의 타겟이 소캣?? 키보드
//스캐너는 중요x
Scanner sc = new Scanner(System.in);
String msg = sc.nextLine();
BufferedWriter bw = new BufferedWriter(
//글자를 몇 바이트로 교환할 건지 정할 수 있음. 한글3 영어1byte로 됨.
//그래야 가나다라abc 15byte로 받을 수 있음. 1byte씩 읽으면 한글 다깨짐.
//인코딩 utf8이야 끊어 읽어. os에도 알려줌-v 프로세스가 버퍼에 메세지 가나다라,utf 쓰고 os가 세그먼트로 쪼갤때 몇 바이트인지 알아야 의미있게 쪼갤 수 있다. os도 버퍼드라이드한걸 리드함. 3바이트로 끊어..-v
new OutputStreamWriter(socket.getOutputStream(), "UTF-8")
);
bw.write(msg+"\n");
bw.flush();
} catch (IOException e) {
e.printStackTrace(); //에러를 자세하게 볼 수 있음
}//반응 없어 단방향
}
}
package ex17.oneway;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(10000);
// System.out.println(1); //디버깅이 잘 안되면 1번찍어보면 됨.
Socket socket = serverSocket.accept();
// 리스너(while 돌면서 확인하는 거), accept 메서드 큐가 계속 반복,
// 이 코드가 여기에 멈춰있음-디버깅
// 클라이언트가 요청을 하면 생기는 소캣
System.out.println("클라이언트 연결됨");
BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream(),"UTF-8")
);//프로토콜로 서로 알려줘야 함.
String msg = br.readLine();
System.out.println(msg);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
빠져나가다가 빠져나가지 못하면 사설ip 가짜 ip
cmd > fitlog > 자기 주소 와이파이면 가짜 주소 나와용
17장
버퍼예제는 책 보지x 쌤이 한 거만 봐
단방향통신

요청하는 자 : 클라이언트(A)~데이터 전송
서버 : 처리해서 응답해주는, 요청 받는 애(B), 갑 EX>넷플릭스-갑, CLIENT 우리(우리가 어떤 드라마 줄래? 요청함)
인터넷이 된다는 건 전세계 어디에도 연결되어 있어
통신에서는 타겟 : 소켓
중요)
port :
그래서 pc에 들어와서
어떤 프로그램이랑 통신할 지 port로 결정
어떤 프로그램이랑 통신할 지 어떤 port로 할지 결정
ex) 배, 비행기 port가 있음
ip주소는 인간이 알아듣기 어려우니까 www.naver.com 도메인 이름을 사서 port를 적어줘야 하는데 생략 되어 있음 :443
대부분 웹 서버 :80으로 끝남

안녕이라고 밖에서 입력하면 전봇대의 라우터에 가서 집 pc로 간다. > 그리고 port보고 어떤 프로그램인지 보고 들어간다?-v
컴퓨터에 접근하려면
ip,port번호 필요-v

서버와 클라이언트가 통신을 하려면 소켓 필요!
but, c1s) - sc) 이런 식으로 하면 다른 클라이언트(c2s)가 sc 접속 x.
(c1s가 독점하고 있기 때문에)
(여기서 c1s : 고객1소켓, sc :서버소켓, c2s : 고객2소켓으로 하면.)
so, c1s)를 바로 서버 소켓에 연결하지 않고 (서버)연결요청전용소켓에 연결.
이 서버에 들어온 모든 클라이언트는 이곳(연결 요청 전용 소켓)으로 연결 요청함.
-> 연결 승인 되면, 서버는 해당 클라이언트 상대하는 소켓을 만듦
-> 그 소켓으로 클라이언트 data 주고 받음.


ip는 집 주소, port는 방 번호 느낌쓰 집 주소, 방 번호 적은 전화기(소켓_ 이런 느낌쓰?)

동시에 작동-스레드 필요

고객수+1(리스너,엄마,사장같은 느낌)?
스레드 하나로 한다고?? 소캣은 최소 2개 필요하다고?
액셉이 자동 생성? 2개 코드면 그림 완성?


주황색이 뭐야?-V 리스너??

루프백 ID
PC 2개를 사면 유일한 값 2개를 쓰는데 아까우니까
공유기를 사용해서 선을 PC로 연결

공인IP : WIFI가 가짐, 외부의 선이 WIFI에 연결?
외부에서 집 안의 PC접근X. WIFI로 접근하기 때문에
서버로 쓸려면 전봇대 외부 선을 PC에 고대로 꼽아야 함.
루프백 : 각자 자기 자신의 컴퓨터로 돌아감(프로그램 client, server 돌릴 때) 자기 컴퓨터로 처리하는 거면 다른 컴터나 외부로 갈 필요가 없으니 루프백으로 내 컴터를 쓰게 하는 거.

host127.0.0.1 자기 자신을 뜻함.
localhost-v
사설ip :공유기가 ip 받아서 ip를 임의로 만들어줌. ? 가짜ip?~난 중 공부함
반이중
요청 & 응답
스레드 없이
3hand-os에서 알아서 우리들이 하는 거 아님

Share article