Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2014, 21:31   #1
lawliet93
Форумчанин
 
Регистрация: 30.08.2011
Сообщений: 102
По умолчанию Проектирование клиент-серверного взаимодействия

Привет. Пишу многопользовательскую онлайн игру, для клиентской части использую движок Unity3D, а сервер пишу на C#, т.к. код для движка тоже на C#. Постараюсь более-менее понятно описать то, что сейчас имеется и возникшие проблемы.
Для связи клиента с сервером использую сокеты. Весь проект состоит из клиента, сервера и двух dll-библиотек. Первая библиотека содержит классы, которые представляют собой данные, которые ходят между клиентом и сервером, а вторая библиотека содержит классы, которые обрабатывают классы из первой библиотеки. Сейчас общение клиента с сервером вот такое: клиент создает класс с данными, и отправляет их на сервер, сервер обрабатывает полученные данные в методе класса-обработчика, который возвращает класс с данными предназначенными для клиента и они отправляются назад клиенту. Вот часть кода, отвечающая за обработку принятых данных и отправку ответа
Код:
IFormatter formatter = new BinaryFormatter();
                        IClientData command = (IClientData)formatter.Deserialize(new MemoryStream(client.buffer)); // получаем класс с данными от клиента - запрос
                        IServerData result1 = new SuperExecutor().Executor(command);//передаем класс-запрос в метод класса-обработчика, 
который в свою очередь возвратит класс-ответ (классы запрос и ответ находятся в dll1, а класс-обработчик - в dll2)
                        MemoryStream ms = new MemoryStream();
                        formatter.Serialize(ms,result1);
                        client.buffer = ms.GetBuffer();
                        client.socket.Send(client.buffer, 0, ms.GetBuffer().Length, SocketFlags.None);//отправляем класс-ответ клиенту
Проблема вот в чем: некоторые запросы от клиента не требуют ответа от сервера, и некоторые запросы от клиента не присылают никаких данных, они лишь дают команду серверу - сделать что-то, и если это что-то нужно сделать с данными, которые уже на сервере, то я не смогу передать их в метод обработчик, так как передаются только данные полученные от клиента. Что мне делать? Как сделать так, чтобы сервер мог получать не только данные от клиента и обрабатывать их, а чтобы он так же мог получать команды от клиента, работать со своими данными и в зависимости от требований отправлять или не отправлять клиенту ответ?
lawliet93 вне форума Ответить с цитированием
Старый 24.01.2014, 00:24   #2
simples
Форумчанин
 
Регистрация: 03.10.2013
Сообщений: 142
По умолчанию

Цитата:
Сообщение от lawliet93 Посмотреть сообщение
IServerData result1 = new SuperExecutor().Executor(command);//передаем класс-запрос в метод класса-обработчика,
который в свою очередь возвратит класс-ответ (классы запрос и ответ находятся в dll1, а класс-обработчик - в dll2)
MemoryStream ms = new MemoryStream();
formatter.Serialize(ms,result1);
client.buffer = ms.GetBuffer();
client.socket.Send(client.buffer, 0, ms.GetBuffer().Length, SocketFlags.None);//отправляем класс-ответ клиенту
[/CODE]
я бы тут проверял на null
Код:
IServerData result1 = new SuperExecutor().Executor(command);
if (result1 != null)
{
                        MemoryStream ms = new MemoryStream();
                        formatter.Serialize(ms,result1);
                        client.buffer = ms.GetBuffer();
                        client.socket.Send(client.buffer, 0, ms.GetBuffer().Length, SocketFlags.None);
}

А с вопросом про пакет от клиента в котором нет данных (но есть команда) - я вообще не понял проблемы.

Последний раз редактировалось simples; 24.01.2014 в 00:26.
simples вне форума Ответить с цитированием
Старый 24.01.2014, 00:50   #3
lawliet93
Форумчанин
 
Регистрация: 30.08.2011
Сообщений: 102
По умолчанию

simples, не помню почему, но проверка на null там не сработает, я просто добавил в интерфейс IServerData сигнатуру метода, который по дефолту возвращает true, и вот если он возвращает true, то я отпрввляю, а если false, то не отправляю, с другим там всем разобрался уже вроде
lawliet93 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание клиент-серверного приложения. bedrock90 Фриланс 5 05.09.2012 16:13
Организация клиент-серверного приложения ror13 C/C++ Сетевое программирование 7 04.07.2011 16:04
Разработка клиент-серверного приложения Sabber БД в Delphi 0 19.05.2010 12:25
Разработка клиент-серверного приложения на PHP IlyaGT Помощь студентам 1 09.04.2009 10:18
Разработка клиент - серверного приложения Spyer Работа с сетью в Delphi 5 16.01.2008 15:46