Пиша игра, базирана на сървър-клиентска архитектура на Java.
Поради причини, свързани с дизайна, бих искал да използвам асинхронни извиквания за предаване на клиентски действия към сървъра, както и асинхронни обратни извиквания за предаване на резултата(ите) от споменатите действия обратно на клиента. Асинхронните извиквания позволяват буфериране на клиентските действия. Буферирането в опашка позволява проста, основно еднопоточна обработка на клиентските действия.
В момента моят сървър и клиентски код са доста симетрични. Те създават регистър, след което експортират и се обвързват.
Асинхронността се постига чрез буфериране на входящите действия или резултати в ConcurrentLinkedQueue. Действителната обработка се извършва от нишка, изпълнявана на редовни интервали.
Тази текуща архитектура обаче не работи, когато клиентите са със защитна стена или зад NAT. В този случай сървърът просто не може да достигне до клиентите, за да им изпрати резултати.
Освен това, в тази текуща архитектура сървърът не знае кой клиент е изпратил дадено действие, освен ако не бъде въведен излишен слой на удостоверяване или обработка на сесии. Това позволява подправени действия и измама.
Мислех за възможни решения, но не намерих подходящо:
Изтегляне на клиента вместо натискане на сървъра. Може да има метод на сървъра, който клиентите периодично извикват, за да извлекат своите резултати. Този подход обаче изглежда много грозен, въвежда допълнителни забавяния, проблеми с честотната лента и времето. Не решава и фалшифицирането на действие. Директните известия също са много предпочитани.
TCP връзките сами по себе си позволяват двупосочна комуникация и определено могат да идентифицират клиенти, така че RMI или JRemoting може да бъдат хакнати, за да ги поддържат, но не знам как и не знам за такива съществуващо решение.
Преминаване на съобщения. Не съм сигурен дали рамките за предаване на съобщения поддържат удостоверяване/сесии или идентификация на клиента. Определено обаче бих загубил дистанционните методи.
Вярвам, че правилното решение би било да се намери рамка за извикване на отдалечен метод, която поддържа всичко по-горе.
Така че накратко, търся начин да:
- извикване на сървъра асинхронно или предаване на съобщение до него
- извикайте клиента асинхронно или му предайте съобщение, дори зад защитна стена или NAT
- идентифициране на клиента, изпращащ действието
- за предпочитане е да можете да извиквате методи, а не само да предавате съобщения
- запазвайте възможността лесно да го тествате с JUnit и Mockito (множество клиенти на машина)
Има ли рамки за извикване на отдалечен метод с поддръжка за тях? Кое е най-доброто?