(1)分配一个新的
SocketAsyncEventArgs 上下文对象,或者从应用程序池中获取一个空闲的此类对象。
(2)将该上下文对象的属性设置为要执行的操作(例如,完成回调方法、数据缓冲区、缓冲区偏移量以及要传输的最大数据量)。
(3)调用适当的套接字方法
(xxxAsync) 以启动异步操作。
(4)如果异步套接字方法 (xxxAsync)
(5)如果异步套接字方法 (xxxAsync)
(6)将该上下文重用于另一个操作,将它放回到应用程序池中,或者将它丢弃。
获取或设置与此异步套接字操作关联的用户或应用程序对象。
命名空间: System.Net.Sockets
public object UserToken { get; set; }
备注:
UserToken类的完整实现代码如下,可以结合代码注释加以理解:
using System; using System.Collections.Generic; using System.Linq; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace NetFrame { 用户连接信息对象 UserToken { 用户连接 Socket conn; SocketAsyncEventArgs receiveSAEA; SocketAsyncEventArgs sendSAEA; public LengthEncode LE; public LengthDecode LD; public encode encode; public decode decode; SendProcess(SocketAsyncEventArgs e); public SendProcess sendProcess; CloseProcess(UserToken token, string error); public CloseProcess closeProcess; public AbsHandlerCenter center; List<byte> cache = new List<byte>(); private bool isReading = false; private bool isWriting = false; Queue<byte[]> writeQueue = new Queue<byte[]>(); public UserToken() { receiveSAEA = new SocketAsyncEventArgs(); sendSAEA = new SocketAsyncEventArgs(); receiveSAEA.UserToken = this; sendSAEA.UserToken = this; //设置接收对象的缓冲区大小 receiveSAEA.SetBuffer(new byte[1024], 0, 1024); } receive(byte[] buff) { //将消息写入缓存 cache.AddRange(buff); if (!isReading) { isReading = true; onData(); } } onData() { [] buff = null; (LD != null) { buff = LD(ref cache); (buff == null) { isReading = false; return; } } else { (cache.Count == 0) { isReading = false; return; } buff = cache.ToArray(); cache.Clear(); } (decode == ); } message = decode(buff); //TODO 通知应用层 有消息到达 center.MessageReceive(this, message); //尾递归 防止在消息处理过程中 有其他消息到达而没有经过处理 onData(); } public void write(byte[] value) { if (conn == null) { //此连接已经断开了 closeProcess(); return; } writeQueue.Enqueue(value); if (!isWriting) { isWriting = true; onWrite(); } } public void onWrite() { (writeQueue.Count == 0) { isWriting = false; return; } [] buff = writeQueue.Dequeue(); //设置消息发送异步对象的发送数据缓冲区数据 sendSAEA.SetBuffer(buff, 0, buff.Length); result = conn.SendAsync(sendSAEA); (!result) { sendProcess(sendSAEA); } } public void writed() { //与onData尾递归同理 onWrite(); } public void Close() { try { writeQueue.Clear(); cache.Clear(); isReading = false; isWriting = false; conn.Shutdown(SocketShutdown.Both); conn.Close(); conn = null; } catch (Exception e) { Console.WriteLine(e.Message); } } } }