예제 #1
0
        private UserToken GetClientInfo(string remoteEndPoint)
        {
            Socket sk = GetClientSocket(remoteEndPoint);

            if (sk == null)
            {
                return(null);
            }
            UserToken ci;

            ClientInfosDic.TryGetValue(sk, out ci);
            return(ci);
        }
예제 #2
0
        private void NewClientAccept(object oClientSocket)
        {
            Socket clientSocket = oClientSocket as Socket;

            try
            {
                UserToken userToken = UserToken.Pop();
                if (ClientInfosDic.TryAdd(clientSocket, userToken) && ClientSocketsDic.TryAdd(clientSocket.RemoteEndPoint + "", clientSocket))
                {
                    eShowMsg?.Invoke($"客户端上线,RemoteEndPoint:{clientSocket.RemoteEndPoint}");
                    userToken.socket          = clientSocket;
                    userToken.LastWorkingTime = DateTime.Now;
                    if (userToken.ReciveArgs == null)
                    {
                        userToken.ReciveArgs            = new SocketAsyncEventArgs();
                        userToken.ReciveArgs.Completed += ReciveArgs_Completed;
                        userToken.ReciveHandler.server  = this;
                        if (_HandlePackage == null)
                        {
                            _HandlePackage = new Action <TcpServerSocket, string, byte[]>((sender, remoteEndPoint, msg) =>
                            {
                                HandleMessage.Invoke(sender, remoteEndPoint, msg);
                            });
                        }
                        userToken.ReciveHandler.HandlePackage      = _HandlePackage;
                        userToken.ReciveHandler.dicSendedMessages  = dicSendedPackages;
                        userToken.ReciveHandler.dicRevivedMessages = dicRevivedPackages;
                        userToken.ReciveHandler.ClientSocketDic    = ClientInfosDic;
                        userToken.ReciveArgs.UserToken             = userToken;
                    }

                    userToken.ReciveHandler.clientSocket = clientSocket;
                    userToken.ReciveHandler.Start();
                    byte[] data = new byte[ReciveBufferSize];
                    userToken.ReciveArgs.SetBuffer(data, 0, data.Length);
                    userToken.ReciveArgs.AcceptSocket = clientSocket;
                    clientSocket.ReceiveAsync(userToken.ReciveArgs);
                }
                else
                {
                    DisposeClient(clientSocket, "加入客户端队列失败!");
                }
            }
            catch (Exception err)
            {
                DisposeClient(clientSocket, err.Message);
                OnError?.Invoke(this, err);
            }
        }
예제 #3
0
 private void DisposeClient(Socket worksocket, string message)
 {
     if (worksocket == null)
     {
         return;
     }
     message = "断开连接:" + message;
     try
     {
         UserToken ci = null;
         if (ClientInfosDic.TryRemove(worksocket, out ci) && ci != null)
         {
             eShowMsg?.Invoke($"{message},{ci?.RemoteEndPoint}");
             ci?.ReciveHandler?.Stop();
             UserToken.Push(ci);
             ClientSocketsDic.TryRemove(ci.RemoteEndPoint, out worksocket);
         }
         else
         {
             try
             {
                 eShowMsg?.Invoke($"{message},{worksocket?.RemoteEndPoint}");
             }
             catch
             {
                 eShowMsg?.Invoke($"{message},{worksocket}");
             }
         }
         GC.Collect();
         //worksocket.Shutdown(SocketShutdown.Both);
         worksocket?.Close();
         worksocket?.Dispose();
     }
     catch (Exception err)
     {
         OnError?.Invoke(this, err);
     }
 }