private UserToken GetClientInfo(string remoteEndPoint) { Socket sk = GetClientSocket(remoteEndPoint); if (sk == null) { return(null); } UserToken ci; ClientInfosDic.TryGetValue(sk, out ci); return(ci); }
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); } }
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); } }