Exemplo n.º 1
0
        private async Task ProcessChat(AspNetWebSocketContext context)
        {
            WebSocket socket = context.WebSocket;
            string    user   = "";

            try
            {
                var allkeys = context.QueryString.AllKeys.ToList();
                if (allkeys.Contains("username") && allkeys.Contains("token"))
                {
                    user = context.QueryString["username"];
                    var token = context.QueryString["token"];
                    var check = ATokenManager.Instance.OnCheckToken(user, token);
                    if (!check)
                    {
                        AOutput.Log("invalid token " + user + "/" + token);
                        return;
                    }

                    #region 用户添加连接池
                    //第一次open时,添加到连接池中
                    if (!CONNECT_POOL.ContainsKey(user))
                    {
                        CONNECT_POOL.Add(user, new UserWithToken()
                        {
                            connect = socket, username = user
                        });                                                           //不存在,添加
                    }
                    else if (socket != CONNECT_POOL[user].connect)                    //当前对象不一致,更新
                    {
                        CONNECT_POOL[user].DoCancelConnect();
                        CONNECT_POOL[user] = new UserWithToken()
                        {
                            connect = socket, username = user
                        };
                    }
                    #endregion

                    await DoSend(CONNECT_POOL[user], AWebServerUtils.OnGetJsonError("0"));
                }
                else
                {
                    AOutput.Log("invalid argument");
                    return;
                }

                await StartReceive(socket, user);
            }
            catch (Exception ex)
            {
                try
                {
                    AOutput.LogError("监听异常:" + ex.Message);
                    AOutput.LogError("异常堆栈:" + ex.StackTrace);
                }
                catch { }
            }
        }
    internal string GameHandler_Move(string arg)
    {
        if (LastMoveTime > 0 &&
            LastMoveTime >= ApiDateTime.SecondsFromBegin())
        {
            return(AWebServerUtils.OnGetJsonError(ErrorDefs.MoveInCold));
        }
        switch (arg)
        {
        case "up":
            if (!CheckCanMoveTo(0, -1))
            {
                return(AWebServerUtils.OnGetJsonError(ErrorDefs.InvalidMove));
            }
            MapY--;
            break;

        case "down":
            if (!CheckCanMoveTo(0, 1))
            {
                return(AWebServerUtils.OnGetJsonError(ErrorDefs.InvalidMove));
            }
            MapY++;
            break;

        case "left":
            if (!CheckCanMoveTo(-1))
            {
                return(AWebServerUtils.OnGetJsonError(ErrorDefs.InvalidMove));
            }
            MapX--;
            break;

        case "right":
            if (!CheckCanMoveTo(1))
            {
                return(AWebServerUtils.OnGetJsonError(ErrorDefs.InvalidMove));
            }
            MapX++;
            break;
        }
        LastMoveTime = ApiDateTime.SecondsFromBegin();

        var l = new List <string>();

        l.AddRange(new string[] { InfoNameDefs.MapX, MapX.ToString()
                                  , InfoNameDefs.MapY, MapY.ToString()
                                  , InfoNameDefs.LastMoveTime, LastMoveTime.ToString() });
        var monster = AMapManager.Instance.OnGetMonster(MapX, MapY);

        if (monster != null)
        {
            l.Add("m");
            l.Add(JsonConvert.SerializeObject(monster));
        }
        return(AWebServerUtils.OnGetJsonError(l.ToArray()));
    }
Exemplo n.º 3
0
        private async Task ProcessChat(AspNetWebSocketContext context)
        {
            WebSocket socket = context.WebSocket;
            string    user   = "";

            try
            {
                var allkeys = context.QueryString.AllKeys.ToList();
                if (allkeys.Contains("username") && allkeys.Contains("token"))
                {
                    user = context.QueryString["username"];
                    var token  = context.QueryString["token"];
                    var avatar = AWebServices.Avatar.OnGetAvatar(user, token);
                    if (avatar == null)
                    {
                        AOutput.Log("invalid token");
                        return;
                    }

                    #region 用户添加连接池
                    //第一次open时,添加到连接池中
                    if (!CONNECT_POOL.ContainsKey(user))
                    {
                        CONNECT_POOL.Add(user, new UserWithToken()
                        {
                            connect = socket
                        });                                                           //不存在,添加
                    }
                    else if (socket != CONNECT_POOL[user].connect)                    //当前对象不一致,更新
                    {
                        CONNECT_POOL[user].cancellationTokenSource.Cancel();
                        CONNECT_POOL[user] = new UserWithToken()
                        {
                            connect = socket
                        };
                    }
                    #endregion

                    await DoSend(CONNECT_POOL[user], AWebServerUtils.OnGetJsonError("0"));
                }
                else
                {
                    AOutput.Log("invalid argument");
                    return;
                }

                if (string.IsNullOrEmpty(user))
                {
                    return;
                }

                while (true)
                {
                    if (socket.State == WebSocketState.Open)
                    {
                        ArraySegment <byte>    buffer = new ArraySegment <byte>(new byte[1024]);
                        WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CONNECT_POOL[user].cancellationTokenSource.Token);

                        if (!CONNECT_POOL.ContainsKey(user) ||
                            CONNECT_POOL[user].connect != socket)
                        {
                            //已经被踢下线。
                            return;
                        }

                        #region 消息处理(字符截取、消息转发)
                        try
                        {
                            #region 关闭Socket处理,删除连接池
                            if (socket.State != WebSocketState.Open)                            //连接关闭
                            {
                                if (CONNECT_POOL.ContainsKey(user))
                                {
                                    CONNECT_POOL.Remove(user);                                                                //删除连接池
                                }
                                break;
                            }
                            #endregion

                            string userMsg = Encoding.UTF8.GetString(buffer.Array, 0, result.Count);                            //发送过来的消息
                            if (userMsg == "ping")
                            {
                                CONNECT_POOL[user].DoHeartBeat();
                                await DoSend(CONNECT_POOL[user], userMsg);
                            }
                            else
                            {
                                var amsg = userMsg.Split('?');
                                if (amsg[0] == "chat")
                                {
                                    AOutput.Log(user + " msg:" + userMsg);
                                    await DoChat(CONNECT_POOL[user], user, amsg[1]);
                                }
                            }
                        }
                        catch (Exception exs)
                        {
                            //消息转发异常处理,本次消息忽略 继续监听接下来的消息
                        }
                        #endregion
                    }
                    else
                    {
                        break;
                    }
                }                //while end
            }
            catch (Exception ex)
            {
                try
                {
                    AOutput.LogError("监听异常:" + ex.Message);
                    AOutput.LogError("异常堆栈:" + ex.StackTrace);
                }
                catch { }

                //整体异常处理
                if (!string.IsNullOrEmpty(user))
                {
                    if (CONNECT_POOL.ContainsKey(user))
                    {
                        CONNECT_POOL.Remove(user);
                    }
                }
            }
        }
 void SendDBError()
 {
     Context.Response.Write(AWebServerUtils.OnGetJsonError(ErrorDefs.DBError.ToString()));
 }
 void SendError(params string[] values)
 {
     Context.Response.Write(AWebServerUtils.OnGetJsonError(values));
 }
 void SendError(HttpResponse response, params string[] values)
 {
     response.Write(AWebServerUtils.OnGetJsonError(values));
 }