/// <summary>
        /// WebSocket接続を現在の設定から接続する。
        /// </summary>
        /// <returns>処理状態。</returns>
        private IObservable <Unit> Reconnect()
        {
            return(Observable.Defer(() =>
            {
                try
                {
                    // 既に接続済みの場合は一旦終了する
                    this.Close();

                    // 接続を確立し、リクエスト受け取り用の処理を登録
                    var conn = new WebSocketRpcConnection(this.url);
                    conn.Connect();
                    conn.RequestHandler = this.Receive;

                    // 自動的にログインAPIも呼ぶ
                    return conn.Call("login", new Dictionary <string, object>()
                    {
                        { "id", this.playerId },
                        { "token", this.token },
                    }).Select(_ =>
                    {
                        // 確立したコネクションを保存
                        // TODO: OnCloseイベントなどに、コネクションエラー時の再接続を登録する
                        this.conn = conn;
                        return Unit.Default;
                    });
                }
                catch (Exception e)
                {
                    return Observable.Throw <Unit>(e);
                }
            }));
        }
        /// <summary>
        /// WebSocket接続を終了する。
        /// </summary>
        public void Close()
        {
            var conn = this.conn;

            if (conn != null)
            {
                this.conn = null;
                conn.Close();
            }
        }
        /// <summary>
        /// JSON-RPC2リクエストを受け取る。
        /// </summary>
        /// <param name="method">メソッド名。</param>
        /// <param name="param">引数。</param>
        /// <param name="id">ID。</param>
        /// <param name="conn">リクエストを受け取ったコネクション。</param>
        /// <returns>メソッドの戻り値。</returns>
        private async Task <object> Receive(string method, object param, object id, WebSocketRpcConnection conn)
        {
            // 登録されているメソッドを実行する
            WebSocketRpcConnection.RequestHandlerDelegate func;
            if (!this.Methods.TryGetValue(method, out func))
            {
                throw new JsonRpc2Exception(JsonRpc2Exception.ErrorCode.MethodNotFound);
            }

            return(await func(method, param, id, conn));
        }