2

.NET Remoting を使用してマルチプレイヤー ゲームを実装しています。クライアントはサーバーに接続し、ゲームをプレイできます。ただし、接続等には問題ありません。クライアント側でイベントをサブスクライブしますが、イベントが発生しても何も起こりません。

サーバー側のネットワーク実装は次のようになります。

SetupTcpChannel();
RemotingConfiguration.RegisterWellKnownServiceType(typeof(GamePlay),
"MyGame.soap", WellKnownObjectMode.Singleton);
RemotingConfiguration.CustomErrorsEnabled(false);

クライアント側:

SetupTcpChannel();
var myGame = (IGamePlay)Activator.GetObject(typeof(IGamePlay), "tcp://localhost:13101/MyGame.soap");

private void SetupTcpChannel()
{
    // Creating a custom formatter for a TcpChannel sink chain.
    BinaryServerFormatterSinkProvider server_provider = new         BinaryServerFormatterSinkProvider();
    server_provider.TypeFilterLevel = Formatters.TypeFilterLevel.Full;

    BinaryClientFormatterSinkProvider client_provider = new BinaryClientFormatterSinkProvider();

    // Creating the IDictionary to instantiate the channel with custom sinkprovider
    IDictionary properties = new Hashtable();

    properties["port"] = "0"; //let the system choose the portnumber to prevent double portnumbers with multiple clients

    // Pass the properties for the port setting and the server provider in the server chain argument. (Client remains null here.)
    TcpChannel channel = new TcpChannel(properties, client_provider, server_provider);
    ChannelServices.RegisterChannel(channel, false);
}

IGamePlay インターフェイスのデリゲートとイベント:

public delegate void getMessageDel();
event getMessageDel event_message;

GamePlay クラスの関数:

public void function() {
    if (event_game_started != null)
        event_game_started();
}

クライアント側でイベントをサブスクライブします。

myGame.event_game_is_over += new gameIsOverDel(myGame_event_game_is_over);
void myGame_event_game_is_over()
{
    MessageBox.Show("Game is over!");
}
4

0 に答える 0