免费国产网站_秋霞午夜一区二区三区视频_99热在线看_日韩精品久久一区二区_午夜看一级毛片_天天鲁在视频在线观看

  • 您的位置:首頁 > 新聞動態 > 技術文章

    HOLOLENS的SOCKET網絡通訊1

    2019/5/23??????點擊:
    多數開發者開發Hololens的通信功能是先想到的是system.net.socket庫里的socket,發布UWP的時候就可能出問題,因為UWP對system庫不是完全的支持,很多方法或者類是沒有定義的(這是一個很常見的發布UWP的報錯)。本文用的system.net.socket里的SAEA系列,全稱:SocketAsyncEvnetArgs,這是微軟針對高并發而設計的一套API, SAEA是異步的socket參數,使用SAEA時需要注意三點:1.緩沖區  2.IP  3.完成后的回調,這三點是必要的,其次還有其他的SAEA參數,不是必要的,例如UserToken等,詳細可查API。
    using UnityEngine;
    using System.Net;
    using System.Net.Sockets;
    using System;
    using System.Text;
    //這個腳本是hololens端的SocketUDP腳本,提供發送方法,初始化并開啟接收方法
    public class MyUdpClient : MonoBehaviour
    {
        Socket socket; //目標socket
        //發送端口
        EndPoint serverEnd; 
        IPEndPoint ipEnd; 
        //接收端口
        IPEndPoint IPLocalPoint;
        //發送用的socket異步參數
        SocketAsyncEventArgs socketAsyceArgs;
        //接收用的socket異步參數
        SocketAsyncEventArgs reciveArgs;
        //接收SAEA用來接收的緩沖區
        byte[] reciveArgsBuffer;        
        //初始化
        void InitSocket()
        {
            //定義連接的服務器ip和端口,可以是本機ip,局域網,互聯網
            ipEnd = new IPEndPoint(IPAddress.Parse("10.100.172.226"), 8001);
            //初始化要接收的IP,IPAddress.Any表示接收所有IP地址發來的字節流
            IPLocalPoint = new IPEndPoint(IPAddress.Any, 8002);
            //初始化socket
            socket = new Socket(IPLocalPoint.AddressFamily, SocketType.Dgram, ProtocolType.Udp);  
            //定義服務端
            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            serverEnd = (EndPoint)sender;
            //初始化發送用的SAEA
            socketAsyceArgs = new SocketAsyncEventArgs();
            //設置發送用的SAEA的IP
            socketAsyceArgs.RemoteEndPoint = ipEnd;
            //初始化接收用的SAEA的緩沖區,此處我設為10K
            reciveArgsBuffer = new byte[1024 * 10];
            //初始化接收SAEA
            reciveArgs = new SocketAsyncEventArgs();
            //設置接收SAEA的接收IP地址
            reciveArgs.RemoteEndPoint = IPLocalPoint;
            //因為SAEA系列API 是異步方法,所以設置好完成方法后的回調
            reciveArgs.Completed += new EventHandler(CompletedRecive);
            //設置接收緩沖區
            reciveArgs.SetBuffer(reciveArgsBuffer, 0, reciveArgsBuffer.Length);
        }
        //異步方法完成后的complete時間
        private void CompletedRecive(object sender, SocketAsyncEventArgs e)
        {
            //通過SAEA.LastOperation這個枚舉來判斷完成的是什么方法,對應不同的操作
            switch (reciveArgs.LastOperation)
            {
                //因為reciveArgs是我專門用來接收的SAEA,所以這里只設置一個完成接收后用的方法
                case SocketAsyncOperation.ReceiveFrom:
                    PocessReceiveFrom(e);
                    break;       
            }
        }
        //中轉緩沖區,將數據拷貝出來給主線程用
        byte[] tempBytes;
        //用來通知主線程的參數
        bool isOk=false;
        //注意:處理這個方法是輔線程,不要用Unity的類,否則報錯,將收到的字節流拷貝出來,通知主線程來處理
        //接收完成后對應的處理方法
        public void PocessReceiveFrom(SocketAsyncEventArgs e)
        {
            if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success)
            {
                //這里會造成內存垃圾以及內存碎片化,如果頻繁的長時間的接收,建議做一個Byte池。
                tempBytes = new byte[e.BytesTransferred];     //將數據拷貝出來保證可以復用
                Array.Copy(e.Buffer, e.Offset, tempBytes, 0, tempBytes.Length);
                //通知主線程
                isOk = true;
            }
        }
        ////// 異步發送消息方法
        //////public void AsyncSend(byte[] bytes)
        {
            //設置緩沖區,緩沖區里是發送的字節流
            socketAsyceArgs.SetBuffer(bytes, 0, bytes.Length);
            //Debug.Log("socket異步參數字節流長度 " + socketAsyceArgs.Buffer.Length);
            bool bo = socket.SendToAsync(socketAsyceArgs);
            if (!bo)
            {
                //在hololens上發現過一段時間scoket就不會發送數據,*后這樣處理:判斷SentToAsync方法失敗后,就重新new一個SAEA,解決socket發送失敗的問題
                //注意初始化一個SAEA時,1.IP    2.緩沖區,3.完成后的回調事件  這三個都是必要的,
                socketAsyceArgs = new SocketAsyncEventArgs();
                socketAsyceArgs.RemoteEndPoint = ipEnd;
            }
        }
        //初始化socket并測試一下
        private void Start()
        {
            InitSocket();
            TestSocekt();
        }
        //用來測試socket的方法,發送一個信息
        void TestSocekt() {
            int tempInt = 9999;
            byte[] tempBytes;
     
            tempBytes=BitConverter.GetBytes(tempInt);
            AsyncSend(tempBytes);
        }
        private void Update()
        {
            if (isOk)
            {
                //對tempBytes進行處理
                int temp= BitConverter.ToInt32(tempBytes, 0);
                Debug.Log("接收socket,接收到了字節流,接收到的數字為 " + temp);
                isOk = false;
            }
        }
        //每隔一段時間就接受一下
        private void FixedUpdate()
        {
            socket.ReceiveFromAsync(reciveArgs);
        }
    }
    上面的代碼把接收模塊和發送模塊寫在一起,SAEA系列是異步的,所以使用起來對于多線程需要一些了解。
    一般的socket需求用上面的代碼足夠用的,由于上文中只有一個接收SAEA和一個發送SAEA,所以當一個SAEA在工作時,不要再讓這個SAEA工作。

    捷徑:后來發現在MixedRealTooklit里面有scoket組件,可以直接使用MRTK中Sharing文件夾中的組件,或者查看MRTK的源碼,里面是用Windows.Networking和Task寫的Socket,找了很長時間的SocketAPI,原來遠在天邊近在眼前,感嘆當時怎么不好好看看MRTK!!

    主站蜘蛛池模板: 狠狠亚洲婷婷综合色香五月_日本爱爱视频_3d动漫无码av禁在线无码_日韩精品无码久久久久久_国产专区在线_中文字幕在线免费观看 | 91精品91久久久久久_a在线一区_性迷宫在线播放_欧美在线视频一二三区_久久99精品国产自在现线_久久精品超碰 | 九九在线观看免费视频_色图自拍偷拍_日本无毛_国产成人综合亚洲亚洲国产第一页_超碰人人超碰_久久久久国产精品免费 | 看特级黄色片_动漫精品久久久_国产成人综合在线_国产精品白丝娇喘喷水_极品尤物一区_百性阁综合另类 | 国产欧美在线亚洲一区_亚洲精品手机在线_粉嫩高清一区二区三区_免费av资源网站_国产国拍精品_亚洲男人的天堂在线视频 | 日韩久久免费视频_日日操网站_美女的小泬泬流爱液视频_国产精品久久久久久久久免费高清_色91视频_av首页在线观看 | 久热最新_久色一区_无码男同a片在线观看_国产一起草_亚洲午夜国产精品无码中文字_中国黄色免费看 | av国语_天堂影音先锋在线观看_免费看麻豆视频_一区二区免费看_亚洲无日韩码精品_日本道二区视频 | 大地资源高清播放在线观看视频_亚洲乱码一区二区_青青草成人av_国产成人综合亚洲网站_亚洲AV色香蕉一区二区蜜桃小说_亚洲一区国产视频 | 亚洲国产精品t66y_亚洲中文无码一区二区三区在线观看_久久久久久久免费观看_日本a级片中文字幕_国产一级黄片_国产激情久久久久影院老熟女 | 日本五级片_久久久精品视频成人_国产又色又爽又黄刺激视频_国产女极品在线观看AV_欧美亚洲国产激情_97色免费视频 | 日韩无一区二区_我爱我色成人网_国产成人无码VA在线观看_国产情人综合久久777777_综合激情在线_成人小视频免费 | 99v久久综合狠狠综合久久_国产精品点击进入在线影院高清_色欲色香天天天综合网WWW_欧美首页_97精品久久久_亚洲精品美女视频 | 性无码一区二区三区在线观看_私人影院在线观看_男人插女人在线观看_亚洲精品图片_欧美性色黄大片www_久久99热精品免费观看 | 激情欧美一区二区免费视频_337P日本大胆欧美人视频_成人啪啪免费网站_中文字幕伊人_富二代精品视频_91精品国产麻豆91久久久久久 | 亚洲国产欧美日韩在线_不卡中文字幕在线5_亚洲国产精品视频在线观看_在病房里和护士啪啪_日本黄a_东北女人啪啪对白 | 亚洲国产精品成人一区二区在线_涩爱av蜜臀夜夜嗨av_中文字幕九区_亚洲一区二区三区在线影院_综合人妻久久一区二区精品_国产精品美女久久久 | 亚洲国产欧美日韩在线_不卡中文字幕在线5_亚洲国产精品视频在线观看_在病房里和护士啪啪_日本黄a_东北女人啪啪对白 | 人妻av无码专区_日本无删减版_天天干天天操天天插_中文字幕欧美日韩精品_亚洲tv久久爽久久爽_少妇裸体淫交视频免费看 | 日本强奷中文字幕在线播放_91直接看_亚洲一区二区四区蜜桃_亚洲精品国产精品乱码不卡_黄色一级视频免费看_国产小精品 | 亚洲肥熟_真实国产熟睡乱子伦视频_蜜桃AV麻豆AV果冻传媒_夜夜操夜夜操_欧美成人性之站_欧美日韩国产激情 | 性无码一区二区三区在线观看_私人影院在线观看_男人插女人在线观看_亚洲精品图片_欧美性色黄大片www_久久99热精品免费观看 | 在线观看视频免费区_黑人又大又粗又长进去很舒服_免费无码久久成人网站_黄色成人在线网站_国产精品爆乳在线播放第一人称_尤物99国产成人精品视频 | 在线人成免费视频69国产_亚洲精品一区二区四区_亚洲欧美日韩久久_大地资源第一在线_亚洲乱妇_免费观看视频在线播放 | 啊别插了视频高清在线观看_日韩GAY小鲜肉啪啪18禁_99国精产品一区二区三区a片_jzzijzzij亚洲乱熟无码_中文字幕日本视频_人和禽的性视频77777 | 给我免费播放片高清在线观看视频_电锯惊魂1在线观看免费观看中文版_欧美99久久无码一区人妻A片_又黄又湿免费高清视频_一区二区三区四区高清视频_亚洲欧美日韩精品a∨ | 高清av免费观看_日韩精品视频一区二区三区_国产高潮刺激叫喊视频_免费看A片久久久久久久久久_老年人品久久久无码中文字幕_777米奇色狠狠888俺也去 | 在线免费观看日韩_97夜夜澡人人爽人人喊91洗澡_www.成人在线观看_他揉捏她两乳不停呻吟人妻_成人免费淫片_嫩草嫩草嫩草嫩草 | 少妇做爰高潮呻吟A片免费_亚洲精品久久久久久首妖_国产日产精品一区二区三区四区功能_小明看看免费平台永久_国产精品毛片久久_色久综合网 | 草比av_日本理论片中文字幕_最新中文字幕av无码专区_国产精品99久久久久久夜夜嗨_久久人人爽人人爽人人av_性欧美在线观看 | 99久久精品免费看国产高清_一级录像片_91pro在线观看_99热久久精里都是精品6软件介绍_日韩三级中文字幕_日韩av在线第一页 | 97se亚洲综合自在线尤物_国产极品粉嫩正在播放软件特点_日本国产在线视频_国产一级一区二区_免费成人av_在线a亚洲v天堂网2019无码 | 97好色_玖草在线观看_国产a久久精品一区二区三区_国产精选自拍_国产三级精品视频_亚洲色图在线看 | 国产日韩欧美一二三区_欧美熟妇丰满XXXXX裸体艺术_97久久网站_丰满的少妇中文HD高清_草草影院在线观看视频_一本久久A久久免费精品不卡 | 国产在线观看免费A∨_亚洲中文字幕无码天然素人_四虎成人影院在线观看_日日夜夜艹_国产杨幂av在线播放_欧美性xxxx偷拍 | 日韩欧美精品一区二区_国产精品视频资源_伊人久久综合热线大杳蕉_18禁成人无遮羞网站免费_亚洲AV无码AV在线影院_丰满熟妇另类激情 | 99国产精品人妻噜啊噜_亚洲毛毛片_亚洲精品中文综合第一页_国产精品美女一区二区在线观看_欧美高清在线精品一区_99久久精品国产一区二区蜜芽 | 伊伊人成亚洲综合人网香_91视频天堂_久久avav_青草青视频在线观看_国产精品一区二区无码视频公司_日韩亚洲AV无码一区二区不卡 | 成人区人妻精品一熟女_欧美九九视频_91九色第一页_欧美老少配性行为_蜜臀久久99精品久久久无需会员_亚洲精品国产区 | 国产精品毛片在线_a级高清免费毛片av_欧美一极XXXXX_国产永久在线视频_99热这里只有精品免费观看_亚洲18色成人网站www | 成人春色www在线_久久调教_国产91综合网_日本VS中国VS亚洲看无码_给丰满丁字裤少妇按摩到高潮_操女人的网站 |