반응형

[프록시 패턴 바로가기]


원격지 프록시는 서버와 클라이언트의 함수 사용이라고 위의 포스트에서 이야기 하였다.


서버-클라이언트 관계가 원격지 프록시로 이루어져 있는 관계라고 보면 된다.



여기 같은 서버에서 게임을 하는 세 사람이 있다.


세 사람을 각자의 집에서 게임을 하고 있지만, 실제로는 한 서버에 3명이 접속한 상태이다.


각자의 캐릭터를 컨트롤 할 때에, 클라이언트에서 움직인 캐릭터는 서버에서도 움직여야 하기 때문에 원격지 프록시를 사용한다.


클라이언트에서 호출한 함수를 확인하여 서버에 데이터를 전송한다.


서버에서는 클라이언트로부터 수신한 데이터를 확인하여, 해당 캐릭터에서 클라이언트가 호출한 함수를 실행한다.


이런 과정을 통하여 클라이언트에서 서버에 있는 캐릭터를 조종할 수 있다.



원래라면 특정 클라이언트에서 서버로 함수를 호출하는 데이터를 송신하면, 서버에서도 해당 클라이언트 이외의 모든 클라이언트에도 함수를 호출하라는 데이터를 송신해야 한다.


하지만 아래의 예제에서는 클라이언트에서 서버로 데이터를 전송하여, 서버에서 함수를 실행시키는 동작만 가능하게 만들었다.


서버에서 클라이언트로 데이터를 전송하여 함수를 호출하는 것은 이를 응용하면 쉽게 만들 수 있을 것이다.

(다 만들고 생각난거 아님 읍읍)



서버 코드를 보겠다.



IAction : 캐릭터를 컨트롤하는 함수를 정의한 가상 인터페이스

Character : 실제 서버에서 생성되는 캐릭터

ServerCharacter : 클라이언트로부터 데이터를 수신하여 서버에 생성되어 있는 캐릭터를 컨트롤


클라이언트에서 데이터를 서버로 송신하면, ServerCharacter에서 데이터를 확인하여 일치하는 캐릭터에서 함수를 호출한다.

(127.0.0.1은 "로컬 호스트=현재" 내 PC 를 말한다.)



클라이언트의 코드를 보겠다.



클라이언트의 코드는 서버 코드에 비해서 간단하다.


클라이언트에서는 서버에 접속한 후에 데이터를 송신하면 끝이다.



단, 서버-클라이언트 구조를 짤 때에 주의할 점이 있다.

서버와 클라이언트간의 Send - Recv 함수를 일치시켜 주어야한다.

그렇지 않으면 이전의 데이터를 송신한다거나, 서로 데이터를 보내거나 받기만 하는 교착 상태에 빠지게 된다.

반드시 Send - Recv 가 서로 송/수신 할 수 있도록 구조를 만들어야 한다.















위의 3개는 클라이언트

아래는 서버이다.

클라이언트에서 호출된 순서는 서버에서 호출된 플레이어 이름과 일치한다.


반응형

+ Recent posts