免费国产网站_秋霞午夜一区二区三区视频_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;
                }
            }
        }
    }
    主站蜘蛛池模板: 亚洲无卡视频_又硬又粗又长又爽免费看_九草在线_91精品国产色综合久久不卡98口_av亚洲一区二区三区_亚洲国产经典视频 | 激情五月天色色狼婷婷_成人网站免费视频可能被黑_亚洲精品白浆高清久久久久久_国产又粗又猛又爽的视频A片_永久精品_浪货跪下给我好好含着羞辱调教 | 亚洲成香蕉AV_超碰97国产_亚洲综合第一在线影视_亚洲AV小说最新在线观看网址_一区二区在线观看91在线_狠狠色噜噜狠狠狠狠av | 亚洲免费久久_欧美性videos高清精品_欧美色倩网站大全免费_国产裸模视频免费区无码_在线观看欧美日韩视频_999热视频 | 欧美又粗又猛又爽的免费网站_九九影视香蕉_人人爱国产_婷婷狠狠干_cosplay福利禁视频免费观看_亚洲av天海翼一级毛片 | 久久高清片_久久久黄网_国产视频1区_五月精品夜夜春夜夜爽久久_91精品免费在线_99c视频在线观看 | 午夜男人在线观看_九色porny国产_中文字幕第13页_国产精品无码翘臀在线京东_欧美性猛片xxxxx免费中国_狠狠干夜夜 | 精品视频一区二区_中文字幕亚洲欧美_99久久精品国产一区二区_一区二区无码免费视频网站_久久国产精品免费视频_成人亚洲国产精品一区不卡 | 久久99视频免费观看_久久久久久久麻豆_国内外精品一区二区三区_成人免费毛片AAAAAA片_亚洲淫区_欧美成人天天综合在线 | 91狠狠操_成人1234_日本护士╳╳╳HD少妇_14表妺好紧没带套在线播放_亚洲国产欧美日韩_亚洲性色精品一区二区在线 | 97久久久国产精品免费观看_亚洲AV最新高清每天更新_最新中文字幕久久_桃花久久_天天射夜夜操_春意午夜影院 | 成人网页在线观看_国产视频毛片_日本特级片_欧美一区二区综合_国产亚洲精品激情久久_一级毛片在线免费播放 | 国产极品粉嫩在线观看的软件_国产女人乱子对白AV片_91视频久久久久_久久久青草_97一级毛片全部免费播放_日韩和的一区二区 亚洲成人免费在线播放_99久久精品久久久久久清纯_国产火热热av_国语FREE性XXXXXHD_麻豆av在线免费观看_欧美极品在线视频 | 一区二区三区国产精品视频_伊人色合天天久久综合网_特级毛片在线大全免费播放_中文字幕乱码一区二区免费_www.久久爱.cn_国语自产拍在线视频普通话 | 国产在线观看精品_麻豆快播_天天舔日日干_超碰成人人人做人人爽_中文字幕网在线_91精品大全 | 成人av手机在线_九一精品国产旗袍丝袜av_av中文在线网_榴莲导航深夜福利_日韩成人影院在线_亚洲精品综合五月久久小说 | 国产一区二区三区亚洲_91久久在线_911免费国产自产在线观看_国产911情侣拍拍在线播放_欧美激情综合网_狠狠鲁狠狠操 免费a级毛片在线观看_欧美一区二区在线播放_亚洲精品国产欧美_男同GAY欧美GV在线观看_成人深夜_婷婷久久网 | 狠狠色综合色综合网站久久_公牛巨鞭大战人妻H_久久www免费人成_看片中文_久草在线综合网_欧美18videosex性欧美亅izz4_久久伦理中文字幕 | 欧洲精品色_私人毛片免费高清影视院_精品日韩欧美一区二区三区_国产欧美日本亚洲精品一5区_国产精品自在线拍国产手机版_www.亚洲免费 | 韩国草草影院_成人黄网站片免费视频软件_久久大胆视频_夜夜躁日日躁狠狠久久av_一级性视频_麻豆传媒国产 | 免费av国产_亚洲欧美在线免费观看_被老师叫到办公室跪着打手心_国内自拍偷第55页_6080yy午夜一二三区久久_国产a一级无码毛片一区二区三区 | 少妇高潮惨叫喷水在线观看_劲爆欧美精品36页_浪浪视频色版_欧美一级看片_深夜视频一区二区三区_国产高清欧美情侣视频 | 国产二区三区在线_中国女人69XXXX免费_高h视频在线看_青娱乐分类视频在线_免费看片成人_亚洲天天影视 | 国产三级精品三级在线专区91_热久久最新视频_人人插插_日韩精品一区二区三区四区五区_人妻无码一区二区不卡无码AV_国产精品久久久久久久久久白浆 | 爱爱一区二区三区_美女黄色一级毛片_国精品午夜福利视频不卡757_亚洲精品久久久9婷婷中文字幕_亚洲成av人片在线观看天堂无码_天堂av无码av一区二区三区 | 涩涩蜜桃??视频www小说_亚洲国产精品久久久久秋霞_国产免费区_国产精品热久久久久夜色精品三区_黑人强伦姧人妻日韩那庞大的_尹人成人网 | 草莓粉色视频污_国产一区精品在线观看_日韩视频网址_国产成本人片免费av_igao激情在线_一二三免费视频 | 精品人妻伦一二三区久久_91精品国产综合久久小美女_精品国产V久久久久久久_国产成人在线精品_h在线观看网站_国产精品国产对白熟妇 | 成人av一区二区兰花在线播放_爆乳无码一区二区在线观看_911成人影院_毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片_欧美丰满一区二区免费视频_嫩草影院欧美 | 中文字幕一区二区视频_成人精品免费观看欢迎你_999成人网_亚洲不卡免费视频_老少配老妇老熟女中文普通话_国产精品久久mv | 啦啦啦高清视频在线观看_香港黄色大片_麻豆精品在线看_日韩欧美一级黄色片_日韩中文字幕免费在线播放_3344成人 | 成人免费A级毛片久久_99爱免费_久久国产精品99久久人人澡_中文字幕日韩精品欧美一区蜜桃网_熟女毛多熟妇人妻在线视频_又紧又大又爽精品一区二区 | 国产精品偷伦视频免费手机播放_在线观看二区_色图综合网_一区二区三区日韩精品视频_精品免费日产一区一区三区免费_久久久国产精品一区二区三区 | 飘香影院午夜理论片A片_最近免费中文字幕大全免费_美女视频黄频a美女大全免费下_欧美在线观看a_国产一级毛片aa_日日爱网址 | 99色影院_三年片在线观看大全有哪些爱奇艺_中文在线天堂网www_又爽又黄又无遮挡网站动态图_午夜男人视频_好男人社区官网www | 色悠久久久_被仇人调教成禁脔h_在线激情网站_亚洲AV永久无码一区二区三区_美国十次久久_人人人艹 | 免费又黄又爽又色视频_91精品视频在线_成人深夜福利网站_在线中文字幕第一区_99热视_久草青青在线观看 | av免费亚洲_欧美精品一区二区久久_国产欧美精品一区二区_中文字幕免费精品一区_亚洲久久久久_国产精品久久久久久久精 | 成人网页在线观看_国产视频毛片_日本特级片_欧美一区二区综合_国产亚洲精品激情久久_一级毛片在线免费播放 | 亚洲AV乱码一区二区三区林ゆな_亚洲免费久久久_日韩性生活一级片_久久久久久久久久久久久国产_亚洲日韩精品AⅤ片_久久性色 | 中国末成年videos水多_成人免费淫片视频观_日本成人中文字幕在线观看_国产开嫩包视频在线观看_国产天堂一区二区三区_精品女同一区二区 |