Unity 异步网络方案 IOCP Socket + ThreadSafe Queue
- Unity IOCP Socket + ThreadSafe Queue
- 1.Socket.BeginReceive系列接口在unityweb下是不正常的,页面刷新会导致问题
- 2.自己维护线程,会带来一点小麻烦
- 3.下面采用iocp+threadsafequeue 来实现异步网络
- ```
- public class UserToken
- {
- public Socket sock;
- public int offset;
- public byte[] buf;
- public bool isBody;
- public TQueue<byte[]> q; // threadsafe queue
- public int Len {
- get {
- return buf.Length - offset;
- }
- }
- }
- ```
- ```
- static void IO_Completed (object sender, SocketAsyncEventArgs e)
- {
- switch (e.LastOperation) {
- case SocketAsyncOperation.Connect:
- ProcessConnect (e);
- break;
- case SocketAsyncOperation.Receive:
- ProcessReceive (e);
- break;
- case SocketAsyncOperation.Send:
- ProcessSend (e);
- break;
- default:
- Debug.Log ("error: " + e.LastOperation);
- throw new Exception ("Invalid operation completed");
- }
- }
- ```
- connect后进行receive
- ```
- private static void ProcessConnect (SocketAsyncEventArgs e)
- {
- if (e.SocketError == SocketError.Success) {
- // Successfully connected to the server
- Debug.Log ("connect success");
- var token = e.UserToken as UserToken;
- var sock = token.sock;
- var q = token.q;
- e.UserToken = new UserToken{
- sock = sock,
- q = q,
- offset = 0,
- isBody = false,
- buf = new byte[4]
- };
- var ut = (UserToken)e.UserToken;
- e.SetBuffer (ut.buf, ut.offset, ut.Len);
- bool willRaiseEvent = ut.sock.ReceiveAsync (e);
- if (!willRaiseEvent) {
- ProcessReceive (e);
- }
- } else {
- throw new SocketException ((int)e.SocketError);
- }
- }
- ```
- 使用线程安全的队列接收receive的数据
- ```
- ut.q.Enqueue (ut.buf);
- ```
Unity 异步网络方案 IOCP Socket + ThreadSafe Queue的更多相关文章
- iOS 多个异步网络请求全部返回后再执行具体逻辑的方法
对于dispatch多个异步操作后的同步方法,以前只看过dispatch_group_async,看看这个方法的说明: * @discussion * Submits a block to a dis ...
- 事件驱动之Twsited异步网络框架
在这之前先了解下什么是事件驱动编程 传统的编程是如下线性模式的: 开始--->代码块A--->代码块B--->代码块C--->代码块D--->......--->结 ...
- Unity原生渲染方案
Unity原生渲染方案 作者:3dimensions three_dimensions@live.cn 本文为原创内容,转载请注明出处. 做这个的动机是想在原生代码中使用Unity的材质系统绘制,同时 ...
- Python自动化运维之15、网络编程之socket、socketserver、select、twisted
一.TCP/IP相关知识 TCP/UDP提供进程地址,两个协议互不干扰的独自的协议 TCP :Transmission Control Protocol 传输控制协议,面向连接的协议,通信 ...
- 浅谈K8S cni和网络方案
此文已由作者黄扬授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 在早先的k8s版本中,kubelet代码里提供了networkPlugin,networkPlugin是一组接 ...
- u3d局域网游戏网络(c# socket select 模型)——续
原文:http://www.cnblogs.com/saucerman/p/5555793.html 因为项目要加语音.语音数据都非常大.所以顺带就把之前写的网络模块一起测试了. 然后发现了一些bug ...
- u3d局域网游戏网络(c# socket select 模型)
之前写了一篇. 发完之后第二天实际应用到游戏之后还是发现了一些小毛病. 比如网络模块有重复使用(多对象)的情况.所以将静态类该成了普通类. 比如安卓下会有些异常出现导致游戏逻辑不正常.所以网络相关的函 ...
- android内部培训视频_第四节(1)_异步网络操作
第四节(1):异步网络操作 一.结合asyncTask下载网络图片 1.定义下载类,继承自asyncTask,参数分别为:String(url地址),Integer(刻度,本例没有用到),BitMa ...
- 理解Docker(6):若干企业生产环境中的容器网络方案
本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...
随机推荐
- Redis-数据操作
数据操作 redis是key-value的数据,所以每个数据都是一个键值对 键的类型是字符串 值的类型分为五种: 字符串string 哈希hash 列表list 集合set 有序集合zset 数据操作 ...
- MongoDB-与Python交互
与python交互 点击查看官方文档 安装python包 进入虚拟环境 sudo pip install pymongo 或源码安装 python setup.py 引入包pymongo import ...
- mongodb query index 分析
query 的过程及分析: query 是通过Query planner选择最有效的查询plan ,为一个query 被给予一个可用的索引,查询时 query optimizer(最优的查询条件选择器 ...
- AVL模板
感谢此博客 #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define de(x) cout &l ...
- Examining the Rooms - 第一类斯特灵数
---恢复内容开始--- 2017-08-10 20:32:37 writer:pprp 题意如下: Recently in Teddy's hometown there is a competiti ...
- maven项目中使用redis集群报错: java.lang.NumberFormatException: For input string: "7006@17006"
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [redis.client ...
- java将配置信息写在数据库(利用反射)
Demo出处: 1. package com.fpx.pcs.prealert.process.xml.service.impl; public class CainiaoPushMessageSer ...
- codeforces208E Blood Cousins
题目链接:codeforces208E 正解:$dsu$ $on$ $tree$ 解题报告: 又是一波$dsu$ $on$ $tree$咯… $p$级$cousin$其实就是对于$x$的$p$级祖先统 ...
- keepalived与nginx安装
目的: 当用户请求访问时,会通过nginx来访问web服务应用,因此我们必须要保证nginx的高可用,要保证nginx的高可用,我们需要通过keepalived来监控nginx,并对外提供1个虚拟的v ...
- winform无边框窗体点击任务栏最小化
protected override CreateParams CreateParams { get { const int WS_MINIMIZEBOX = 0x00020000; // Winus ...