[유니티Network]C#으로 TCP/UDP를 배워보자 (2)
네 안녕하세욤! 저번강좌를 들으셨다면 알다시피 TCP부터 배워보도록해요.
소켓은 유니티 C# 의 Vector3랑 비슷하다고 생각해요. ( 제가 생각하기론 그래요. )
이강좌는 [유니티 네트워크 프로그래밍] 의 책의 설명을 보충할겸 홍보용으로 사용합니다.
일단 위의 사진은 유니티 C#폴더를 생성했을때 모습입니다.
기초들은 생략하고 Socket을 중심으로 설명하겠습니다.
위의 사진은 일단 Socket들을 사용하려면 using System.Net;
using System.Net.Sockets;
을사용해요.
회색으로 보이는건 아직 소켓을 사용하지 않아서 그래요.
일단 이것들안에 여러 소켓을 사용할 기능이 있다는것만 알아두시면 됩니다.
일단 응답을 기다릴 소켓변수를생성해요.
private Socket m_listener = null;
여기서 Socket 변수인 m_listener를 해봤어요. 물론 m_listener 아니여도 됍니다.
그리고 값이없으니 null 로 확실히 해둡시다.
void Listener()를 선언하고
안쪽에 그 응답을 기다릴 소켓변수 m_listener 에 값을 초기화 하도록해요.
아까 제가 소켓은 Vector3랑 비슷하다했죠?
이것역시 소켓변수 = new Socket이며 뒤에 3개의 공간이있습니다.
Vector3를 많이 사용하시는 분들은 이해가 빠를겁니다.
Vector3는 값이 3개들어가는 변수이고, Vector3 abc = new Vector3(0,0,0);
알고보면 매우 비슷하죠?
그처럼 AddressFamily.InterNetwork 는
아이피 주소라 보시면 되고,
SocketType.Stream은 Stream형태의 소켓이라 보시면 됩니다.
으음 Stream말고도 다른건 있는지 잘몰라요 저도,
ProtocolType.Tcp는 이전강좌와 같이 TCP의 특성을 살리는거라 보시면됩니다.
new Socket(아이피, 소켓, 소켓종류);
ProtocolType인거 기억하시고!
UDP 와 TCP 를 합친게 있다고 들었는데 정확히는 모르겠네요.
자 이제 소켓에서 포트 값을 입력받을때를 대비하여,
자 포트값을 입력받을수있게 m_port라는 정수형 변수를 만들고,
그 포트에 접속할수있게 합니다.
으음, 설명이 부족했군요. IPAddress.Any는 아이피 값이 들어올때를 대비하여, 으음
아이피와 포트는 환상의 조합이예요.
일반적으로 저희들이 사용할수있는포트는 대부분 1로시작하는 5자리 숫자라고 보시면 됩니다.
아 그리고 IPEndPoint는 포트와 아이피를 받아드립니다.
Bind를 쓰면 소켓에 이름을 부여하는데 보통 IPEndPoint 에 같이 쓰인다고 보시면 됩니다.
아 맨위에 const 는 지역변수 선언입니다.
자 위의 사진을 보시면 소켓변수 에 Listen(1) 을 붙혔습니다.
이건 응답대기입니다.
응답이 올때까지 계속기다립니다.
자 이렇게 응답만 할게 아닙니다!
접속요청을 받고, 접속하고, 응답대기를 해제해야합니다!
해제를 안하면 게임이 계속 STOP!
자 그러기 위해 일단 switch 문을 사용할껀데 enum으로 한묶음으로 만들어봅시다.
(이번강좌는 Socket을 중심으로 설명하기때문에 기초적인것은 나중에 다른곳에서 설명하겠습니다.)
일단 enum을 사용해 State라는 변수안에 값을 여러개 넣었습니다.
저희가 같이 만들었던 Listener 도 있습니다.
일단 Start문에 이것을 사용하기위해 다른것부터 준비하겠습니다.
일단 아이피주소를 받을 m_address 와
아까 그 상태를 조작하기 위한 m_state를 추가했습니다.
Start문에 m_state문은 아까 그 enum State안에 SelectHost 라는 값으로 변경하여,
호스트를 찾는 중이다
라는 의미를 지닌 변수로 만들었습니다. 아직까진 의미없습니다.
IPHostEntry는 DNS 호스트 이름을 연결합니다.
Dns가 뭐냐고요? 바로 Domain name system 이죠!
호스트의 이름의 시스템입니다.
흠 그러니깐
,IPHostEntry hostEntry = Dns.GetHostEntry(Dns.GetHostName());
해석하자면
hostEntry 는 GetHostName 함수로 호스트 를 얻는다.
호스트를 얻는 이유는 일반적으로 아이피주소를 얻기 힘들기때문에
호스트를 사용하는겁니다.
System.Net.IPAddress hostAddress = hostEntry.AddressList[0];
이것도 그 호스트를 아이피주소의 리스트에 넣는겁니다.
m_address = hostAddress.ToString();
이것역시 m_address 라는 string 형변수를 그 아이피주소의 값을 넣는겁니다.
그리고 State를 수시로 변경하기위해업데이트 문에 switch 문을 넣습니다.
자 이제 클라이언트 접속요청을 받는부분을 꾸며줍시다.
그전에 Listener 부분도 한줄 추가합시다.
아까 그 switch 문에서 AccpetClient() 함수를 호출할겁니다.
자 이제 AccpetClient부분을 만들어줍시다.
위의 사진처럼 Socket 변수로 m_socket을 하나 만들었습니다.
자 위의 AcceptClient() 안의 내용을 해석하자면 ,
만약 ( 리스닝변수가 값이 없지 않고, 리스닝변수의 데이터를 수신했을때)
{
소켓변수 = 리스닝변수 의 Accpet함수다.
디버그 ("클라이언트는 연결됐다. [TCP] ") 출력
상태 변수 = 상태의 서버소통이다.
}
무슨말이나면요, 일단 m_listener 가 값이 있어야 하니깐 값이 null 이 아닐시,
그리고, m_listener.Poll 은 그 TCP의 단점중 하나인 , 데이터가 보내지고 안돌아올시,
게임이 멈추는 현상을 방지하기위하여, 클라이언트가 데이터를 보내는것을 감시해서,
데이터를 수신햇을때만 Accpet함수를 호출하도록 합니다.
m_socket변수는 그 리스닝함수의 Accpet함수 로 선언합니다.
그리고 확인을 위하여 Debug.Log를 이용합니다.
마지막으로 m_state = State.ServerCommunication;
으로 ServerCommunication 함수를 실행해야겠죠?
자 이제 클라이언트에 접속하는 방법을 다음시간에 배워보도록해요~!
- 더 많은 것을 알고싶다면 [유니티 네트워크 프로그래밍] 책을 참고하세요. -
'Unity Net' 카테고리의 다른 글
[유니티Network]C#으로 TCP/UDP 소켓통신을 해보자. (1) (0) | 2018.11.08 |
---|