소켓 프로그램이란 : 소켓은 컴퓨터를 네트워크에 접속시키는 역할, 그러한 소켓을 이용한 프로그래밍
###잘못된 내용이 있다면 알려주세요!
#이론
네트워크에서 데이터들이 전송되는 방식
네트워크에서 돌아다니는 데이터의 규모와 용도는 굉장히 다양합니다.
이러한 데이터들의 전송을 관리하려면 일정한 규칙이 필요했습니다. 때문에 작은 데이터 하나를 전송해도 수많은 규칙에 따라 패키징 되어 전송되게 되는데, 그 수많은 규칙들을 프로토콜이라고 합니다.
TCP/IP 4계층
응용 계층 : 어떤 데이터인지
전송 계층 : 어떻게 보낼 것인지
인터넷 계층 : 전달
네트워크 계층 : 전달(네트워크 하드웨어, 드라이버)
ex) 실시간 데이터가 전송이 필요하니까 IP주소로 UDP방식을 통해 데이터를 전송해야지
#응용
소켓 프로그래밍을 이용해 실시간 PVP전투를 만듭니다.
간단하게 클라이언트들은 소켓을 통해 자신의 위치를 보내고, 서버에서는 이를 저장하고 있다가 클라이언트들에게 위치를 전달합니다. 그러면 클라이언트들은 상대 클라이언트 위치를 알 수 있게 됩니다.
실시간으로 빠른 데이터 전송이 필요하기 때문에 UDP를 사용해야하지만 정보손실 기타등등을 처리하는데 시간이 걸릴 것 같기 때문에 TCP를 선택
소켓 사용한 서버 코드
// ##서버 코드 간략화
// 소켓 생성 : 사용할 주소체계, 소켓타입(TCP), 데이터전송방식 설정
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
// 클라이언트가 접근할 서버의 정보 (IP, 포트)
IPEndPoint ip_point = new IPEndPoint(IPAddress.Any, 9999); // param : IP 주소, 포트 번호
socket.Bind(ip_point);
// 클라이언트 연결까지 대기
socket.Listen(100);
// 연결된 클라이언트 소켓 정보 return
Socket client_socket = socket.Accept();
// 소켓 연결되면 쓰레드에서 실행 시킴
Thread client_thread = new Thread(() => RunClient(ref client_socket));
client_thread.Start();
void RunClient(ref Socket socket)
{
while (true)
{
socket.Receive(data);
socket.Send(data);
}
socket.Close();
}
서버에서 데이터를 받아보았습니다.
심플하게 "x"=1, "y"=2 이런식으로 전달받아 클라이언트에게 보내줍니다.
실시간 전투는 가능하지만 속도가 느려서 클라이언트끼리 싱크로율이 떨어지는 모습이 보입니다.
결론
@TODO TCP -> UDP
@DONE 20200506
TCP/UDP
TCP :
1. 스트림 전송
-빠르게 여러번 전송하면 데이터가 합쳐져서 도착, 즉 패킷 마지막 구분이 안됨
2. 서버 소켓 - 클라이언트 소켓 1대 1 연결
- 소켓끼리 연결하는 connect 과정이 필요함
- connect잡히면 해당 소켓끼리만 통신이 시작됨
3. 응답 확인 (시간 지연, CPU 소모)
4. 신뢰성이 높다
UDP :
1.데이터 그램
-메세지 단위로 전송, (65535 바이트 이상은 잘라서 보냄)
2.속도가 빠르다
3.소켓 대신 IP 기반으로 데이터 전송
- 어디 IP에서 어디 IP로 보냅니다 라고 정보 주고 연결해줘야함
Http통신 GET/POST 을 사용하지 않은 이유
www상에서 주고받는 통신이 아니기 때문에 http프로토콜을 사용하지 않았습니다.
응용계층에서 따로 규칙을 만들어서 사용할 수 있다는 의미입니다.
'Programming' 카테고리의 다른 글
빌드 과정 (0) | 2020.03.18 |
---|---|
[C#] 이란 (1) | 2020.03.09 |
[C++]가상 함수 (0) | 2020.03.03 |
C#의 Delegate - CallBack 만들기 (0) | 2020.02.25 |
오브젝트풀과 옵저버 패턴 (0) | 2020.02.25 |