kurukuru-papaのブログ

主に、ソフトウェア開発に関連したメモを書き溜めたいと思います。

.NETリモーティング(IPC版)サーバ

(続きです)

サーバ側の実装です。ServerForm_Loadメソッドで、チャネル作成、イベント登録をしています。チャネルは"ipc://myserver/mymessage"という名前で登録しています。クライアントから通信があると、OnCalledメソッドが呼ばれます。
チャネルの名前は、もし既に同じ名前で起動しているサーバが存在すると、エラーが発生しました。
複数クライアントから同時に通信があると、OnCalledメソッドが各クライアントごとに呼ばれ、並列処理をしているようです。

    public partial class ServerForm : Form
    {
        public ServerForm()
        {
            InitializeComponent();
        }

        private void ServerForm_Load(object sender, EventArgs e)
        {
            // サーバチャネル作成
            // System.Runtime.Remotingを参照設定に追加しておくこと
            // 1プロセスに1つのみ作成可能
            IpcServerChannel serverChannel = new IpcServerChannel("myserver");
            ChannelServices.RegisterChannel(serverChannel, true);

            // イベントを登録
            // 暗黙的に上記で作成したチャネルに登録される
            MyMessage myMessage = new MyMessage();
            myMessage.callEvent += OnCalled;
            RemotingServices.Marshal(myMessage, "mymessage", typeof(MyMessage));
        }

        private MyResponse OnCalled(MyRequest request)
        {
            // リクエストを取得
            tbRequest.Text += request.data + "\r\n";

            // レスポンスを設定
            MyResponse response = new MyResponse();
            response.data = string.Format(tbResponse.Text, request.data);

            // 複数クライアントからの同時アクセスを確認するためスリープ
            Thread.Sleep(Convert.ToInt32(numTime.Value) * 1000);

            return response;
        }

        private void btnClear_Click(object sender, EventArgs e)
        {
            tbRequest.Text = string.Empty;
        }
    }