본문 바로가기
+)기록/과제

소켓통신

by AppJinny 2023. 7. 24.

*소켓통신

https://ddangeun.tistory.com/31

https://ju-hy.tistory.com/64

 

*예제

https://hijjang2.tistory.com/915

 

[JAVA] 네트워크_소켓(Socket) 통신_NIO 입출력(논블로킹) [2/3] ★★

[ NIO를 이용한 네트워크 입출력 - 논블로킹(non-blocking) 방식 ] 파일 입출력편에서 다룬 것 처럼 네트워크도 NIO를 통해 입출력을 수행할 수 있습니다. 스트림 계열의 경우 인풋과 아웃풋을 따로 만

hijjang2.tistory.com

 

*소켓통신 후 버퍼 rewind

소켓 통신에서 데이터를 송수신할 때는 보통 버퍼를 사용합니다. 버퍼(buffer)는 일시적으로 데이터를 저장하고 전달하는 데 사용되는 메모리 영역입니다. Java에서는 ByteBuffer 클래스가 주로 사용되며, 소켓 통신에서도 ByteBuffer를 사용하여 데이터를 송수신하고 처리합니다.

ByteBuffer는 내부적으로 데이터를 저장하는 포지션(position)과 데이터를 읽고 쓰기 위해 참조하는 인덱스를 가지고 있습니다. 데이터를 버퍼에 쓸 때는 버퍼의 포지션을 이동시키고, 데이터를 읽을 때는 인덱스를 이용하여 데이터를 읽어옵니다.

소켓 통신에서는 데이터를 버퍼에 쓴 후에 보내거나 받은 후에 버퍼에서 읽는 작업을 수행합니다. 이 때, 버퍼를 사용하다 보면 버퍼의 포지션이 데이터를 쓰거나 읽을 때마다 이동하게 됩니다. 이렇게 되면 버퍼를 재사용할 때 문제가 발생할 수 있습니다.

소켓 통신에서는 데이터를 더 작은 단위로 나누어 보낼 수 있습니다. 이런 경우 버퍼의 포지션이 데이터를 쓸 때마다 이동하면 데이터가 제대로 분리되지 않을 수 있습니다. 따라서 이전에 사용한 버퍼를 재사용하기 전에 버퍼의 포지션을 초기화해야 합니다. 이것을 rewind라고 합니다.

ByteBuffer.rewind() 메서드를 호출하면 버퍼의 포지션이 0으로 초기화됩니다. 이렇게 하면 새로운 데이터를 버퍼에 쓸 때 데이터가 올바르게 위치하게 됩니다. 따라서 소켓 통신에서는 버퍼를 재사용하기 전에 rewind() 메서드를 호출하여 포지션을 초기화해야 올바르게 동작할 수 있습니다.