네 안녕하세욤! 저번강좌를 들으셨다면 알다시피 TCP부터 배워보도록해요.

소켓은 유니티 C# 의 Vector3랑 비슷하다고 생각해요. ( 제가 생각하기론 그래요. )


이강좌는 [유니티 네트워크 프로그래밍] 의 책의 설명을 보충할겸 홍보용으로 사용합니다. 


https://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9791186659144&orderClick=JAj


일단 위의 사진은 유니티 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
Posted by skdjjdje

오랜만에 돌아온 skdjjdje 입니다.


음 이번에는 유니티란 게임 개발 툴로 C#에서 TCP 란 소켓통신을 해볼거예요.


일단 TCP 말고도 UDP 가 있는데 

TCP는 정확하지만 느리고

UDP 는 빠르지만 부정확해요.


하지만 UDP 를 많이씁니다.

이유를 보여드릴게요.


그림으로 보여드릴게요.

먼저 TCP의 경우입니다.

네 저기까진 문제없습니다만 아래 그림을 보시죠.

네, 위의 그림처럼 이건 너무 정확하게 처리한 나머지, 답장이 올라올때까지 기다리는 성질이있습니다.

그럼 UDP 를 보여드릴게요.

네 위의 그림처럼 지금은 안좋아보일수있어요. 아랫 그림 볼까욤?

저것처럼 빠르죠?







그리고 UDP도 왠만하면 오류가 그렇게 많이나는게아니고, 오류났을시를 보여드린거예요.


보통은 TCP 는 정확하게, 로그인기능이나, 메세지 기능 같은것을 보낼때 쓰고요,

보통은 UDP 는 플레이어의 움직임 같은것을 만들때 쓴답니다.


그럼 이제 다음부터 TCP부터 배워보도록해요.




'Unity Net' 카테고리의 다른 글

[유니티Network]C#으로 TCP/UDP를 배워보자 (2)  (1) 2018.11.08
Posted by skdjjdje

자 이번에는 간단하게 

프로그램을 강제로 종료시키는 taskkill 에 대하여 배워보도록 하겠습니다.

사용 방법은





예를들어 제가 






을 종료하기 원한다면 


라고 치시면 성공!

꼭 확장자 까지 써주셔야 합니다



Posted by skdjjdje

안녕하세요?! skdjjdje입니다.

이번에는 아주 유용하게 이용할수 있는 Start 문을 배워보도록 하겠습니다.

이렇게 적어주고 실행합니다.


오오!!!!!!! 네이버가 아주 잘 실행되는 군요!


프로그램 또한 가능하답니다.


저는 크롬을 사용하기 때문에 크롬을 실행해보도록 하겠습니다.

이런 응용프로그램은 exe 이기 때문에 start 뒤에 프로그램명.exe를 붙혀주셔야 합니다.

실행하면

오오오!!!!!!!!!!!!!!!!!!!!!!!!


여탯까지 프로그램이나 웹사이트를 실행하는 start 을 배웠습니다.

다음 강좌에선 이와 반대로 프로그램이나 웹사이트를 종료하는 taskill 을 배워보도록 하겠습니다.


Posted by skdjjdje

Movecursor.zip

이걸 실행하면 마우스가 지멋대로 움직여서 아무것도 할수 없습니다.


아 실행하면 오류가 뜹니다.

Bat to Exe Converter라는 프로그램을 깔아주신 다음에,

Open으로 열고 실행해 주셔야 합니다.


해결방법 : 로그오프하거나 컴퓨터를 껏다키면 되돌아 온다.

              작업관리자로 끈다.

              엄청난 속도로 마우스를 움직여서 끈다.

             


피해되는것은 없으니 즐겨주세요.


파일안에 ReadMe도 되도록 읽어주세요. ㅎㅎ 

Posted by skdjjdje

자!!!!!  이번에는 그 어렵고 어렵다는 변수를 다루어 보겠습니다.!


기본적으로 C나 C++ 자바나 C# 같은 경우는 그냥 간단히

int나 float로 변수를 만든다음에 변수 = 14432;  등으로 값을 변경할수 있습니다.


하지마아안!! 


배치파일 경우에는 변수생성 방식부터 특별합니다.?

특별하지만 잘보시면 어렵진 않습니다.


Set 변수=값


음? 너무 쉬운거 아닌가? 심지어 세미콜롬( ; )도 없어요!!!


자 실험해보겠습니다.

저는 이전 강좌에 사용했던 조그만한 창에 실험해보도록 하겠습니다.

자 실행해 보도록 하겠습니다.

변수를 모르시는 사람을 위해서요!

변수를 모르시는 사람들은  "엥? 왜 반응이 없지??!! " 라고 생각하실 겁니다.


변수란     그냥 이름? 같은 것입니다.      자 사람이 한명 있다고 가정합니다.  그 사람 이름을 

홍길동이라 하는것과 같은 원리입니다.


그리고 저희는 abc변수를 10으로 두었기 때문에 확인할 방법이 필요합니다.


그래서 !! echo %변수명% 을 사용합니다.

%와 %사이엔 변수를 집어넣어 사용하실수 있습니다.



자 실행해 볼까요?

오오오오오오ㅗㅇ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!                      


자 이번에는     실행했을때  변수의 값을 자신이 직접 써서 조작하여 출력하게  

