HTML5技术

谈一款MOBA类游戏《码神联盟》的服务端架构设计与实现 - 千年风雅丶(5)

字号+ 作者:H5之家 来源:H5之家 2017-07-23 10:01 我要评论( )

(1) 分配一个新的 SocketAsyncEventArgs 上下文对象,或者从应用程序池中获取一个空闲的此类对象。 (2) 将该上下文对象的属性设置为要执行的操作(例如,完成回调方法、数据缓冲区、缓冲区偏移量以及要传输的最


  (1)
分配一个新的 SocketAsyncEventArgs 上下文对象,或者从应用程序池中获取一个空闲的此类对象。
  (2)
将该上下文对象的属性设置为要执行的操作(例如,完成回调方法、数据缓冲区、缓冲区偏移量以及要传输的最大数据量)。
  (3)
调用适当的套接字方法 (xxxAsync) 以启动异步操作。
  (4)
如果异步套接字方法 (xxxAsync)
  (5)
如果异步套接字方法 (xxxAsync)
  (6)
将该上下文重用于另一个操作,将它放回到应用程序池中,或者将它丢弃。

  • SocketAsyncEventArgs.UserToken 属性
  •   获取或设置与此异步套接字操作关联的用户或应用程序对象。

      命名空间:   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); } } } }

  • 8.连接池UserTokenPool
  •  

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • createjs 小游戏开发实战 - beidan

      createjs 小游戏开发实战 - beidan

      2017-07-07 08:00

    • 前端实现连连看小游戏(1) - beidan

      前端实现连连看小游戏(1) - beidan

      2017-06-22 09:03

    • 网页版扫雷游戏 - 季末的寂寞

      网页版扫雷游戏 - 季末的寂寞

      2017-04-21 13:00

    • Html5游戏框架createJS组件--EaselJS - 叶超Luka

      Html5游戏框架createJS组件--EaselJS - 叶超Luka

      2017-03-22 12:01

    网友点评
    <