6/28

ONLYS2545·2023년 6월 28일
0


클라이언트 서버 실습 EX03


Client

package ex03_1;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

/**
 * 클라이언트는 read 버퍼를 만들고
 * 서버는 write 버퍼를 추가로 만든다.
 * Read버퍼로 읽어서 모니터 출력
 */

public class MyClient {


    public MyClient() throws IOException {
        //1. 서버 연결
        //127.0.0.1 은 루프백주소(OS단에서 백) == local host ==192.168.200.155(사설 IP, 공유기 단에서 백, 비효율적)

        Socket socket = new Socket("127.0.0.1", 10000);

        //2. 서버쪽으로 메시지 전송
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

        //3. 키보드 버퍼연결 - 키보드 메시지 받아서!
        Scanner sc = new Scanner(System.in);

        while(true) {
            String chatting = sc.nextLine();

            if(chatting.equalsIgnoreCase("quit")){
                System.out.println("서버와의 연결을 종료합니다.");
                break;

            }
            writer.write(chatting); //버퍼는 8192바이트
            writer.write("\n");//
            writer.flush();

            BufferedReader cReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String smsg = cReader.readLine();

            System.out.println("서버의 메시지 : " + smsg);
        }

        writer.close();
        socket.close();

    }

    public static void main(String[] args) {

        try {
            new MyClient();

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

    }
}

Server

package ex03;

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")
        );
        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. 서버 응답
        BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(socket.getOutputStream(), "utf-8")
        );
        writer.write(responseBody);
        writer.write("\n");
        writer.flush();
    }

    public static void main(String[] args) {
        try {
            new MyServer();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

클라이언트 서버 실습 EX04


client

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);

        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);

            // 5. 서버로부터 응답
            String responseBody = response.readLine();
            System.out.println("서버로부터 받은 메시지 : "+responseBody);
        }

    }

    public static void main(String[] args) {
        try {
            new MyClient();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

Server

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

쓰레드


쓰레드 내부의 변수는 쓰레드 간 공유되지 않지만, Main 쓰레드에서 선언된 변수는
쓰레드 간 공유가 가능하다. 변수의 접근범위(Scope)상 접근이 가능하다고 한다.

이렇게 이해 하면 편하다.
-->자기보다 상위 구조에는 접근이 가능
-->일반적으로 메인 쓰레드에서 선언된 변수는 전역변수로 간주된다고 한다.

profile
백엔드 교육과정 기록 velog입니다.

0개의 댓글