.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!");
}