Java를 활용한 단방향 통신

Jan 09, 2024
Java를 활용한 단방향 통신
 
 

1. 단방향 통신(Simplex)

 
일방적인 송, 수신으로 전달되는 방식이다. 송신자는 정보를 전달하고 수신자는 정보를 받기만 한다. TV나 라디오와 같은 방식이 이에 해당되는데, 시청자는 흘러오는 데이터를 보거나 들을 수만 있고, 응답할 순 없는 방식이다.
 
통신의 기본 원리는 아래의 블로그에 정리했다.
 
 
 
notion image
 
단방향 통신의 그림은 다음과 같다. 발신자가 입력한 값이 소켓을 타고 수신자의 소켓을 통해 실행되는 과정이다. 내 컴퓨터 내부에서 정보전달은 파일이었지만 통신에서는 소켓을 이용해야 한다.
지금은 내 pc 내에서 전달할 거지만 단방향 통신 연습을 위해 소켓을 사용한다.
 

2. 서버 소켓(ServerSocket)

우선 Client 와 Server 두개의 클래스를 생성한다.
 
public class Server { public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(5000); Socket socket = serverSocket.accept(); } catch (IOException e) { throw new RuntimeException(e); } } }
 
우선 서버 클래스를 만든다. 서버 클래스에는 serverSocket 과 socket 두개의 소켓을 생성한다.
서버 소켓은 클라이언트 소켓과 연결되는 소켓이다. 연결되면 클라이언트와 연결될 소켓을 생성하고 서버 소켓과는 연결이 종료된다. 서버 클라이언트는 여러 클라이언트의 요청을 받아 소켓과 연결시켜, 다수의 클라이언트와 통신을 가능하게 한다.
 
notion image
 
 

3. Server 클래스

 
ServerSocket serverSocket = new ServerSocket(5000); System.out.println("클라이언트 연결 중"); Socket socket = serverSocket.accept(); System.out.println("클라이언트 연결됨");
 
new ServerSocket(5000) 의 5000은 포트 값이다. 포트에 대한 설명은 용어 정리 블로그를 참고하면 된다.
serverSocket.accept() 은 소켓의 연결을 스캔하는 코드로 연결이 완료되면 클라이언트 소켓과 소켓이 연결된다.
System.out.println 값은 클라이언트가 연결됐는지 디버깅을 위해 넣은 코드이다.
 
notion image
 
코드를 실행하면 클라이언트 연결 중 이라는 출력 값과 함께 프로그램이 종료되지 않고 계속 실행되고 있다.
이제 버퍼를 활용해 클라이언트에게 입력받을 코드를 작성한다.
 
public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(5000); System.out.println("클라이언트 연결 중"); Socket socket = serverSocket.accept(); System.out.println("클라이언트 연결됨"); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); while (true) { String msg = br.readLine(); if (msg == null) break; System.out.println(msg); } } catch (IOException e) { throw new RuntimeException(e); } }
 
readLine 코드를 반복문으로 작성하지 않으면 \n 이후의 값을 스캔할 수가 없다. 따라서 반복문으로 \n 으로 끝나는 코드를 읽어주어야 한다.
 

4. Client 클래스

 
public static void main(String[] args) { try { Socket socket = new Socket("127.0.0.1", 5000); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8")); bw.write("hello" + "\n"); bw.write("hi\n"); bw.flush(); } catch (IOException e) { throw new RuntimeException(e); } }
 
IP 주소 127.0.0.1 은 내 PC 의 주소를 가리킨다. 이 IP 주소는 루프백 혹은 로컬 호스트 라고도 부른다.
UTF-8 은 스캐너를 사용해서 값을 입력받을 때 한글로 입력받으면 값이 깨지기 때문에 넣는 코드이다. 지금은 큰 의미는 없다.
 

5. 실행

 
실행해보자.
 
notion image
 
우선 실행할 때는 오른쪽 상단 Current File 로 변경 후 실행한다.
서버를 먼저 실행 후 클라이언트를 실행하면 된다.
 
 
notion image
 
먼저 서버를 실행되면 클라이언트 연결 중이 출력된다.
 
notion image
 
클라이언트를 실행하면 연결이 되고 클라이언트가 전송한 값을 출력한다.
 
bw.write("안녕" + "\n"); bw.write("반가워");
 
만약 입력한 데이터에 \n 이 포함되어 있지 않다면 \n 가 포함된 마지막 값까지만 읽고 이후 데이터는 소멸된다.
 
notion image
 
 
bw.write("안녕" + "\n"); bw.write("반가워\n");
 
만약 flush 가 없다면 값은 전송되지 않는다.
 
notion image
Share article

{CODE-RYU};