앱이 stream에 bw로 json으로 쓰면 br로 os가 읽어서 hw로 이진데이터로 보냄
유니코드3Byte
TCP(전송 제어 프로토콜)
죽음(포로)
위조
해석x(프로토콜)
CIA
기밀성 무결성 가용성
7,6 앱 / 5,4,3 OS / 2,1 하드웨어
L7 응용 -메일프로그램
L6 표현 -압축, 인코딩, 암호화
ㅡㅡㅡㅡㅡㅡㅡㅡ(데이터를 세그먼트로)
L5 세션
L4 트랜스포트 TCP/UDP 선택
L3 네트워크 IP
ㅡㅡㅡㅡㅡㅡㅡㅡ(패킷으로)
L2 데이터
L1 물리
package ex03test.ex03;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
// 반이중 통신
public class MyServer {
public MyServer() throws IOException {
// 1. 서버 소켓(리스너) 생성
ServerSocket serverSocket = new ServerSocket(10000);
System.out.println("서버소켓생성");
Socket socket = serverSocket.accept(); // 리스너 대기중
System.out.println("클라이언트가 연결되었습니다.");
// 2. 클라이언트의 메세지를 받기
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream())
);
//System.out.println("버퍼리더");
String msg = reader.readLine(); // 버퍼 비우기
System.out.println("받은 메세지: "+msg);
// 3. 쓰기 버퍼를 달아서 ok 라는 메시지 응답하기
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())
);
BufferedReader kbd = new BufferedReader(
new InputStreamReader(System.in)
);
System.out.print("키보드 입력 : ");
writer.write(kbd.readLine()); // 버퍼 8192 바이트
writer.write("\n");
writer.flush();
System.out.println("전송");
}
public static void main(String[] args) {
try {
new MyServer();
} catch (Exception e) {
e.printStackTrace();
}
}
}
package ex03test.ex03;
import java.io.*;
import java.net.Socket;
// 반이중 통신
/**
* 클라이언트는 read 버퍼를 추가로 만들고
* 서버는 write 버퍼를 추가로 만든다
*/
public class MyClient {
public MyClient() throws IOException {
// 1. 서버 연결 (localhost == 127.0.0.1) ==> 192.168.200.178
Socket socket = new Socket("127.0.0.1",10000);
System.out.println("연결");
// 2. 서버쪽으로 메세지 전송
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())
);
BufferedReader kbd = new BufferedReader(
new InputStreamReader(System.in)
);
System.out.print("키보드 입력 : ");
writer.write(kbd.readLine()); // 버퍼 8192 바이트
writer.write("\n");
writer.flush();
System.out.println("전송");
// 3. Read 버퍼로 읽어서 모니터 출력
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream())
);
//System.out.println("버퍼리더");
String msg = reader.readLine(); // 버퍼 비우기
System.out.println("받은 메세지: "+msg);
}
public static void main(String[] args) {
try {
new MyClient();
}catch (Exception e){
e.printStackTrace();
}
}
}
package ex04;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
// HDX - 스레드가 필요 없다.
public class MyServer {
public MyServer() throws IOException {
// 1. 서버 대기중
ServerSocket serverSocket = new ServerSocket(10000);
Socket socket = serverSocket.accept(); // 리스너 대기중
System.out.println("클라이언트가 연결되었습니다");
// 2.서버 요청 받음 (송수신 선)
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream(), "utf-8")
);
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream(), "utf-8")
);
while(true){
String msg = reader.readLine(); // 버퍼 비우기
System.out.println("클라이언트에게서 요청이 왔습니다 : "+msg);
// 3. 구문 분석 (파싱)
String responseBody = "";
if(msg.equals("text/html")){
responseBody = "<html><h1>Hello</h1></html>";
}else if(msg.equals("text/plain")){
responseBody = "Hello";
}else{
responseBody = "404 not found";
}
// 4. 서버 응답
writer.write(responseBody);
writer.write("\n");
writer.flush();
}
}
public static void main(String[] args) {
try {
new MyServer();
} catch (Exception e) {
e.printStackTrace();
}
}
}
package ex04;
import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
/**
* 클라이언트는 read 버퍼를 추가로 만들고
* 서버는 write 버퍼를 추가로 만든다
*/
public class MyClient {
public MyClient() throws IOException {
// 1. 서버 연결
Socket socket = new Socket("127.0.0.1", 10000);
// 2. 버퍼 생성 (송수신 선 만듬)
Scanner keyboard = new Scanner(System.in);
// BufferedWriter request = new BufferedWriter(
// new OutputStreamWriter(socket.getOutputStream(), "utf-8")
// );
PrintWriter request = new PrintWriter(socket.getOutputStream(), true, StandardCharsets.UTF_8);
BufferedReader response = new BufferedReader(
new InputStreamReader(socket.getInputStream(), "utf-8")
);
while(true){
// 3. 키보드로 부터 입력 대기
String requestBody = keyboard.nextLine();
// 4. 서버로 요청
request.println(requestBody);
// request.write(requestBody); // 버퍼 8192 바이트
// request.write("\n");
// request.flush();
// 5. 서버로부터 응답
String responseBody = response.readLine();
System.out.println("서버로부터 받은 메시지 : "+responseBody);
}
}
public static void main(String[] args) {
try {
new MyClient();
}catch (Exception e){
e.printStackTrace();
}
}
}