PrintWriter 사용 이유
- 편리한 메서드: print(), println(), printf()와 같은 메서드를 제공하여 다양한 형식의 데이터를 손쉽게 출력할 수 있다.
- 자동 플러시(autoFlush): PrintWriter를 생성할 때 autoFlush를 true로 설정하면, println() 등의 메서드를 호출할 때 자동으로 버퍼가 플러시되어 데이터를 즉시 전송한다. 이는 네트워크 소켓과 같이 실시간 데이터 전송이 중요한 경우에 유용하다.
- 버퍼링: 출력 데이터를 버퍼에 저장한 후 한 번에 출력하여 성능을 향상시킨다. 필요시 flush() 메서드를 호출하여 강제로 데이터를 출력할 수도 있다.
주요 메서드
- print() : 다양한 데이터 타입을 출력한다. (문자열, 정수, 부동 소수점 등)
- println() : 데이터를 출력하고 새로운 줄로 이동 한다 .
- flush() : 버퍼를 강제로 플러시하여 출력 스트림에 데이터를 쓴다.
- close() : 출력 스트림을 닫는다.
주의사항
- 예외 처리: PrintWriter는 메서드 호출 중 발생하는 입출력 예외를 던지지 않고 내부적으로 처리하므로, 스트림 상태를 주기적으로 확인하거나 명시적으로 checkError() 메서드를 호출하여 오류를 확인해야 한다.
로컬호스트와 루프백(Loopback) 개념
로컬호스트(Localhost)
- 개념 : 로컬호스트는 현재 사용 중인 컴퓨터 자체를 나타내는 용어다. 네트워크 프로그래밍에서 로컬호스트는 localhost 또는 IP 주소 127.0.0.1 로 표현된다.
- 용도 : 네트워크 애플리케이션을 개발하거나 테스트할 때, 외부 네트워크에 의존하지 않고 자신의 컴퓨터에서 서버와 클라이언트를 실행하여 통신을 시도할 수 있다.
루프백(Loopback)
- 개념: 루프백은 네트워크 장치가 자신에게 데이터를 보내는 가상의 네트워크 인터페이스입니다. 127.0.0.1 주소를 통해 루프백 인터페이스로 데이터를 보내면, 데이터는 외부 네트워크로 나가지 않고 즉시 자신에게 돌아옵니다.
- 용도: 네트워크 소프트웨어를 개발하거나 디버깅할 때, 외부 네트워크 환경 없이 로컬에서 모든 테스트를 수행할 수 있습니다.
System Call 이란?
+----------------------------+
| Your Computer |
| (localhost / 127.0.0.1) |
| |
| +-------------+ |
| | Application | |
| +-------------+ |
| | |
| v |
| +-------------+ |
| | System Call | |
| +-------------+ |
| | |
| v |
| +-------------+ |
| | Network | |
| | Stack | |
| +-------------+ |
| | |
| v |
| Loopback Interface |
| ^ |
| | |
| +-------------+ |
| | Network | |
| | Stack | |
| +-------------+ |
| | |
| v |
| +-------------+ |
| | Application | |
| +-------------+ |
| |
+----------------------------+
package ch01;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
// 클라이언트 측 -- 소켓 통신을 하기 위해서 준비물
// 1. 서버측 컴퓨터의 주소 : 포트 번호
// 2. 서버측과 연결될 기본 소켓이 필요하다.
// 생성자 매개변수에 서버측 IP주소, 포트번호
// 127.0.0.1 (localhost) <- 자기 자신의 주소
try (Socket socket = new Socket("192.168.0.129", 5000)){
// new Socket("localhost", 5000) -> 객체 생성시 서버측과 연결되어서
// 스트림을 활용할 수 있다.
// 대상은 소켓이다!
OutputStream output = socket.getOutputStream(); // 소켓에서 기반 스트림
PrintWriter writer = new PrintWriter(output,true); // 기능 확장 - 보조 스트림
writer.println(": 하잉~~~!!!");
} catch (Exception e) {
e.printStackTrace();
}
}// end of main
}// end of class
728x90