통신

김지원·2023년 6월 27일
0

앱이 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();
        }
    }
}


while로 반복 PrintWriter: \n랑 flush 자동으로 해줌
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();
        }
    }
}
profile
https://github.com/k7850

0개의 댓글