public TcpClient(string host, int port) { this.Host = host; this.Port = port; UserTokenSession Session = new UserTokenSession(); //初始化发送接套字 SendEventArgs SendEvent = new SendEventArgs(); SendEvent.Completed += AsyncDispatchCenter; SendEvent.UserToken = Session; SendEvent.SendAction = ProcessSend; //初始化接收接套字 ReceiveBuffer = new byte[BufferSize]; ReceiveEventArgs ReceiveEvent = new ReceiveEventArgs(); ReceiveEvent.Completed += AsyncDispatchCenter; ReceiveEvent.UserToken = Session; ReceiveEvent.ReceiveAction = ProcessReceive; Buffer.SetBuffer(ReceiveEvent, ReceiveBuffer); ShakeHandEvent = new ShakeHandEventArgs(ReceiveEvent, SendEvent); ShakeHandEvent.Completed += AsyncDispatchCenter; ShakeHandEvent.ConnectAction = StartConnect; Session.ShakeHandEvent = ShakeHandEvent; Session.Mode = ApplyMode.Client; ShakeHandEvent.UserToken = Session; }
/// <summary> /// 接收池 /// </summary> /// <param name="BufferSize"></param> /// <param name="PoolSize"></param> /// <param name="AcceptCompleted"></param> /// <param name="IOCompleted"></param> public ShakeHandEventArgsPool(int BufferSize, int PoolSize, EventHandler <SocketAsyncEventArgs> DispatchCenter) { ShakeHandPool = new ConcurrentStack <ShakeHandEventArgs>(); ReceiveBufferPool = new BufferPool(BufferSize, PoolSize); SendBufferPool = new BufferPool(BufferSize, PoolSize); for (int i = 0; i < PoolSize; i++) { UserTokenSession userToken = new UserTokenSession(); ReceiveEventArgs receiveEventArgs = new ReceiveEventArgs(); receiveEventArgs.UserToken = userToken; receiveEventArgs.Completed += DispatchCenter; Buffer.SetBuffer(receiveEventArgs, ReceiveBufferPool.Pop()); SendEventArgs senEventArgs = new SendEventArgs(); senEventArgs.UserToken = userToken; senEventArgs.Completed += DispatchCenter; Buffer.SetBuffer(senEventArgs, SendBufferPool.Pop()); ShakeHandEventArgs acceptEventArgs = new ShakeHandEventArgs(receiveEventArgs, senEventArgs); acceptEventArgs.Completed += DispatchCenter; acceptEventArgs.UserToken = userToken; ShakeHandPool.Push(acceptEventArgs); } }
void ProcessSend(SocketAsyncEventArgs e) { SendEventArgs eventArgs = (SendEventArgs)e; UserTokenSession UserToken = (UserTokenSession)eventArgs.UserToken; switch (eventArgs.SocketError) { //需要重新连接 case SocketError.ConnectionReset: UserToken.NoSuccessMessage.Enqueue(eventArgs.MemoryBuffer.ToArray()); StartConnect(); break; //成功就不需要任何操作了 case SocketError.Success: break; default: break; } }
/// <summary> /// 构造函数 /// </summary> /// <param name="ReceiveEventArgs">接收使用的接套字</param> /// <param name="SendEventArgs">发送使用的接套字</param> internal ShakeHandEventArgs(ReceiveEventArgs ReceiveEventArgs, SendEventArgs SendEventArgs) { this.ReceiveEventArgs = ReceiveEventArgs; this.SendEventArgs = SendEventArgs; }
void ProcessSend(SocketAsyncEventArgs e) { SendEventArgs eventArgs = (SendEventArgs)e; UserTokenSession UserToken = (UserTokenSession)eventArgs.UserToken; }