자바 네트워크 입출력 / TCP

BRINCE·2022년 9월 22일
0

자바 스터디

목록 보기
9/10

네트워크

네트워크는 여러 컴퓨터들을 통신 회선으로 연결한 것을 말한다.
LAN은 특정 영역에 존재하는 컴퓨터를 연결한 것 이고, WAN 은 LAN을 연결한 것이다. WAN이 흔히 말하는 인터넷이다.

서버와 클라이언트

서비스를 제공하는 프로그램을 일반적으로 서버 라고 부르고, 서비스를 요청하는 프로그램을 클라이언트 라고 부른다.
쉽게 생각해 서버는 식당의 주방이모라면, 클라이언트는 음식을 주문한 손님이라고 생각하면 쉽다.. 🙋‍♂️

PORT번호

컴퓨터 내부에서 실행하는 서버를 선택하기 위해서는 추가적인 Port번호가 필요하다.
내 주문의 번호표라고 생각하면 쉬울까 ..?

IP주소 얻기

InetAddress 를 이용하면 로컬 컴퓨터의 IP주소를 얻을 수 있다.

InetAddress ia = InetAddress.getLocalHost(); 

TCP네트워킹

IP 주소로 프로그램들이 통신할 때는 약속된 데이터 전송 규약이 있다. 이것을 전송용 프로토콜이라고 부른다.
인터넷에서 전송용 프로토콜은 TCP 와 UDP가 있다.

TCP

TCP는 연결형 프로토콜로, 상대방이 연결된 상태에서 데이터를 주고 받는다.
TCP는 순서대로 데이터가 전달되기 때문에 손실이 발생하지 않는다. (IP와 함께 사용하기 때문에 TCP/IP라고도 한다.)
서빙이모라고 생각하면 된다.. 💁🏻‍♀️

자바는 ServerSocket 과 Socker클래스를 제공한다.

  • ServerSocket은 클라이언트의 연결을 수락하는 서버쪽 클래스이다.
    • 주문을 받는다고 생각하면 쉬울듯?
  • Socket은 클라이언트에서 연결 요청할 때와 클라이언트와 서버 양쪽에서 데이터를 주고 받을 때 사용되는 클래스이다.
    • 음식점 포스기라고 생각하면 쉬울까 ?

TCP서버

TCP서버 프로그램을 개발하려면 ServerSocket 객체를 생성해야 한다.

ServerSocket serverSocket = new ServerSocket(50001);
// 50001번을 포트로 가지는 서버 소켓 생성

🙅🏻‍♂️ 만약 포트가 사용중이라면 예외가 발생한다. 다른 포트로 바인딩하거나 포트를 사용중인 프로그램을 종료하고 실행하면 된다.

서버소켓이 생성되었다면 연결 요청 수락을 위해 accept()메소드를 실행해야 한다.
메소드는 클라이언트가 연결 요청하기 전까지 소켓 실행을 대기시킨다.
서버를 종료하려면 반대로 close() 메소드를 호출하면 된다. (포트 번호도 함께 인바이딩 되어 다른 프로그램에서 해당 포트 번호를 사용이 가능하게 된다.)

TCP클라이언트

클라이언트가 서버에 연결 요청을 하려면 Socket객체를 생성할때 매개값으로 서버 IP주소와 포트 번호를 제공하면 된다.

Socket socket = new Socket("IP",50001);

연결 요청시 IOException과 UnknownHostException(IP주소가 틀렸을때) 예외가 발생할 수 있으니 catch절을 추가해줘야 한다.
마찬가지로 연결을 끊고 싶을땐 socket.close()메소드를 호출하면 된다.

(요청을 받을 서버소켓은 앞에 'Server'가 붙고, 요청을 할 소켓은 서버가 안붙는다. 👏🏻)

입출력 스트림으로 데이터 주고받기

자바 프로그램상 문자를 출력하거나 입력받을 때 인풋아웃풋 스트림을 이용하는 것처럼, 클라이언트와 서버 사이에 데이터를 주고받을때도 사용이 가능하다.

InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();

상대방에게 데이터를 보낼때에는 보조스트림인 DataOutputStream을 연결해서 간결하게 보낼 수 있다.

String data = "data"; //보낼 데이타
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
dos.writeUTF(bytes); 
dos.flush(); //남는 바이트 뿜어냄

데이터를 받아올때는 마찬가지로 DataInputStream을 이용하면 된다.
(상대방이 DataOutputStream으로 보낼때만 받을 수 있고, byte[]배열을 사용하는 OutputStream은 받을 수 없다.)

DataInputStream dis = new DataInputStream(socket.getInputStream());
String data = dis.readUTF();

데이터를 보낼땐 OUT 받을땐 IN이다.. 꼭 기억해두자!

profile
자스코드훔쳐보는변태

0개의 댓글