1. Unity IOCP Socket + ThreadSafe Queue
  2.  
  3. 1.Socket.BeginReceive系列接口在unityweb下是不正常的,页面刷新会导致问题
  4.  
  5. 2.自己维护线程,会带来一点小麻烦
  6.  
  7. 3.下面采用iocp+threadsafequeue 来实现异步网络
  8. ```
  9. public class UserToken
  10. {
  11. public Socket sock;
  12. public int offset;
  13. public byte[] buf;
  14. public bool isBody;
  15. public TQueue<byte[]> q; // threadsafe queue
  16.  
  17. public int Len {
  18. get {
  19. return buf.Length - offset;
  20. }
  21. }
  22. }
  23. ```
  24.  
  25. ```
  26. static void IO_Completed (object sender, SocketAsyncEventArgs e)
  27. {
  28. switch (e.LastOperation) {
  29. case SocketAsyncOperation.Connect:
  30. ProcessConnect (e);
  31. break;
  32.  
  33. case SocketAsyncOperation.Receive:
  34. ProcessReceive (e);
  35. break;
  36.  
  37. case SocketAsyncOperation.Send:
  38. ProcessSend (e);
  39. break;
  40. default:
  41. Debug.Log ("error: " + e.LastOperation);
  42. throw new Exception ("Invalid operation completed");
  43. }
  44. }
  45. ```
  46.  
  47. connect后进行receive
  48.  
  49. ```
  50. private static void ProcessConnect (SocketAsyncEventArgs e)
  51. {
  52. if (e.SocketError == SocketError.Success) {
  53. // Successfully connected to the server
  54. Debug.Log ("connect success");
  55.  
  56. var token = e.UserToken as UserToken;
  57. var sock = token.sock;
  58. var q = token.q;
  59.  
  60. e.UserToken = new UserToken{
  61. sock = sock,
  62. q = q,
  63. offset = 0,
  64. isBody = false,
  65. buf = new byte[4]
  66. };
  67.  
  68. var ut = (UserToken)e.UserToken;
  69. e.SetBuffer (ut.buf, ut.offset, ut.Len);
  70. bool willRaiseEvent = ut.sock.ReceiveAsync (e);
  71. if (!willRaiseEvent) {
  72. ProcessReceive (e);
  73. }
  74.  
  75. } else {
  76. throw new SocketException ((int)e.SocketError);
  77. }
  78. }
  79. ```
  80.  
  81. 使用线程安全的队列接收receive的数据
  82.  
  83. ```
  84. ut.q.Enqueue (ut.buf);
  85. ```

  

Unity 异步网络方案 IOCP Socket + ThreadSafe Queue的更多相关文章

  1. iOS 多个异步网络请求全部返回后再执行具体逻辑的方法

    对于dispatch多个异步操作后的同步方法,以前只看过dispatch_group_async,看看这个方法的说明: * @discussion * Submits a block to a dis ...

  2. 事件驱动之Twsited异步网络框架

    在这之前先了解下什么是事件驱动编程 传统的编程是如下线性模式的: 开始--->代码块A--->代码块B--->代码块C--->代码块D--->......--->结 ...

  3. Unity原生渲染方案

    Unity原生渲染方案 作者:3dimensions three_dimensions@live.cn 本文为原创内容,转载请注明出处. 做这个的动机是想在原生代码中使用Unity的材质系统绘制,同时 ...

  4. Python自动化运维之15、网络编程之socket、socketserver、select、twisted

    一.TCP/IP相关知识 TCP/UDP提供进程地址,两个协议互不干扰的独自的协议       TCP :Transmission Control Protocol 传输控制协议,面向连接的协议,通信 ...

  5. 浅谈K8S cni和网络方案

    此文已由作者黄扬授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 在早先的k8s版本中,kubelet代码里提供了networkPlugin,networkPlugin是一组接 ...

  6. u3d局域网游戏网络(c# socket select 模型)——续

    原文:http://www.cnblogs.com/saucerman/p/5555793.html 因为项目要加语音.语音数据都非常大.所以顺带就把之前写的网络模块一起测试了. 然后发现了一些bug ...

  7. u3d局域网游戏网络(c# socket select 模型)

    之前写了一篇. 发完之后第二天实际应用到游戏之后还是发现了一些小毛病. 比如网络模块有重复使用(多对象)的情况.所以将静态类该成了普通类. 比如安卓下会有些异常出现导致游戏逻辑不正常.所以网络相关的函 ...

  8. android内部培训视频_第四节(1)_异步网络操作

    第四节(1):异步网络操作  一.结合asyncTask下载网络图片 1.定义下载类,继承自asyncTask,参数分别为:String(url地址),Integer(刻度,本例没有用到),BitMa ...

  9. 理解Docker(6):若干企业生产环境中的容器网络方案

    本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

随机推荐

  1. Redis-数据操作

    数据操作 redis是key-value的数据,所以每个数据都是一个键值对 键的类型是字符串 值的类型分为五种: 字符串string 哈希hash 列表list 集合set 有序集合zset 数据操作 ...

  2. MongoDB-与Python交互

    与python交互 点击查看官方文档 安装python包 进入虚拟环境 sudo pip install pymongo 或源码安装 python setup.py 引入包pymongo import ...

  3. mongodb query index 分析

    query 的过程及分析: query 是通过Query planner选择最有效的查询plan ,为一个query 被给予一个可用的索引,查询时 query optimizer(最优的查询条件选择器 ...

  4. AVL模板

    感谢此博客 #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define de(x) cout &l ...

  5. Examining the Rooms - 第一类斯特灵数

    ---恢复内容开始--- 2017-08-10 20:32:37 writer:pprp 题意如下: Recently in Teddy's hometown there is a competiti ...

  6. maven项目中使用redis集群报错: java.lang.NumberFormatException: For input string: "7006@17006"

    Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [redis.client ...

  7. java将配置信息写在数据库(利用反射)

    Demo出处: 1. package com.fpx.pcs.prealert.process.xml.service.impl; public class CainiaoPushMessageSer ...

  8. codeforces208E Blood Cousins

    题目链接:codeforces208E 正解:$dsu$ $on$ $tree$ 解题报告: 又是一波$dsu$ $on$ $tree$咯… $p$级$cousin$其实就是对于$x$的$p$级祖先统 ...

  9. keepalived与nginx安装

    目的: 当用户请求访问时,会通过nginx来访问web服务应用,因此我们必须要保证nginx的高可用,要保证nginx的高可用,我们需要通过keepalived来监控nginx,并对外提供1个虚拟的v ...

  10. winform无边框窗体点击任务栏最小化

    protected override CreateParams CreateParams { get { const int WS_MINIMIZEBOX = 0x00020000; // Winus ...