Java/네트워크 통신

[Java] 94. 1:1 단방향 통신 (Client)

Song hyun 2024. 5. 22. 14:38
728x90
반응형

[Java] 94. 1:1 단방향 통신 (Client)

1. PrintWriter 란?

2. 로컬 호스트와 루프백

3. 시스템 콜

4. 시나리오 코드 (클라이언트 측)


1. PrintWrite란?

(1) PrinWriter: PrinWriter는 자바 클래스의 한 종류로, 바이트를 문자 형태를 가지는 객체로 바꿔준다. (=text output)

(2) 특징

-편리한 메서드: print(), println(), printf() 등 여러 메서드를 제공하여, 다양한 형식의 데이터를 손쉽게 출력할 수 있다.

-자동 플러시(Auto-flush): PrintWriter를 생성할 때, autoFlush를 true로 선언하면, println()등의 메서드 호출 시에 자동으로 버퍼가 flush() 처리된다. 즉, 데이터를 즉시 전송하게 된다. => 이는 네트워크 소켓과 같이 실시간 데이터 전송이 중요할 때 유용하다!

-버퍼링: 출력 데이터를 버퍼에 저장한 뒤, 한번에 출력해 성능을 향상시킬 수 있다. 필요시에 flush() 메서드를 호출하여, 강제로 데이터를 출력할 수도 있다.


(3) 주요 메서드

-print() / println() / flush() / close()

 

(4) 주의 사항

*예외 처리(Handling Exception): PrintWriter는 메서드 호출 시 발생하는 I/O Exception을 던지지 않고, 내부적으로 처리한다. 때문에 스트림 상태를 주기적으로 확인하거나 / 명시적으로 checkError() 메서드를 호출해 오류를 확인해야 한다!!

 


2. 로컬 호스트(Localhost)와 루프백(Loopback)

(1) 로컬 호스트(LocalHost)

-개념: 로컬 호스트는 현재 사용 중인 컴퓨터 자체를 나타내는 맗이다. 네트워크 프로그래밍에서 로컬 호스트는 localhost / 127.0.0.1로 표현된다.

-용도: 네트워크 애플리케이션을 개발하거나, 테스트 할 때, 외부 네트워크에 의존하지 않고 자신의 컴퓨터에서 서버-클라이언트를 실행해 통신 실행이 가능하다.

 

(2) 루프백(Looback)

-개념: 루프백은 네트워크 장치가 자신에게 데이터를 보내는 가상의 네트워크 인터페이스이다. 127.0.0.1 주소를 통해 루프백 인터페이스로 데이터를 보내면, 데이터는 외부 네트워크로 나가지 않고, 즉시 자신에게 돌아온다.

-용도: 네트워크 소프트웨어를 개발하거나, 디버깅할 때, 외부 네트워크 환경 없이-로컬(현재 사용 중인 컴퓨터) 내에서 모든 테스트를 수행할 수 있다는 장점이 있다.


3. 시스템 콜(System call)이란?

 

*우리가 localhost/127.0.0.1(루프백 인터페이스)를 사용해 소켓 통신을 시도할 때...

 

(1) 사용자 프로그램은 System call(시스템 호출)을 통해 운영체제를 호출한다.

(2) 네트워크 스택은 루프백 인터페이스를 호출한다.

(3) 네트워크 스택은 호출한 루프백 인터페이스를 사용자 인터페이스에게 반환한다.

 

=> 이렇게 사용자 프로그램-운영체제를 시스템 콜을 통해 왔다갔다 하는 것을 이중 모드라고 한다.

=> 사용자 프로그램이 바로 hw 자원에 접근하게 되면 악영향을 끼칠 소지가 있다.

그래서 사용자 프로그램이 이를 사용하고 싶을 때는, 꼭 운영체제를 호출하게 된다.(=커널모드)

 

 

(해당 글 참고:https://whatsthatsound.tistory.com/184)

 

[Java] 89. 사용자 모드와 커널 모드

[Java] 89. 사용자 모드와 커널 모드 1. 컴퓨터의 구성 2. 소프트 웨어 시스템의 구성 3. 이중 모드와 시스템 호출4. 인터럽트 1. 컴퓨터의 구성(1) 컴퓨터 시스템은 크게 하드웨어(Hardware)와 소프트웨

whatsthatsound.tistory.com


4. 시나리오 코드 (클라이언트 측)

(1) 클라이언트 측 준비물

-서버측 IP 주소와 포트 번호

-서버측 소켓과 연결될 소켓

 

(2) socket 객체에 "localhost",5001을 초기화한다.

이로 인해 socket은 해당 로컬 컴퓨터의 5001이라는 포트 번호를 가진 서버와 연결할 수 있게 되었다.

 

(3) getOutputStream-PrintWriter 스트림을 통해 메세지를 출력한다. 

printWriter 내부에서 true를 선언했기 때문에, 자동적으로 flush()가 실행된다. (=auto flush)

 

(4) try-catch-finally문을 통해 socket을 close()해준다.

*true: 자동으로 flush를 써라!

package ch02;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;

public class ClientFile {
	
	public static void main(String[] args) {
		
		// 클라이언트 측 준비물
		// 1. 서버 측 IP 주소와 포트 번호가 필요하다.
		// 2. 서버 측 소켓과 연결될 소켓이 필요하다.
		Socket socket = null;
		
		try {
			socket = new Socket("localhost",5001);
			PrintWriter writer = new PrintWriter(socket.getOutputStream(),true);
			writer.println("안녕! 반가워~");
			
			socket.close();
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(socket != null) {
				try {
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

}

 

 

 

 

 

728x90
반응형