Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > Передача удаленному объекту удаленного объекта


Автор: MaxWave 6.12.2008, 01:20
Вообщем есть простое приложение - типа сетевой игры. Один сервер- куча клиентов. Сервер должен знать всех клиентов и постоянно с ними иметь соединение. При создании приложения клиента он должен заргистрировать себя на сервере, мол я тоже буду играть. Сервер должен его занести в свой список и в случае чего, вызывать его методы. Т.е., есть один серверный объект, активируемый на сервере, и много клиентских объектов (по одному на каждого клиента), активируемых на клиенте. Вот ссылки на эти клиентские объекты и должен хранить серверный объект.

Код

class GameManager: MarshalByRefObject
    {
        public void RegisterPlayer(Player pl) 
        {
            .. //заносим в массив игрока (этот метод будет вызываться на клиенте, а выполняться на сервере)

        }

        public void MoveAllPlayers() 
        {
              ..
             //перебираем массив и вызываем метод Move всех Player's
        }
    }


Код

 class Player : MarshalByRefObject
    {
        public PlayerInfo PlayerInfo;

        public Player(string name)
        {
            PlayerInfo.Name = Name;
            PlayerInfo.Top = 100;
            PlayerInfo.Left = 100;
            PlayerInfo.Height = 100;
            PlayerInfo.Width = 100;
            PlayerInfo.BackColor = Color.Red;

            //((GameApp)gameApp).InvokeMember(dlg);
        }
        string _Name;
        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }
         public void Move(Point coords)
         {
               //этот метод может вызваться с сервера (но выполняться на клиенте) и перемещать игрока
         }
}


Но во время вызова функции вылетает ошибка:
Because of security restrictions, the type System.Runtime.Remoting.ObjRef cannot be accessed.
           
Код

GameManager gm = (GameManager)Activator.GetObject(typeof(GameManager), "tcp://10.5.2.45:7777/RemoteTimeHost/rt");
            RemotingConfiguration.RegisterActivatedClientType(typeof(Player), "tcp://10.5.2.45:7777");
            Player pl = new Player("sfs");
            gm.RegisterPlayer(pl);..вот тут вылетает експешн

Я так понимаю, что косяк в том, что я передаю в кач-ве параметра объект, наследованный от MarshalByRefObject. Ну а как тогда быть? Сереализовать его мне не имеет смысла, он должен управлять клиентом.

Автор: MaxWave 16.12.2008, 14:01
Короче делаем так, как написано http://www.codeproject.com/KB/IP/pathremotingarticle.aspx, и радуемся жизни. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)