JAVA

자바 58강. 반이중 통신

JJJAEOoni 2022. 2. 15. 10:28
반응형

한 명의 클라이언트와 하나의 서버가

1:1로 통신을 할 건데

지속적으로 통신하는 서비스를 만들어보자.

 

원래 클라이언트 소켓에 BufferedWriter,

서버 소켓에 BufferedReader가 하나씩 있었다.

 

지속적인 통신을 하기 위해서는

클라이언트 소켓 입장에서

키보드의 입력을 읽어와야 한다.

 

키보드의 입력을 읽고

서버 소켓으로 전송하는 과정을

while로 돌려

계속되는 통신을 해보자.

 

이때 서버 소켓에서도

통신을 받는 과정을

while로 돌려야

소켓의 통신이 끊기지 않을 것이다.

package site.metacoding.chat;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class MyServerSocket {

    // OS의 socket 라이브러리 기반 System call
    ServerSocket serverSocket; // 연결하는지 지켜보는 리스너(연결 => 세션이 만들어짐 => 인증됨!)
    Socket socket; // 메시지 통신
    BufferedReader reader;

    public MyServerSocket() {
        // 통신은 무조건 예외가 발생할 수 있음!
        try {
            // 1. 서버소켓 생성(리스너)
            // 잘 알려진 포트 : 0 ~ 1023
            serverSocket = new ServerSocket(1077); // 내부적으로 while이 돈다.
            System.out.println("서버 소켓 생성됨");
            System.out.println("aaa를 입력하면 종료됩니다.");

            // 종료되지 않는 프로그램 -> 데몬(main 스레드)
            // 내부적으로 accept가 새로운 소켓을 만들어서 return하여 연결해줌
            // 이때 소켓의 포트번호는 사용하지 않는 포트 랜덤지정(OS에게 맡김)
            socket = serverSocket.accept(); // while을 돌면서 대기, 실제로 while 도는 메서드

            // 새로운 소켓을 알아야 버퍼를 달고 통신, 순서 중요
            reader = new BufferedReader(
                    new InputStreamReader(socket.getInputStream()) // socket 선 = conn
            );

            while (true) {
                // System.out.println("클라이언트 연결됨");
                String inputData = reader.readLine();
                System.out.println("받은 메시지 : " + inputData);

                if (inputData.equals("aaa")) {
                    break;
                }
            }

        } catch (Exception e) {
            System.out.println("통신 오류 발생 : " + e.getMessage());
            // e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new MyServerSocket();
        System.out.println("main 종료");
    }
}

 

package site.metacoding.chat;

import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;

public class MyClientSocket {

    Socket socket;
    BufferedWriter writer;
    Scanner scan;
    String getMsg;

    public MyClientSocket() {
        try {

            // 스캐너 달고(반복x), 키보드로부터 입력 받는 부분(반복o)
            scan = new Scanner(System.in);

            // IP주소, 포트번호
            // 서버소켓과 연결
            socket = new Socket("localhost", 1077);

            writer = new BufferedWriter(
                    new OutputStreamWriter(socket.getOutputStream()));

            while (true) {
                getMsg = scan.nextLine();

                // 마지막 메세지 끝에는 \n이 꼭 필요함
                writer.write("Msg : " + getMsg + " \n"); // 버퍼에 담김
                writer.flush(); // 버퍼가 가득 차지 않았기 때문에 비워줘야 함

                if (getMsg.equals("aaa"))
                    break;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new MyClientSocket();
    }
}

 

 

 

[출처]

 

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

 

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 

반응형