免费国产网站_秋霞午夜一区二区三区视频_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!!

    主站蜘蛛池模板: 香港经典a毛片免费观看hd_亚洲美女高潮久久久_亚洲精品无码成人_亚洲激情四射_永久免费无码网站在线观看个_亚洲图片日本V视频免费 | 亚洲va天堂va欧美ⅴ_韩国一级毛片视频_久久三级毛片_日韩欧美亚洲一区二区三区_影音先锋狠狠操_少妇下面好紧好多水真爽播放 | 疾速追杀4在线观看完整免费高清_国产精品拍国产拍拍偷剧情_超碰911_日本肉体xxxx裸体137大胆_欧美牲交A欧美牲交AⅤ免费真_看了又看第二部免费观看 | 青天衙门第一部_97超碰人人_丁香花在线观看免费观看图片_欧美日韩精品SUV_国产夜夜操_九九视频在线免费观看 | 91高清国产_中国少妇XXXX做受_欧美日韩综合精品码视频_国产成人久久久久_18成禁人视频免费_国产欧美日韩中文字幕在线 | 在线观看视频免费区_黑人又大又粗又长进去很舒服_免费无码久久成人网站_黄色成人在线网站_国产精品爆乳在线播放第一人称_尤物99国产成人精品视频 | 亚洲日韩精品无码专区_国产精品不卡顿_国产精品人妖ts系列视频_亚洲AV成人网站在线观看_www.国产福利_亚洲一区高清视频 | 亚洲精品国产精品无码国模_免费在线黄色片_99久久人妻精品免费一区_国产AV无码久久精品_亚洲欧美日韩国产制服另类_成人1区 | 91高清国产_中国少妇XXXX做受_欧美日韩综合精品码视频_国产成人久久久久_18成禁人视频免费_国产欧美日韩中文字幕在线 | 国产精品亚洲一区二区在线观看_免费久久精品国产片_亚洲色图第四色_在线观看中文字幕不卡有码_无码人妻久久一区二区三区免费丨_99久久精品毛片免费播放 | 91成人免费看_我要看国产一级片_日本av免费观看_国产91色在线免费_97久久精品亚洲中文字幕无码_视频福利网 | 91风间由美一区二区三区四区_日韩黄色片视频_亚洲AV日韩AV高潮喷无码_av资源免费看_中文无码伦AV中文字幕在线_A三级三级成人网站在线视频 | 女生裸体视频网站在线观看_www亚洲视频_午夜在线观看免费_99国产在线_久久久精品免费观看_久久这里只有精品1 | 小小拗女性BBWXXXX国产_欧美日本亚洲_免费福利网站在线观看_日本成人片在线_激情综合激情五月俺也去_欧美另类精品XXXX人妖 | 在线观看国产网址你懂的_最新日韩精品在线观看_午夜性色福利免费视频在线播放_亚洲一二区精品_樱花草在线观看播放免费视频_av高清免费在线观看 | 一区二区三区视频在线播放_五月婷婷久久综合_久久色成人在线_AV激情亚洲男人的天堂国语_草草CCYY免费看片线路_皇上从小侵犯双性太子NP高H | 成人高清网站_91精品激情在线观看最新更新_yy111111少妇影院中文字幕_18禁黄网站网址免费_国产一区二区内射最近更新_国产日韩一二三区 久久久免费毛片_色先锋资源久久综合5566_91视频久久_国产精品自拍99_一级毛片欧美真人视频_亚洲欧美日韩中文无线码 | 香蕉视频日本_欧美性综合_搞av中文字幕_性大毛片免费视频_日本在线观看黄色_国产在线观看超清无码视频一区二区 | 久久五月丁香中文字幕_日本伦理一区二区_台湾成人在线_91视频在线播放视频_男插女视频免费观看_午夜欧美激情三级亚洲美女操 | 6080yy免费毛片_超碰天天爽_免费毛片视频_91精品国产九九九久久久亚洲_国产xxxxx在线观看免费_天天综合久久综合 | 一级视频网_92少妇精品免费视频_精彩久久_四虎影院中文字幕_久久久久成人免费视频_美女网站久久 | 国产免费黄片和v片_国产成人二区_中文字幕日韩视频_少妇又色又紧又爽又刺激视频_偷拍做爰吃奶视频免费看_华人91视频 | 东京热AV人妻无码A片_色九月婷婷_九色视频官网_日本a区_婷婷久久香蕉五月综合_曰本色黄a大片免费 | 九九视频网_久久国产日本_男人的天堂色欲网HTTP_亚洲大尺度专区无码浪潮AV_亚洲欧美日韩国产综合一区二区_欧美日韩视频无码一区二区三 | 精品人妻伦一品二品三品免费视频_国产精品久免费的黄网站_精品国产综合成人亚洲区2022_欧美日韩亚洲精品瑜伽裤_在线看片毛片无码永久免费_日本中文字幕在线观看视频 | 757福利视频_另类武侠第1页777wh_国产精品996_久久精品国产亚洲一区二区三区_91国视频_欧美噜噜久久久xxx成人高潮 | 97久久婷婷五月综合色D啪蜜芽_成人18免费观看的动漫_国产精品乱码一区二区三区图片_久青草视频在线观看_婷婷四房色播_日韩精品视频第一页 | 一级片欧美_天美传媒国色天香乱码_久久视频这里只精品6国产_一级美女大片_曰韩免费无码AV一区二区_国产综合精品在线 | 名器高h禁伦桌上肉伦h_精品国免费一区二区三区_欧美性猛交xxxx乱大交极品_精品在线视频免费观看_他扒开我小泬添我视频_国产色XX群视频射精 | 国产偷自一区二区三区_91久久婷婷国产一区二区三区_免费国产不卡一级αⅴ片_国产精品偷伦精品视频_免费网站色_色综合久久久久综合一本到桃花网 | 看毛片看毛片_亚洲午夜精品久久久久久浪潮_欧美在线www_中年好声音3粤语免费观看_久久久久久久久久久视频_高清在线视频 | 在线成人精品视频_99热在线精品免费_6699私人影院_日韩福利网站_亚洲av无码一区二区二三区我_久久久精品456亚洲影院 | 亚洲成人免费在线播放_99久久精品久久久久久清纯_国产火热热av_国语FREE性XXXXXHD_麻豆av在线免费观看_欧美极品在线视频 | 69久久夜色精品国产69xj_亚洲欧美乱日韩乱国产_亚洲国产精品无码_日韩三级免费观看_久久久久亚洲视频_四虎最新网站 | 天堂网www中文天堂在线_av图区_丝袜人妻一区二区三区网站_日中文字幕在线_狠狠爱一区_露脸叫床粗话东北少妇 | v片在线看_香蕉大伊亚洲人在线观看_久草精品国产_国产伊人久_80s国产成年女人毛片_97超碰caoporen公开人人爽 | 亚洲精品国产品国语在线_国产在线无码视频观看草草视频_在线天堂官网_美女毛片_在线永久看片免费的视频_中文日韩在线观看 | 国产在线精品一区二区不卡_国语对白清晰精彩_久久久99国产精品免费_日韩美毛片_亚洲av永久综合在线观看红杏_国产乱码日产乱码精品精 | 性久久久_91韩国_五月婷婷丁香花综合网_99国产精品99_精品久久日本影视一区_91av成年影院在线播放 | 男女黄色一级片_好吊妞这里只有精品_免费淫片aaaa级_高清不卡一区二区三区香蕉_五月天sese_美女视频黄频大全不卡视频在线播放 | 人人插人人爽_亚洲最新在线_国产精品黄页免费高清在线观看_天天天欲色欲色WWW免费_夜夜草免费视频_国产精品无码网站在线观看播放 |