Exemple #1
0
        internal void Disconnect(string message)
        {
            this.Asyn = null;
            Stream.Flush();
            IsDisconnect       = true;
            DisconnectDateTime = DateTime.Now;

            if (AsyncCallDict != null)
            {
                AsyncCallDict.Clear();
            }

            if (CallBackDict != null)
            {
                foreach (var item in CallBackDict.Values)
                {
                    var disconn = GetExceptionResult("Disconnect", (int)ErrorTag.Disconnect, item.Id);
                    disconn.Arguments = new List <byte[]>();
                    item.SetRes(disconn);
                }


                CallBackDict.Clear();
            }

            UserDisconnect?.Invoke(this, message);
            UserDisconnect = null;
        }
Exemple #2
0
        internal bool CheckTimeOut()
        {
            if (CallBackDict == null || CallBackDict.Count == 0)
            {
                return(false);
            }
            else
            {
                var res = AsyncWaitTimeOut.FindAll(p => p.Value < DateTime.Now);

                if (res.Count == 0)
                {
                    return(false);
                }
                else
                {
                    foreach (var item in res)
                    {
                        long id = item.Key;
                        if (CallBackDict.ContainsKey(id))
                        {
                            if (CallBackDict.TryRemove(id, out AsyncCalls value))
                            {
                                Task.Run(() =>
                                {
                                    var timeout = GetExceptionResult("Server call client time out", (int)ErrorTag.TimeOut, id);

                                    try
                                    {
                                        value.SetRes(timeout);
                                    }
                                    catch (Exception er)
                                    {
                                        if (PushException(new SetResultException(er.Message, (int)ErrorTag.SetErr, er)))
                                        {
                                            Log.Error($"CMD:{value.Cmd} Id:{value.Id} ERROR:\r\n{er.Message}");
                                        }
                                    }
                                });
                            }
                        }

                        AsyncWaitTimeOut.Remove(item);
                    }

                    return(true);
                }
            }
        }
Exemple #3
0
        internal void AddAsyncCallBack(AsyncCalls asyncalls, long id)
        {
            if (CallBackDict == null)
            {
                CallBackDict = new ConcurrentDictionary <long, AsyncCalls>();
            }

            CallBackDict.AddOrUpdate(id, asyncalls, (a, b) => asyncalls);

            if (asyncalls.CurrentServer.IsCheckReadTimeOut)
            {
                KeyValuePair <long, DateTime> tot = new KeyValuePair <long, DateTime>(id, DateTime.Now.AddMilliseconds(asyncalls.CurrentServer.ReadOutTimeMilliseconds));
                AsyncWaitTimeOut.Add(tot);
            }
        }
Exemple #4
0
        private void DataOn(byte[] data)
        {
            ReadBytes read = null;

            if (CurrentServer.DecodeingHandler != null)
            {
                read = new ReadBytes(data, 4, -1, CurrentServer.DecodeingHandler);
            }
            else
            {
                read = new ReadBytes(data);
            }


            if (read.ReadInt32(out int length) && read.ReadInt32(out int cmd) && read.Length == length)
            {
                switch (cmd)
                {
                case CmdDef.CallCmd:
                {
                    CallPack call = new CallPack();

                    try
                    {
                        call.Id        = read.ReadInt64();
                        call.CmdTag    = read.ReadInt32();
                        call.Arguments = new List <byte[]>();
                        var lengt = read.ReadInt32();
                        for (int i = 0; i < lengt; i++)
                        {
                            call.Arguments.Add(read.ReadByteArray());
                        }

                        CallPackRun(call);
                    }
                    catch (Exception er)
                    {
                        if (PushException(new CallException(er.Message, (int)ErrorTag.CallErr, er)))
                        {
                            Log.Error($"CMD:{call.CmdTag} Error:\r\n{er}");
                        }
                    }
                }
                break;

                case CmdDef.ReturnResult:
                {
                    Result result = new Result
                    {
                        Id      = read.ReadInt64(),
                        ErrorId = read.ReadInt32()
                    };
                    byte[] strdata = read.ReadByteArray();
                    if (strdata.Length > 0)
                    {
                        result.ErrorMsg = Encoding.UTF8.GetString(strdata);
                    }
                    var arglengt = read.ReadInt32();
                    for (int i = 0; i < arglengt; i++)
                    {
                        result.Arguments.Add(read.ReadByteArray());
                    }

                    if (CallBackDict.ContainsKey(result.Id))
                    {
                        if (CallBackDict.TryRemove(result.Id, out AsyncCalls call))
                        {
                            try
                            {
                                call.SetRes(result);
                            }
                            catch (Exception er)
                            {
                                var ermsg = $"Cmd:{call.Cmd} Error:\r\n {er}";

                                if (PushException(new CallException(ermsg, (int)ErrorTag.CallErr, er)))
                                {
                                    Log.Error(ermsg);
                                }
                            }
                        }
                    }
                }
                break;
                }
            }
        }