免费国产网站_秋霞午夜一区二区三区视频_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区_狠狠操夜夜操天天操_欧美操操_亚洲免费网站在线观看_欧美精品在欧美一区二区少妇_一级黄色片处女 | 中国末成年videos水多_成人免费淫片视频观_日本成人中文字幕在线观看_国产开嫩包视频在线观看_国产天堂一区二区三区_精品女同一区二区 | 欧美黑人成人www在线观看_91污版_日韩一区二区三区免费看_中国丰满少妇xxxxx高潮_美日韩中文字幕_免费无码成人片在线观看 | onlyfans是个什么平台_国产区香蕉精品系列在线观看不卡_亚洲国产另类久久久精品黑人_艹逼逼小说_亚洲欧美日韩国产一区二区_国产亚洲一区二区不卡 | 人人做人人澡人人爽欧美_电击奶头の尿失禁调教_乱成熟女人在线视频_亚色中文网_h国产在线_亚洲老妈激情一区二区三区 | 五月综合激情婷婷六月色窝_67194人成免费无码_暖暖日本视频在线_国产成人在线免费视频_久久国产精品无码HDAV_亚洲视频免费在线看 | 青青草精品在线视频_国产熟女视频_日本久久久久久久久久久久_我看午夜视频_xx另类性欧美_精品国产一区二区三区高潮视 | 我玩游戏成了绝世强者动漫在线观看_无码AV一区二区大桥久未_锵锵锵锵锵免费完整观看动漫最新章节_亚洲AV色香蕉一区二区_亚洲精品另类_中国熟妇露脸VIDEOS | 亚洲网站免费观看_亚洲在线视频播放_美国xxxx视频_成人av网址在线_麻豆传媒在线观看_免费无码又爽又刺激A片软件 | 亚欧美一区二区三区_91人人插_在线观看亚洲一区_国产永久免费av_久久精品亚洲麻豆av一区二区_久久精品国产曰本波多野结衣 又黄又爽又猛1000部A片_青春草免费在线视频_欧美成人精品高清在线播放_av黑人_午夜视频久久_91一区二区三区在线 | 18禁裸男晨勃露J毛免费观看_国产成a人亚洲精品无码久久_91小视频在线观看_亚洲区精品视频_国产XXXX做受性欧美88_欧美一级特级 | 国产成人在线视频观看_亚洲成av人影院在线观看_sm另类首页制服av_www.爱久久_日韩精品无码专区免费视频_japanese成熟丰满熟妇 | 99成人精品日韩激情网站_www.影院_噜噜噜久久亚洲精品国产品91_九久久久久_久久人91精品久久久久久不卡_久久久久久久久久久网 | 久久人人超碰_亚洲色精品三区二区一区_日本WWW网站色情乱码_久久女同互慰一区二区三区_寂寞少妇饥渴难耐自慰_日产精致一致六区麻豆 | 国产欧美一区二区三区在线播放_青青草成人免费在线视频_久久午夜夜伦鲁鲁片无码免费_国产白嫩护士被弄高潮_91在线精品视频_小箩莉末发育娇小性色XXXX | 国产免费一区二区三区最新不卡_99热播_欧美成aⅴ人高清免费观看_午夜黄网_亚洲色无码专线精品观看_亚洲精品一区3d动漫在线 | 中文字幕大香视频蕉免费_蜜臀av夜夜澡人人爽人人网站_欧美BBBWBBWBBWBBW_国产视频欧美_97夜夜模夜夜爽夜夜喊_性毛片视频 | 免费看一级一片_黄色二级视频_日本高清无吗v一区_夜夜爽妓女8888888视频_激情亚洲一区二区三区四区_欧洲尺码日本尺码特价 | 免费无码av一区_97超碰免费人妻中文_在线观看91精品国产网站_波多野结衣AV在线无码中文观看_a级黑粗大硬长爽猛出猛进_亚洲日韩欧美在线一区二区 | 国产综合视频在线播放_黑人精品一区二区三区_免费一级国产_国产夜色_人与性口牲恔配视频免费观看_亚洲午夜大片 | 蝴蝶视频成人免费_日韩一区二区三区免费播放_特级毛片三a级毛片免费_麻豆一区二区三区四区精品蜜桃_午夜dj影院_国产九九九视频 | 欧美在线观看黄色_国产精品福利在线第一页_免费看日本一区二区_偷国内自拍视频在线观看_中国91av_午夜激情免费视频 | 成人免费无码AV_91视频-全网资源最全平台_大胆欧美gogo免费视频一二区_精品久久久久区二区8888_欧美成人无码一二区免费网站_www亚洲人 | 一级色片_91快射_55大东北熟女啪啪嗷嗷叫_午夜理论片yy8860y影院_欧美一区国产一区_免费黄色在线观看网站 | 草免费视频_国产欧美日韩免费一区二区_国产黄色观看_久久国产精品久久_人人草人人干_久久免费视频一区二区三区 | v片免费看_玩弄人妻少妇精品视频_毛片免费全部无码播放_久久久久免费精品_77777亚洲午夜久久多人_日欧一级片 | 免费a级_亚洲一区二区在_日本成人一区_久草视频福利_成人无码WWW在线看免费_国产一区二区三区四区五区密私 | 免费无码av片在线观看网站_黑人太大太长疼死我了_亚洲精品蜜桃久久久久久_国产免费www_2021在线不卡国产麻豆_成人无码一区二区三区网站 | 成人综合网站_2019狠狠干_国产精品一区二区欧美视频_久久99久久_成人中文_国产欧美日韩综合视频专区 | 亚洲伊人中文字幕_侵犯女教师一区二区三区_性欧美欧美巨大免费_亚洲中午字幕_国产精品久久久久久久久久软件_久久视频这里只精品10 | 久久福利_麻豆免费网站_国产亚洲av片天天在线观看_免费成人国产_免费在线日韩_日本www在线视频 | 中文字幕一区二区三区乱码_天天干b_538国产精品一区二区_中文字幕丁香五月天_中国美女av_大地资源免费第二页 | 亚洲精品久久久久AV无码_午夜激情av在线_成人性午夜免费视频网站_亚洲AⅤ无码一区二区波多野_无码午夜福利免费区久久_中文字幕精品亚洲无线码一区 | 亚洲成亚洲成网_黑鬼吊太大少妇尖叫_50熟妇熟乱xx×毛片_国产亚洲精品久久久久久_国产SUV精品一区二区五_成年人午夜影院 | 欧美肥妇视频_无码午夜嘿嘿嘿_www.午夜在线b站.com_91社区在线观看播放_国产伦精品一区二区三区免_亚洲人成网站在线 | 日韩88av_乱淫视频_av日韩精品在线观看_国产精品18久久久久久麻豆蝴蝶_91精品综合在线观看_国产超碰人人做人人爽aⅴ | 91精品啪在线观看国产91九色_综合日韩欧美_免费无码毛片一区二区三区A片_97人人人_国产微拍精品一区二区_亚洲综合久久av | 人人做人人澡人人爽欧美_电击奶头の尿失禁调教_乱成熟女人在线视频_亚色中文网_h国产在线_亚洲老妈激情一区二区三区 | 国模aaaa人体偷拍_x88av在线播放_日韩一区二区视频在线观看_中文字幕国产一区二区_在线看亚洲_日韩精品h | 亚洲精品乱码久久久久久蜜桃麻豆_成人黄色网_国产日韩欧美综合一区二区三区_99热在线观看精品_亚洲综合首页_国产成人免费无码AV在线播放 | 黄色v片_亚洲精品在线观_一区二区我不卡_无遮挡边摸边吃奶边做视频免费_日韩爱爱网_无码少妇一区二区三区免费看 |