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

  • unity3d的網(wǎng)絡(luò)套接字SOCKET模塊使用

    2019/6/12??????點(diǎn)擊:

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

    /*
    UNITY3D 網(wǎng)絡(luò)組件,它是單例模式。
     通過Network開啟和關(guān)閉網(wǎng)絡(luò);
     消息訂閱器MsgEvent管理服務(wù)端發(fā)來的消息
     */
    using UnityEngine;
    using Assets.Scripts.Events;
    using Assets.Scripts.Util;
    using Assets.Scripts.Net;
    using System;
    
    public enum NetMsgType
    {
        ////// 新消息
        ///newMsg = -4,
        ////// 連接服務(wù)中斷
        ///interrupt = -3,
        ////// 請求錯(cuò)誤
        ///error = -2,
        ////// 連接成功
        ///complete = -1,
        ////// 服務(wù)端握手響應(yīng)
        ///state = 1
    }
    public class Network : MonoBehaviour
    {
        ////// 網(wǎng)絡(luò)消息廣播,當(dāng)服務(wù)端有消息發(fā)來是通過它廣播
        ///public static readonly EventDispatchMsgEvent = new EventDispatch();
        public static bool IsConnet { get; private set; }
        public static bool IsActive { get; private set; }
        ////// 網(wǎng)絡(luò)組件實(shí)例
        ///public static Network Server { get; private set; }
    
        private SocketTcp socket;
        public string ip = "";
        public int prot;
        void Awake()
        {
            Server = this;
        }
        void Start()
        {
        }
        ////// 向服務(wù)端發(fā)送數(shù)據(jù)
        //////協(xié)議接口類型///預(yù)留///要發(fā)送的數(shù)據(jù)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("網(wǎng)絡(luò)錯(cuò)誤:" + msg.Error);
                return;
            }
            if (Enum.IsDefined(typeof(NetMsgType), msg.Type))
            {
                
                MsgEvent.Dispatch((NetMsgType)msg.Type, msg);
            }
            else
            {
                Debug.Log("未定義網(wǎng)絡(luò)消息:" + 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();
        }
        //程序退出則關(guān)閉連接  
        void OnApplicationQuit()
        {
            if (socket != null) socket.Destroy();
        }
    }
    /*
     socketTcp封裝了一個(gè)輕量通信協(xié)議,以8個(gè)字節(jié)為頭部(整型):無符號4字節(jié)長度(包括頭部8字節(jié))、消息類型無符號2字節(jié)、預(yù)留無符號2字節(jié)。
      使用異步方法兼容hololens的uwp平臺。消息類型自定義,協(xié)議的數(shù)據(jù)包格式在注釋有說。 */
    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,
            ////// 請求連接服務(wù)器時(shí)發(fā)生錯(cuò)誤
            ///CONNET_IOERROT,
            ////// 連接中斷
            ///CONNET_ERROT,
            ////// 收到消息
            ///CONNET_MSG
        }
        public class SocketTcp : EventDispatch{
            ////// 頭部字節(jié)
            ///public const int head_size = 8;
            ////// 是否使用小端
            ///public const bool IsLittleEndian = true;
            bool _activity = false;
            ////// 是否已啟用
            ///public bool Activity
            {
                get { return _activity; }
            }
            ////// 接受的消息,隊(duì)列
            ///private QueueMsgList;
            private QueuecodeMsg;
            public int port { get; private set; }
            public string ip { get; private set; }
            Socket socket;
            SocketAsyncEventArgs ReceiveSaea;
            SocketAsyncEventArgs sendSaea;
            byte[] sendData;
            ////// 允許單個(gè)數(shù)據(jù)包30720字節(jié)
            /// 
            ///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;
            ////// 發(fā)起鏈接請求
            /// 會(huì)調(diào)度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);//設(shè)置回調(diào)方法                                                                             
                        connetedSaea.RemoteEndPoint = new IPEndPoint(IPAddress.Parse(ip), port);    //設(shè)置遠(yuǎn)端連接節(jié)點(diǎn),一般用于接收消息
                        sendSaea = new SocketAsyncEventArgs();
                        //連接到服務(wù)器
                        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);//設(shè)置緩沖區(qū)
                ReceiveSaea.Completed += new EventHandler(ReceiveCall);//設(shè)置回調(diào)方法
                //codeMsg.Enqueue(1);
                //連接后開始從服務(wù)器讀取網(wǎng)絡(luò)消息
                socket.ReceiveAsync(ReceiveSaea);
            }
            int fragmentLen;
            byte[] fragment;
            ////// 回調(diào)讀取網(wǎng)絡(luò)數(shù)據(jù)、檢查是否斷線。
            /////////private void ReceiveCall(object sender, SocketAsyncEventArgs e)
            {
                fragmentLen = e.BytesTransferred;//調(diào)用這個(gè)函數(shù)來結(jié)束本次接收并返回接收到的數(shù)據(jù)長度。
                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);//這個(gè)函數(shù)用來關(guān)閉客戶端連接 
                    _activity = false;
                    socketState = true;
                    Debug.Log("中斷,關(guān)閉連接");
                    return;
                }
            }
            ////// 發(fā)送字節(jié)流
            //////public void Send(ushort type, ushort error, ByteArray data)
            {
                uint len = (uint)data.Length + head_size;
                //清空發(fā)送緩存  
                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.
                //數(shù)據(jù)類型轉(zhuǎn)換  
                //sendData = Encoding.ASCII.GetBytes(sendStr);
                //發(fā)送  
                sendSaea.SetBuffer(sendData, 0, sendData.Length);
                socket.SendAsync(sendSaea);
            }
            ////// 主線程每幀調(diào)用以拿取數(shù)據(jù)
            ///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();
                //后關(guān)閉服務(wù)器  
                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;
                }
            }
        }
    }
    主站蜘蛛池模板: 亚洲成av人片一区二区_毛片美女_男人天堂aaa_久久精品亚洲精品国产欧美kt∨_亚洲中文字幕日产无码_91精品入口蜜桃 | 美女诱惑视频_亚洲欧洲自拍拍偷综合_午夜免费无码福利视频麻豆_国产中文字幕精品在线观看_亚洲成熟丰满熟妇高潮XXXXX_999re5这里只有精品 | 中文字幕在线日_免费看性视频xnxxcom_希岛爱理一区二区三区av高清_国产亚洲网站_琪琪色源网_亚洲国产成人AV网站 | 欧洲精品色_私人毛片免费高清影视院_精品日韩欧美一区二区三区_国产欧美日本亚洲精品一5区_国产精品自在线拍国产手机版_www.亚洲免费 | 国产高清视频在线播放_国产丰满农村老妇女乱_国产精品欧美在线视频_国产精品久久久91_麻豆男女午夜福利视频_www.日 | 欧美精品不卡_在线观看免费国产_亚洲色图欧美一区_国产综合色在线观看_日韩精品一区不卡_不卡乱辈伦在线看中文字幕 | 一区二区蜜桃_亚州免费A片无码区A片_一级毛片视屏_亚洲AV永久无码精品一区二区国产_亚洲成a∧人片在线播放_欧美精品手机在线 | 久久99国产综合精品女同_成人免费一区二区三区视频网站_成人午夜一级_正在播放麻豆_黄色大片区_亚洲天堂免费视频 | 女人毛片_国产人妖XXXX做受视频_久久成年网_国产精品资源_精品国产免费观看_麻豆亚洲AV熟女国产一区二 | 最近日本免费观看高清视频_免费看黄av_久操福利_久久精品国产网红主播_国产亚洲精品久久久久久网站_日本在线xxx | 人妻丰满av无码中文字幕_亚洲精品一区二区三区无码夜色_久久男人AV资源网站无码软件_色综合999_久久人体视频_欧美亚洲综合色 | 亚洲免费视频成人_小荡货你夹的老师好紧_真实国产普通话对白乱子子伦视频_牛和人交VIDE欧美XX00186_四虎国产免费_国产成人午夜 | 婷婷国内自拍_亚洲精华国产欧美_国产毛片久久久久_糟蹋小少妇17p_人c交zo○zooxx全过程_欧美性生交XXXXX无码十全 | 福利片一区二区_国产精品国内自产_亚洲一区二区三区观看_8x8x精品国产一区_亚洲精品国产最新在线不卡_性迷宫在线看 | av亚洲产国偷v产偷v自拍小说_好男人社区www影视_黄色国产一区二区_chinese少妇偷_男人天堂五月天_麻豆精品视频在线 | 越南一级黄色片_18禁高潮出水呻吟娇喘av_日韩欧美中文字幕公布_久久不卡_色综合天天狠狠_在线观看亚洲成人 | 日韩欧美精品一区二区_国产精品视频资源_伊人久久综合热线大杳蕉_18禁成人无遮羞网站免费_亚洲AV无码AV在线影院_丰满熟妇另类激情 | 波多野たの结衣A片_精品二区久久_少妇放荡的呻吟干柴烈火免费视频_狠狠婷婷色五月中文字幕_国产无吗毛片_成人小视频网 | 人妻少妇被猛烈进入中文字幕_亚洲色偷偷综合亚洲av78_久久99久久99久久_粉嫩av一区_美女一区二区视频_久久网这里都是精品 | 91婷婷综合_四虎最新网址在线观看_午夜影院激情_日韩黄色影视_特级做A爰片毛片免费69_日本成人精品在线 | 久久99久久99精品免观看_国产你懂的在线观看_国产1区二区_国产精品久久亚洲一区二区_亚洲无码转帖_国产真人中国A级毛片 | 日韩精品视频在线一区_中国老熟女重囗味HDXX_日韩人妻高清精品专区_在线中文天堂_最近2018中文字幕视频免费看_午夜精品久久久久久99热明星 | 中国熟妇浓毛hdsex_中日韩三级_九热视频在线观看_成人无码精品1区2区3区免费看_久久久久9_91国内精精品久久久久久婷婷 | 草免费视频_国产欧美日韩免费一区二区_国产黄色观看_久久国产精品久久_人人草人人干_久久免费视频一区二区三区 | 人妻少妇被猛烈进入中文字幕_亚洲色偷偷综合亚洲av78_久久99久久99久久_粉嫩av一区_美女一区二区视频_久久网这里都是精品 | 一区二区蜜桃_亚州免费A片无码区A片_一级毛片视屏_亚洲AV永久无码精品一区二区国产_亚洲成a∧人片在线播放_欧美精品手机在线 | 亚洲综合图片_青草草在线观看_亚洲欧美蜜芽tv在线一区_九九九久久国产免费_丰满少妇毛片_国产免费一区二区 | 亚洲一区视频观看_亚洲国产AV一区二区三区丶_免费黄色激情视频_欧美激情综合_国产三级_成人福利在线看 欧美黑人成人www在线观看_91污版_日韩一区二区三区免费看_中国丰满少妇xxxxx高潮_美日韩中文字幕_免费无码成人片在线观看 | 91麻豆视频网站_久久久一本二本三本_国产69久久精品成人看动漫_99re中文在线视频_china熟女熟妇乱老女人_国产精品久久久777777 | 免费看a级黄色片_国内午夜无码不卡在线观看_欧美人与禽Z0ZO牲伦交_91精品国产综合久久久久_国产小视频在线_精品少妇无码AV无码专区 | 深夜免费视频_理论片高清免费理论片猫眼_a级片一区二区三区_真实国产乱子伦对白视频_久久av秘一区二区三区_国产日韩欧美色 | 欧美精品不卡_在线观看免费国产_亚洲色图欧美一区_国产综合色在线观看_日韩精品一区不卡_不卡乱辈伦在线看中文字幕 | 永夜星河在线观看_日韩色性视频_日本成人免费网站_日本在线看_国产a一级毛片爽爽影院无码_久久xxx | 成人av网址天堂_中国精品久久_久久久久国色av∨免费看_久久久久久91_中文字幕在线视频网站_91视频免费版黄 | 波多野结喷水最猛一部352_片在线免费观看_欧美韩一区二区_国产乱子伦一区二区三区视频播放_免费视频精品_日韩在线观看av | 久久综合欧美_日本逼逼_九一传媒在线观看_亚洲日韩乱码久久久久久_蜜臀社区_人人玩人人添人人澡 | 欧美高清网站_亚洲第一不卡_国产成人在线观看免费网站_国产av一区最新精品_日本www视频在线观看_免费观看久久 | 在线观看视频免费一区二区三区_97人妻天天爽夜夜爽二区_日韩久久午夜一级啪啪_国产一区二区视频在线_99久久久_精品国产这么小也不放过 | 欧美丰满熟妇BBB久久久_久久人人爽人人爽人人片av免费_中国真实偷乱视频_中文在线一二区_99精品国产成人综合_青春草久久 | 亚洲天天综合_97亚洲狠狠色综合久久_成年人福利视频_欧美日韩国产成人在线观看_日本乱人伦aⅴ精品潮喷_内射中出无码护士在线 | 性色AV无码专区一ⅤA亚洲_精品人妻无码一区二区三区绿_中文字幕在线精品视频入口一区_国产成人免费9x9x人网站视频_超碰成人福利_久久草精品 |