99国产欧美另娄久久久精品_国内自拍农村少妇在线观看_久久亚洲道色宗和久久_日本aⅴ大伊香蕉精品视频_亚洲国产欧美日韩欧美特级_日本视频免费在线观看

  • 您的位置:首頁 > 新聞動態 > Unity3D

    unity3d的網絡套接字SOCKET模塊使用

    2019/6/12??????點擊:

    使用方法簡單:
    1、新建一個空物體把NetWork掛載上,2、填上ip和prot,3、調用Connet方法;

    /*
    UNITY3D 網絡組件,它是單例模式。
     通過Network開啟和關閉網絡;
     消息訂閱器MsgEvent管理服務端發來的消息
     */
    using UnityEngine;
    using Assets.Scripts.Events;
    using Assets.Scripts.Util;
    using Assets.Scripts.Net;
    using System;
    
    public enum NetMsgType
    {
        ////// 新消息
        ///newMsg = -4,
        ////// 連接服務中斷
        ///interrupt = -3,
        ////// 請求錯誤
        ///error = -2,
        ////// 連接成功
        ///complete = -1,
        ////// 服務端握手響應
        ///state = 1
    }
    public class Network : MonoBehaviour
    {
        ////// 網絡消息廣播,當服務端有消息發來是通過它廣播
        ///public static readonly EventDispatchMsgEvent = new EventDispatch();
        public static bool IsConnet { get; private set; }
        public static bool IsActive { get; private set; }
        ////// 網絡組件實例
        ///public static Network Server { get; private set; }
    
        private SocketTcp socket;
        public string ip = "";
        public int prot;
        void Awake()
        {
            Server = this;
        }
        void Start()
        {
        }
        ////// 向服務端發送數據
        //////協議接口類型///預留///要發送的數據public void outCall(ushort type, ushort error, ByteArray data)
        {
            if (IsConnet)
            {
                socket.Send(type, error, data);
            }
        }
        public void Connet()
        {
            if (IsActive == false)
            {
                IsActive = true;
                socket = new SocketTcp(ip, prot);
                socket.AddListener(NetEvent.CONNETED, Conneted);
                socket.AddListener(NetEvent.CONNET_IOERROT, ConnetIOError);
                socket.AddListener(NetEvent.CONNET_ERROT, ConnetError);
                socket.AddListener(NetEvent.CONNET_MSG, MsgHandler);
    
                socket.Start();
            }
        }
        private void Conneted(EventData data)
        {
            IsConnet = true;
            MsgEvent.Dispatch(NetMsgType.complete);
        }
        void ConnetIOError(EventData data)
        {
            IsConnet = false;
            IsActive = false;
            MsgEvent.Dispatch(NetMsgType.error);
        }
        void ConnetError(EventData data)
        {
            IsConnet = false;
            IsActive = false;
            MsgEvent.Dispatch(NetMsgType.interrupt);
        }
        void MsgHandler(EventData data)
        {
            BucketItem msg = (BucketItem)data.data;
            msg.ByteArray.Position = 0;
            if (msg.Error > 0)
            {
                Debug.Log("網絡錯誤:" + msg.Error);
                return;
            }
            if (Enum.IsDefined(typeof(NetMsgType), msg.Type))
            {
                
                MsgEvent.Dispatch((NetMsgType)msg.Type, msg);
            }
            else
            {
                Debug.Log("未定義網絡消息:" + msg.Type);
            }
        }
        public void Disconnect()
        {
            IsConnet = false;
            IsActive = false;
            socket.RemoveListener(NetEvent.CONNETED, Conneted);
            socket.RemoveListener(NetEvent.CONNET_IOERROT, ConnetIOError);
            socket.RemoveListener(NetEvent.CONNET_ERROT, ConnetError);
            socket.RemoveListener(NetEvent.CONNET_MSG, MsgHandler);
            socket.Destroy();
            socket = null;
        }
        void FixedUpdate()
        {
    
        }
        void Update()
        {
            if (socket != null) socket.Updata();
        }
        //程序退出則關閉連接  
        void OnApplicationQuit()
        {
            if (socket != null) socket.Destroy();
        }
    }
    /*
     socketTcp封裝了一個輕量通信協議,以8個字節為頭部(整型):無符號4字節長度(包括頭部8字節)、消息類型無符號2字節、預留無符號2字節。
      使用異步方法兼容hololens的uwp平臺。消息類型自定義,協議的數據包格式在注釋有說。 */
    using Assets.Scripts.Events;
    using System;
    using System.Collections;
    using Assets.Scripts.Util;
    using UnityEngine;
    using System.Collections.Generic;
    #if !UWP
    using System.Net;
    using System.Net.Sockets;
    #else
    using Windows.Networking.Sockets;
    using Windows.Networking.Connectivity;
    using Windows.Networking;
    #endif
    namespace Assets.Scripts.Net
    {
        public enum NetEvent{
            ////// 連接建立
            ///CONNETED,
            ////// 請求連接服務器時發生錯誤
            ///CONNET_IOERROT,
            ////// 連接中斷
            ///CONNET_ERROT,
            ////// 收到消息
            ///CONNET_MSG
        }
        public class SocketTcp : EventDispatch{
            ////// 頭部字節
            ///public const int head_size = 8;
            ////// 是否使用小端
            ///public const bool IsLittleEndian = true;
            bool _activity = false;
            ////// 是否已啟用
            ///public bool Activity
            {
                get { return _activity; }
            }
            ////// 接受的消息,隊列
            ///private QueueMsgList;
            private QueuecodeMsg;
            public int port { get; private set; }
            public string ip { get; private set; }
            Socket socket;
            SocketAsyncEventArgs ReceiveSaea;
            SocketAsyncEventArgs sendSaea;
            byte[] sendData;
            ////// 允許單個數據包30720字節
            /// 
            ///const int RECV_LEN = 30720;
            byte[] recv_buf = new byte[RECV_LEN];
            Bucket bucket;
            bool socketState=false;
            public SocketTcp(string ip, int port)
            {
                this.port = port;
                this.ip = ip;
                bucket = new Bucket();
                codeMsg = new Queue();
                MsgList = new Queue();
            }
            private SocketAsyncEventArgs connetedSaea;
            ////// 發起鏈接請求
            /// 會調度CONNETED或CONNET_IOERROT事件
            ///public void Start()
            {
                if (socket==null)
                {
                    try
                    {
                        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                        connetedSaea = new SocketAsyncEventArgs();
                        connetedSaea.Completed += new EventHandler(connetedCall);//設置回調方法                                                                             
                        connetedSaea.RemoteEndPoint = new IPEndPoint(IPAddress.Parse(ip), port);    //設置遠端連接節點,一般用于接收消息
                        sendSaea = new SocketAsyncEventArgs();
                        //連接到服務器
                        socket.ConnectAsync(connetedSaea);
                    }
                    catch (Exception e)
                    {
                        Debug.Log(e);
                        Dispatch(NetEvent.CONNET_IOERROT);
                    }
                    
                }
            }
            private void connetedCall(object sender, SocketAsyncEventArgs e)
            {
                _activity = true;
                codeMsg.Enqueue(NetEvent.CONNETED);
                ReceiveSaea = new SocketAsyncEventArgs();
                ReceiveSaea.SetBuffer(recv_buf, 0, recv_buf.Length);//設置緩沖區
                ReceiveSaea.Completed += new EventHandler(ReceiveCall);//設置回調方法
                //codeMsg.Enqueue(1);
                //連接后開始從服務器讀取網絡消息
                socket.ReceiveAsync(ReceiveSaea);
            }
            int fragmentLen;
            byte[] fragment;
            ////// 回調讀取網絡數據、檢查是否斷線。
            /////////private void ReceiveCall(object sender, SocketAsyncEventArgs e)
            {
                fragmentLen = e.BytesTransferred;//調用這個函數來結束本次接收并返回接收到的數據長度。
                if (fragmentLen > 0)
                {
                    fragment = new byte[fragmentLen];
                    Array.Copy(recv_buf, 0, fragment, 0, fragmentLen);
                    Queuearr = bucket.Infuse(fragment);
                    while (arr.Count > 0)
                    {
                        MsgList.Enqueue(arr.Dequeue());
                    }
                    socket.ReceiveAsync(ReceiveSaea);
                }
                else
                {
                    ReceiveSaea.Dispose();
                    bucket.Reset();
                    socket.Shutdown(SocketShutdown.Receive);//這個函數用來關閉客戶端連接 
                    _activity = false;
                    socketState = true;
                    Debug.Log("中斷,關閉連接");
                    return;
                }
            }
            ////// 發送字節流
            //////public void Send(ushort type, ushort error, ByteArray data)
            {
                uint len = (uint)data.Length + head_size;
                //清空發送緩存  
                sendData = new byte[len];
                ByteHelp.WriteNumber(len, ref sendData, 0, IsLittleEndian);
                ByteHelp.WriteNumber(type, ref sendData, 4, IsLittleEndian);
                ByteHelp.WriteNumber(error, ref sendData, 6, IsLittleEndian);
                if (data.Length > 0)
                {
                    Array.Copy(data.Data, 0, sendData, head_size, data.Length);
                }
                //sendData.
                //數據類型轉換  
                //sendData = Encoding.ASCII.GetBytes(sendStr);
                //發送  
                sendSaea.SetBuffer(sendData, 0, sendData.Length);
                socket.SendAsync(sendSaea);
            }
            ////// 主線程每幀調用以拿取數據
            ///public void Updata()
            {
                while (codeMsg.Count > 0)
                {
                    Dispatch(codeMsg.Dequeue());
                }
                while (MsgList.Count > 0)
                {
                    Dispatch(NetEvent.CONNET_MSG, MsgList.Dequeue());
                }
                if (socketState)
                {
                    //Debug.Log("連接丟失,是否要重連");
                    socketState = false;
                    Dispatch(NetEvent.CONNET_ERROT);
                }
            }
            public void Destroy()
            {
                base.Dispose();
                //后關閉服務器  
                if (socket != null && socket.Connected)
                {
                    //this.socket.Disconnect(true);
                    //this.socket.Shutdown(SocketShutdown.Both);
                    //socket.Dispose();
                    socket.Shutdown(SocketShutdown.Receive);
                    socket.Shutdown(SocketShutdown.Send);
                    ReceiveSaea.Dispose();
                }
                bucket.Reset();
                MsgList.Clear();
                codeMsg.Clear();
                socketState = false;
                if (sendSaea != null) connetedSaea = null;
                if(sendSaea!=null) sendSaea.Dispose();
                sendSaea = null;
                if (_activity)
                {
                    _activity = false;
                }
            }
        }
    }
    主站蜘蛛池模板: avhd101素人diy入口_看全色黄大色黄女片爽名优_999视频精品_久久爱黑人激情av_红杏成人免费视频观看_GAY片男同网站WWW免费_久久精品99久久久久久2456_亚洲成人三区 | 狠色狠狠色狠狠狠色综合久久_蜜色欲多人AV久久无码_国产又色又爽又黄又免费软件_亚洲色大网站WWW永久网站_六十路高龄老熟女m_国产影视一区二区三区_曰本a级片_亚洲精品久久久中文字幕 | 偷拍亚洲综合_亚洲欧洲国产日韩_啦啦啦在线视频免费观看高清中文_夜夜骑综合_亚洲美女自拍视频_中日精品一色哟哟_老妇女色视频_99香蕉国产精品偷在线观看 | 久久www免费人成看片小草_国产卡一卡二卡乱码_噜啊噜在线成人A片观看_欧美一区3_欧美裸体XXXX_精品少妇一区二区三区在线视频_久草免费视_久久久国产成人一区二区 | 久久久久久综合岛国免费观看_精品国产乱码久久久软件使用方法_wwwwww日本_一边摸一边桶一边脱免费视频_黄色三级视屏_在线网址91_欧美成人乱码一二三四区_欧美一级无毛 | 亚洲av综合色区无码一区_成人国产精品入口免费视频_国产精品久久偷人妻_亚洲精品无码乱码成人_日日干干_久草片免费福利资源_少妇69xx_天天草草草 | 青青青国产依人在线_亚洲国产无色码在线播放_男女好痛好深好爽视频_亚洲欧美一区在线观看_天天爽天天狠久久久综合麻豆_日韩人妻无码喷潮中出_亚洲大香线伊人婷婷五月_天天夜天天操 | 国产99在线观看_亚洲欧洲日韩综合二区_jk美女啪啪_一级毛片私人影院_91大神精品在线_牛和人交videos欧美3d_hd法国xxxxhdvideos_免费看片的网址 | 免费成人av在线_日韩精品91爱爱_两个人免费高清视频WWW_日本妇人成熟免费视频_粉色视频在线免费观看_毛片视频软件_中文字幕永久在线播放_久久国产热这里只有精品 | 亚洲а∨天堂久久精品2021_99热6这里只有精品_欧美女优一区_韩国av一区二区三区四区_japanesexxxx日本妞_免费视频网站_91麻豆精品国产91久久久点播时间_欧美激情网 | 小嫩嫩12欧美_大地资源二中文在线观看官网_大菠萝福利视频_亚洲成人三级在线观看_久久韩日_国产成人女人在线视频观看_欧美精选视频_国产果冻豆传媒麻婆 | omofun动漫在线观看_亚洲无码自拍偷拍视频_国产精品综合二区_中文字幕区一区二_拍真实国产伦偷精品_狠狠操婷婷_www.avtvtv.com新网址_7799国产精品久久99 | 麻豆第一区mv免费观看网站_久久视频亚洲_亚洲成人欧美_国产精品免费一区二区三区观看_日本边添边摸边做边爱边_伦理片一区_美国一级大黄一片免费中文_污污污污污污污网站污 | 日本高清免费一本视频100禁_在线不卡欧美精品一区二区三区_国产一区二区好的精华液_中文综合在线_国产啊啊啊视频在线观看_大地资源网免费观看高清_亚洲精品永久在线观看_日韩视频第一区 | 国产小视频免费观看_国产普通话刺激视频在线播放_亚洲国产精品无码JAVA_国产网曝门视频在线看_亚洲AV永久无码一区_se中文天堂网_亚洲高清久久久_午夜影院福利视频 | 小sao货大ji巴cao死你h_黄色动态图视频_成人精品av一区二区三区网站_亚洲欧美18岁网站_欧美激情视频二区_操处女逼小说_男人操女人视频免费看_毛片无遮挡高清免费 | 性欧美8处一14处破_a级毛片在线看日本_91视频免费视频_亚洲AV永久无码天堂网毛片_欧美熟妇色ⅹxxx欧美妇_成人在色线视频在线观看免费大全_精品一区在线_免费看一及片 | 成人性生活免费看_最新综合精品亚洲网址_精品国产福利在线观看_天干天干夜啦天干天干国产_亚洲欧美日韩国产综合在线_久久久久国产一区二区_在线网站_三级免费黄 | 欧美性高潮_狠狠爱网_激情五月人体_午夜剧场91_成人无码A区在线观看视频_99色成人_午夜日韩在线观看_夜夜澡人摸人人添人人看 | 欧美日韩综合在线_日日婷婷夜日日天干A片_东京一本一道一二三区_亚洲欧美在线播放_国产在线高清视频无码_亚洲午夜无码毛片av久久久久久_亚洲福利av_杨幂ai换脸视频 | 96在线看片免费视频国产_正在播放国产对白孕妇作爱_国产黄色免费看_亚洲性猛交xxxx乱大交_91污污视频_91视频高清免费_精品人妻无码一区二区三区换脸_国产成人福利视频 二级片免费_国产精品午夜久久久久久99热_久久av青久久久av三区三区_免费大片AV手机看片高清_久久精品AV无码夜色_欧美XXXX做受欧美69_久在线视频播放免费视频_国产日韩欧美一区 | 欧美体内she精高潮_99久久九九社区精品_9999国产精品_欧美牲交黑粗硬大_久久综合精品国产丝袜长腿_亚洲中文字慕日产2021_哪里有毛片网站_18video性欧美19sex高清 | 强乱中文字幕亚洲精品_亚洲网站观看_台湾无码AV一区二区三区_北条麻妃在线_国产在线一区二区三区视频_日韩精品无码视频免费专区_亚洲精品入口a级_亚洲日日摸夜夜夜夜夜爽小说 | 国产精品老熟女一区二区三区_69久久夜色精品国产69蝌蚪网_四虎永久在线精品免费一区二区_永久免费在线_精品国产一区二区三区国产区_天天天天天操_久久久久久AV无码免费网站_亚洲高清一区二 | 精品国产一区二区精华_国产精品天美传媒沈樵_日韩成人高清_国产人妻精品久久久久久_免费国产凹凸在线视频_午夜春色_亚洲视频在线观看免费视频_欧美在线另类 | 色妞网欧美影院_色综合久久无码中文字幕_国产在线午夜卡精品影院_欧美69xxxx_国产免费人成视频网站在线18_91无毛_java性无码hd中文_eeuss影院www免费播放 黄色成年网站_亚洲午夜无码AV毛片久久_sss海量视频在线观看_日韩精品卡1卡二卡3卡四卡_se亚洲_日本添下边无码视频全过程_性爱在线免费视频_亚洲熟妇无码AV不卡在线 | 国产三级久久久精品麻豆三级_黄色成年人国语版在线观看_国产gv在线观看受被做哭_伦理片一级片_免费三区_狠狠操导航_久久精品对白_操操综合网 | 成人激情在线观看_国产v片_免费看午夜无码福利专区_久操国产在线_在线视频亚洲欧美_国产精品精品国内自产拍_国产夫妇肉麻对白_精品欧美视频 | 色综合a_日韩一区二区三区精品视频第3页_成人午夜片av在线看_国产华人av导航_欧美一区二区三区在线观看_欧美丰满熟妇XXXX_国产XXXX做受视频_91九色欧美 | 免费成人av在线_日韩精品91爱爱_两个人免费高清视频WWW_日本妇人成熟免费视频_粉色视频在线免费观看_毛片视频软件_中文字幕永久在线播放_久久国产热这里只有精品 | 男女啪啪免费观看网站_欧美性开放情侣网站_别c我啊嗯国产av一毛片_79年熟女大胆露脸啪啪对白P_久久久久久久一级_日韩国产色_日本视频黄_欧美一区二区播放 | 欧美一级黄色网_国产九一视频_午夜高清_96自拍视频_国产精品99久久不卡二区_日韩视频精品一区_国产三级农村妇女在线观看_麻豆国产在线播放 | 国产成人在线看_超级碰碰青草免费视频_亚洲欧美成人中文字幕在线_毛片免费视频播放_亚洲手机在线播放_特黄aaaaaaaaa毛片免_超黄毛片_9999亚洲 | 国产成人久久精品激情91_在线免费色视频_亚洲精品字幕_青青草综合网_久久www免费人成看片爱潮_国产精品www视频_av解说在线精品_精品久久99 | 一级片国产_高清国产午夜精品久久久久久_hd国产人妖ts另类视频_欧美黑人精品一区二区不卡_午夜影院在线观看版_老司机亚洲精品影院_女明星黄网站色视频免费国产_国产网址 | avav国产_高清dvd碟片生活片_日韩性公交车上xxhd_青天衙门高清第一部免费观看_人妻引诱中文字幕_国产91av视频在线_在线免费黄色片_jizz欧美性3 | 成人一区视频_亚洲中文字幕久久精品蜜桃_91丨九色丨丰满人妖_一区二区三区免费在线看_中文字幕免费av_免费的黄色大片_黄色毛片a级片_亚洲国产成人精品无码区二本 | 精品久久久久久中文字幕无码软件_上海富婆按摩高潮不断_AV天堂久久天堂AV_成年人免费观看视频网站_日韩新片在线观看_欧美另类人妻制服丝袜_秋霞久久久_欧美性黑人极品hd | 国产三区四区_欧美激情自拍偷拍_免费网站成人亚洲_精品无人乱码一区二区三区介绍_欧美成人a天堂片在线观看_亚洲精品免费看_欧美在线三级艳情网站_久久久久成人网 | 麻豆精品国产入口_日本一二三区不卡_在线免费黄_美女不带套日出白浆免费视频_国产精品盗摄久久久_日本中文字幕在线免费观看_国产一级一级_成人区一区 | 热久热久_传媒大片免费观看_精品国产精品久久一区免费式_欧美亚洲三区_精品国产乱码久久久久久密桃99_日本久久久久一级毛片_黑色正能量最新入库_中文字幕永久视频 |