Socket통신과 TCP, UDP

0

소켓은 네트워크를 서로 연결하는 연결부 같은 역활을 한다.

소켓은 방식에 따라 TCP소켓과 UDP 방식으로 나뉜다.

OSI 7 Layer(Open System Interconnection 7 Layer)의 네 번째 계층인 TCP(Transport Control Protocol) 상에서 동작하는 소켓을 주로 사용하는데, 이를 "TCP 소켓" 또는 "TCP/IP 소켓"이라고 부릅니다. (UDP에서 동작하는 소켓은 "UDP 소켓"이라고 합니다.)

TCP란?

연결지향형인 TCP는 3-way handshaking이라는 과정을 통해 연결 후 통신을 시작합니다.
또한, 흐름제어와 혼잡제어를 지원하며 데이터의 순서를 보장합니다

흐름제어란, 보내는 측과 받는 측의 데이터 처리속도 차이를 조절해주는 것을 말하며,
혼잡제어란, 네트워크 내의 패킷 수가 넘치게 증가하지 않도록 방지하는 것을 말합니다.

하지만 TCP는 UDP에 비해 속도가 느리다는 단점이 있습니다.
따라서, 대부분의 웹 HTTP 통신, 이메일, 파일전송에 사용됩니다.
출처: https://swalloow.tistory.com/77 [MyCloud]

UDP란?

UDP는 전송계층의 비연결형 프로토콜입니다.
따라서 TCP와 달리 연결 설정이 없으며,
혼잡제어를 하지 않기 때문에 TCP보다 빠르다는 장점이 있습니다.

하지만 데이터 전송에 대한 보장을 하지 않기 때문에 패킷 손실이 발생할 수 있습니다.

UDP는 이러한 특징때문에 DNS, 멀티미디어에서 사용됩니다.

Create Server Socket

try {server_socket = new ServerSocket(21200);
} catch (IOException e) {
	System.out.println("해당 포트가 열려있습니다.");
}

지정된 포트번호로 바인딩된 서버소켓을 만든다(기본연결수 50)
만약 만들어져있다면 IOexception이 만들어지고 serversocket은 유지된다.

Listen for a connection

socket = server_socket.accept(); // 서버 생성 , Client 접속 대기
socket.setSoTimeout(2000);

accept단으로 내려오면 연결이 실행될때까지 server는 연결이 될때까지 멈춰있는다.
소켓이 계속 물려있으면, 연결수가 아웃될것이므로, 소켓에 시간제한을 걸수있다.

	socket.getRemoteSocketAddress().toString()

추가로 해당된 코드로 클라이언트의 IP를 가져올수있다.

Read data from the Client

Socket 객체가 반환 되면 (연결이 되면) InputStream을 사용하여 클라이언트에서 보낸 데이터를 읽을 수 있다.

is = socket.getInputStream();

InputStream은 데이터를 byte 배열로 읽기 때문에, 상위 레벨의 데이터를 읽으려면 InputStreamReader로 읽어온다.

isr = new InputStreamReader(is, "UTF-8");

또한 BufferedReader에 InputStream을 래핑하여 데이터를 String으로 읽어온다.

String buffer = null;
buffer = br.readLine(); // Blocking
	if (buffer == null) {
    System.out.println("[server] closed by client");
    }

Send Data to the client

Socket과 연결 된 클라이언트에게 OutputStream을 사용하여 데이터를 보낸다.

os = socket.getOutputStream();

한글을 지원하기위해 OutputStreamWriter를 이용하여 UTF-8로 감싼다.

osw = new OutputStreamWriter(os, "UTF-8");

autoFlush를 지원하는 PrinterWriter를 이용한다.

pw = new PrintWriter(osw, true);

서버가 클라이언트에게 값을 줄때

pw.println("테스트입니다");

Close the client Connection

InputStream과 Outputstream으로 썼던 자원을 반환해준다.

socket.close()
profile
쉽게 가르칠수 있도록 노력하자

0개의 댓글