-
Java I/O <4 - Network Stream>언어/자바 2023. 12. 25. 23:16
막연하게만 사용하던 I/O를 조금 더 이해해보고자 작성한 글입니다.
기본적으로 I/O는 O/S 레벨에서 이루어지고 byte를 다룬다는 것을 생각야해합니다.
네트워크를 왜 I/O로 분류하는가를 이해해보자.
Socket과 I/O Stream
쓰레드를 사용하지 않고, socket에서 제공하는 Input/Output Stream을 사용해서 간단하게 메세지를 console에서 확인해보자.
1. 클라이언트에서 서버로 메세지를 보내보자
우선 원하는 포트를 지정해서 응답을 기다리는 서버를 만든다.
서버에 도착한 stream을 console에 출력해보자.// server public static void main(String[] args) { ServerSocket serverSocket = new ServerSocket("port"); boolean isRunning = true; while (isRunning) { Socket s = serverSocket.accept(); InputStream in = s.getInputStream(); byte[] b = new byte[256]; in.read(b); System.out.write(b); System.out.flush(); in.close(); } }
다음은 준비한 포트 번호로 OutputStream을 흘려보내줄 클라이언트를 만들자.
"Hello from client"라는 텍스트를 OutputStream에 써보자.// client public static void main(String[] args) { Socket s = new Socket("ip", "port"); OutputStream out = s.getOutputStream(); String msg = "Hello from client"; byte[] byteMsg = msg.getBytes(); out.write(byteMsg); out.flush(); out.close(); s.close(); }
2. 서버에서 클라이언트로 응답을 보내주자.
처음 클라이언트에서 메세지를 보냈던 것과 동일한 방법으로 서버에서도 OutputStream을 사용해서 메세지를 보낼 수 있다.
// server public static void main(String[] args) { ServerSocket serverSocket = new ServerSocket("port"); boolean isRunning = true; while (isRunning) { Socket s = serverSocket.accept(); InputStream in = s.getInputStream(); byte[] b = new byte[256]; in.read(b); System.out.write(b); System.out.flush(); System.out.println("\nReceived"); OutputStream out = s.getOutputStream(); String msg = "Response from server"; byte[] byteMsg = msg.getBytes(); out.write(byteMsg); out.flush(); out.close(); } }
클라이언트에서도 서버처럼 InputStream을 이용해서 메세지를 받을 수 있다.
// client public static void main(String[] args) { Socket s = new Socket("ip", "port"); OutputStream out = s.getOutputStream(); String msg = "Hello from client"; byte[] byteMsg = msg.getBytes(); out.write(byteMsg); out.flush(); InputStream in = s.getInputStream(); byte[] b = new byte[256]; in.read(bytes); System.out.write(b); System.out.flush(); System.out.println("done"); out.close(); in.close(); s.close(); }
Socket
얼마전에 같이 공부하는 친구가 소켓을 한 마디로 표현하면 뭐라고 할 수 있냐는 질문에 답을 하지 못했었는데, 이번에 I/O 사용과 네트워크 공부를 하고나니 설명할 수 있을 것 같다.
- 소켓을 한 마디로 설명하면?
우편물을 받을 수 있는 우편함에 비유할 것 같다.
2. 자세하게 이야기한다면?
ip = 건물 주소 / port는 건물내의 몇호 인지
다른 컴퓨터와 통신을 할 때는 ip와 port를 이용해서 내 프로그램을 특정한다.
우선 ip를 통해서 내 컴퓨터를 찾는다. 그리고 내 컴퓨터에서 작동하는 많은 프로그램들 중에서 내가 서버 통신을 할 프로그램의 위치를 port로 찾는다.물론 주소를 특정하는 것 이외에도, I/O Stream을 관리하는 역할을 함께한다!
Netcat
이번에 내 컴퓨터에 띄워놓은 서버에 같은 LAN에 있는 다른 기기로 접근해보려고 하면서 알게 된 통신방법이다
나는 맥을 사용하고 있기 때문에 터미널에서 아래의 명령어를 사용했다.
$ nc ip port // 서버에 연결하는 코드 $ nc 192.168.0.0 8080 // 예시
서버를 해당 ip에 띄워놓고 위 명령어로 해당 서버에 붙으면 터미널에서 메세지를 보내볼 수 있다.
$ nc -l 8080 // 서버 포트 여는 법
별도로 자바서버를 구현하지 않고, 그냥 터미널에서 위 명령어를 입력한다면 해당 포트로 소켓통신이 가능하게 된다.
ip와 port에 대한 지식이 조금 생기고 나니, 이런 통신이 어떻게 가능한지 조금은 이해가 되는것 같아 보람이 있다.
'언어 > 자바' 카테고리의 다른 글
Java I/O <6 - Reader>통계 (1) 2023.12.25 Java I/O <5 - Buffered Stream> (0) 2023.12.25 Java I/O <3 - FileStream> (0) 2023.12.25 Java I/O <2 - InputStream> (0) 2023.12.23 Java I/O <1 - OutputStream> (0) 2023.12.23