java

Java.서버_네트워크 게임 만들때 유용한 Socket 교차 알고리즘 전체적인 흐름&동기/비동기

sieunju 2016. 8. 9. 03:30
반응형

이번 글에는 교차 알고리즘의 전체적인 흐름과 동기 비동기에 대해서 간단히 설명해보겠습니다. 

위에 사진은 전체적인 서버와 클라이언트가 받는 것입니다.


우선, 제가 요새 C++ 서버와 C#클라이언트를 만들고 이 C#클라이언트를 (Unity)유니티엔진으로 연동해서 

"모바일 게임" 을 만들고 있다보니 여러가지를 알게되고 알고있던 것은 좀더 심화되게 알게 되다보니, 1년전에  "java Socket 교차 알고리즘" 이라고 만든걸 보니 정말 "엉망진창" 이더군요...ㅡㅡ; 좀더 간단하고 쉽게 만들수 있을거 같긴한데 시간이 여유가 된다면 좀더 보안하고 수정해서 다시 포스팅할 계획 입니다.


그럼 제가 만든 알고리즘에 흐름에 대해서 알려드리도록 하겠습니다. 

우선 Server.java 와 Client.java 쪽을 보시면 쓰레드를 통해 while(true) 무한 루프를 돌리고 있습니다. 그래서 클라이언트와 

무한 반복으로 데이터를 주거니 받거니 합니다. 네..이것이 바로 "동기화" 입니다. 

동기화란, 정말 간단히 말해서 클라이언트가 서버한테 데이터를 던집니다. 그럼 올때까지 기다리고, 서버 또한 

클라이언트가 데이터를 보낼때까지 기다린다. 

이렇게 되면 1차적인 생각은 서버든 클라이언트든 둘중에 하나가 데이터를 보내면 그 나머지 하나는 받을때까지 

다른 "일"을 못한다는 생각이 들것입니다. 

추가적으로, Unity(유니티) 같이 싱글 쓰레드를 사용하는 엔진이 동기화를 사용하면 게임이 진행이 안됩니다. 


서버와 클라이언트가 데이터를 무한 반복을 통해서 주고 받는데 Server는 누가 Client1 이고, Client2 인지

모릅니다. 그래서 데이터를 자기한테 접속한 Client 한테 다 보냅니다.

하지만 여기에 Client가 Server에 접속할때 마다 Server는 그 Client에 대해서 id 값을 저장을 하고 Client한테도 그 id값을 보내준다면?  Server는 자기가 원하는 상대 Client에게 데이터를 보낼수 있습니다. 

그래서 Client1한테는 A를 보내고, Client2한테는 B를 보낼수가 있습니다. 

이것을 응용해서 네트워크 게임을 만들때 예를 들면 카드게임이 있습니다. 

카드 게임의 기본적인 특성상 자신의 패는 상대방에게 보여주면 안됩니다. 

그렇다면 각각 Client 들에게 Server가 다른 값들을 보내야 합니다. 이럴때 사용할수있는것이 제가 만든

교차 알고리즘에 되겠습니다. 

---------------------------------------------------------------------------------------------------------------------------


비동기화에 대해서 간략하게 설명해보도록 하겠습니다. 

비동기화란? 동기화와 반대 개념으로서 클라이언트가 서버한테 "데이터 던질테니까 그거에 맞는 답을 나한테 보내줘~" 라는 뜻이 되겠습니다. 한마디로 클라이언트는 데이터를 보내고 난후 자신의 할것을 하면서 서버가 다시 데이터를 보내면 그것을 받아서 처리한다는 뜻입니다. 


비동기화는 게임 만들때 많이 사용됩니다. 동기화처럼 주구장창 "서버가 언제 데이터를 줄지 모르니까 기다리자"

보단 "데이터를 보냈으니 나한테 그에 맞는 데이터 값을 보내줘~" 가 낫습니다.

라고 생각하시고 공부하실때 도움 될거 같습니다. 


저는 비동기소켓에 대해서 공부하다 보니 위에 같은 생각이 들었습니다. 


이상 글을 마치도록 하겠습니다. 

감사합니다.



반응형