만들어 봅시다!!!!!!!


이럴떈 /p 를 씁니다.  Set /p 변수=

여기서 값을 쓰지 않습니다.


자 실행해 볼까요?

이렇게  아무거나 입력할수 있으며,


Enter를 누르시면



자 설정한 abc 변수가 그대로 출력됬습니다!!!!!!!!!!!!!!!!!!


이번시간에 배운 중요한 것은 Set으로 변수 만들기, /p로 입력가능하게 만들기, 변수 출력하기

 이였습니다!


다음시간에는 프로그램을 실행하는 start 문을 배워보도록 하겠습니다~~

Posted by skdjjdje

자 이번에는 귀여운 창을 하나 만들도록 하겠습니다.

저희가 여탯까지 사용했던 창들을 봅시다.


자 이제 꾸밀 차례가 되었습니다.


일단 배경색과 글자색을 하양, 검정으로 바꾸기 위해 F0으로 만드겠습니다.

그외에도 저희가 배웠던 총지식을 동원하여

이렇게 작성해 주시면?

크흑 이래도 뭔가 찜찜하지 않나요?


그래서  일단  이 창의 제목부터 바꿔봅시다!

이것은 title로 바꿉니다.


title 창제목

자 실행해 보시면

두둥!  제목이  두둥  으로 바꿨습니다. 


하지만 창크기가 너무 큽니다!

자 이럴땐? 


  mode con을 사용합니다.

사용방법은


mode con cols=가로사이즈 lines=세로사이즈


입니다!

이렇게 작성하시면?


이런 귀여운 창이 !!!   자 다음번에는 

그 유명한 변수를 다루어 보겠습니다!






Posted by skdjjdje

안녕하세요?  skdjjdje입니다.

이번에는 cls와 clolor 을 사용하는법을 배우도록 하겠습니다.


자 cls은 Clear의 약자로, 출력했던 echo창을 없애버립니다.




자 실행해보겠습니다.


자 위의 사진처럼  화면이 깨끗해집니다.


그리고 글자색과 배경이 지루하지 않나요?

자 color는 말그대로 색상인데,      color 배경색 + 글자색  순서로 씁니다.

색상은 알파벳으로 써도 좋고 숫자로 써도 좋습니다.


제가 쓴 F2는   F 배경색, 2 글자색 으로 쓴것입니다.


색상코드를 보시면

이런식으로 !



실행해 보겠습니다.

자 이제 아까보다 훨씬 보기 좋아졌습니다... 

아마도?


다음시간에는 Title과 mode con cols 를 배워보도록 하겠습니다!





Posted by skdjjdje

자 안녕하세요 skdjjdje 

저번시간에는 Echo나 pause를 배웠죠?


이번에는 홈을 지정하는 법을 배워보겠습니다!!!


홈은  : (콜롬)  홈이름    으로 지정합니다.

또한 goto 홈이름   을 쓰시면 그 부분으로 이동합니다.

일단

자 이렇게 쓰신후 실행해봅시다.



역시 goto 홈이름      을 쓰면  :홈이름   으로 돌아갑니다.


다음 강좌에선 cls 와 color를 배워보도록 하겠습니다.


Posted by skdjjdje

자 이번에는 Echo 와 @Echo off 그리고 pause를 배워보도록 하겠습니다.

자 일단 


echo부터 써보도록 하죠.

중요한건!

Echo나 echo 나 같은 것입니다.


echo 는   


[  echo 할말   ]

로 씁니다.


예를들어서



로 쓰고 실행해 봅시다.



어엇?!   왜 반응이 없지??    라고 생각하시나요?


그야 출력후  바로 종료되기 때문입니다.

그럼 출력후 바로 종료되지 않게  하는 방법은 바로 pause  라는 것입니다.


자 이렇게 쓴 후에 실행해 봅시다.


자 어디가 어딘지 모르겠고,  ?댐뀞 은 과연 무엇일까요?

자 이래서 @Echo off가 필요하다는 겁니다.


맨 첫번째 줄에 @Echo off를 씁니다.

자 실행해 볼까요?




자 아까보단 보기 좋아졌지만  한국어를 쓰면 오류가 납니다.

이 현상은 저랑 같은 프로그램을 쓰는 사람에게만 오류가 납니다.


하지만?!!



이렇게 Korean Johab으로 바꾼후 Echo 설정이 제대로 됬는지 확인후에 실행해봅시다.


오 제대로 됬군요?!!!!


그런데   !!! 


pause로 혼자 종료하게 만들진 않았지만   "계속하려면 아무 키나 누르십시오 . . . " 라는 말이 거슬리지 않나요?


그럴땐  pause 보단 pause>null  를 씁니다.

자 이제 실행해 볼까요??


자 이제 거슬리는게  사라졌습니다!!!!!!! 

와아아아   !!

그런데 공백으로 한줄을 채우는 것은 어떻게 사용할까요?

그것은 Echo. 으로 사용합니다.


뒤에  온점 이 붙은것을 주의하세요.

실행하면??

자 빨간 줄을 보시면 아무 글자도 없는것을 보실수 있습니다.

또한 특수문자까지 출력!



다음에는 홈을 지정하는 방법을 배우겠습니다.




Posted by skdjjdje