歡迎您的來訪!有源碼,好建站(www.bmm520.net)源碼海洋源碼網為您提供快速建站平臺.
      當前位置: 首頁 > 行業資訊 > c# .net 資料 >

      C# Socket之異步TCP客戶端斷線重連

      時間:2021-07-11 23:29來源:未知 作者:admin 點擊:
      本文章向大家介紹C# Socket之異步TCP客戶端斷線重連,主要包括C# Socket之異步TCP客戶端斷線重連使用實例、應用技巧、基本知識點總結和需要注意事項,具有一定的參考價值,需要的朋友可以參考一下。 我們知道TCP通信是一種面向連接的Socket,針對于面向連接

      本文章向大家介紹C# Socket之異步TCP客戶端斷線重連,主要包括C# Socket之異步TCP客戶端斷線重連使用實例、應用技巧、基本知識點總結和需要注意事項,具有一定的參考價值,需要的朋友可以參考一下。

       

              我們知道TCP通信是一種面向連接的Socket,針對于面向連接的TCP服務應用,安全,但是效率低,它首先需要服務端開啟服務,然后客戶端才可以去連接,如果服務端沒有開啟通信服務或者連接之后再中途因為某些原因斷開連接了,那么都是會通信失敗的,所以我們這篇博客主要是對TCP通信加入兩個機制。1,客戶端開啟后未連接成功,自動重連請求 2,若通信途中因為某些原因斷開連接了自動重連機制  因為測試發現如果是程序運行途中我們利用同步的方式重新連接的話連接時會出現程序卡頓的情況,這個對用戶的體驗是非常不好的,為了避免這個情況,我們采用的是異步TCP通信的方式,代碼如下,這是一個單例腳本,無需掛載,程序開始時調用一下ConnectServer方法開啟通信就好,記得關閉程序時要調用一下Close方法來斷開掛起的異步連接,否則調試的時候通信會一直保存著。

      • /***********************************
      •  
        * Description:異步TCP客戶端
      •  
        * Mountpoint:這是一個單例腳本,無需掛載,直接調用即可
      •  
        * Date:2019.06.25
      •  
        * Version:unity版本2017.2.0f3
      •  
        * Author:LJF
      •  
        ***********************************/
      •  
        using System.Collections;
      •  
        using System.Collections.Generic;
      •  
        using UnityEngine;
      •  
        using System.Net;
      •  
        using System.Net.Sockets;
      •  
        using System;
      •  
        using System.Text;
      •  
         
      •  
         
      •  
        namespace LJF
      •  
        {
      •  
        //規范命名、添加注釋、合理封裝、限制訪問權限
      •  
        public class AsyncTcpClient
      •  
        {
      •  
        private string ip1;
      •  
        private int port1;
      •  
        byte[] ReadBytes = new byte[1024 * 1024];
      •  
        //單例
      •  
        public static AsyncTcpClient Instance
      •  
        {
      •  
        get
      •  
        {
      •  
        if (instance==null)
      •  
        {
      •  
        instance = new AsyncTcpClient();
      •  
        }
      •  
        return instance;
      •  
        }
      •  
        }
      •  
        private static AsyncTcpClient instance;
      •  
         
      •  
        System.Net.Sockets.TcpClient tcpClient;
      •  
         
      •  
        //連接服務器
      •  
        public void ConnectServer(string ip, int port)
      •  
        {
      •  
        //Debuger.EnableSave = true;
      •  
        ip1 = ip;
      •  
        port1 = port;
      •  
        try
      •  
        {
      •  
        tcpClient = new System.Net.Sockets.TcpClient();//構造Socket
      •  
        tcpClient.BeginConnect(IPAddress.Parse(ip), port,Lianjie, null);//開始異步
      •  
        }
      •  
        catch (Exception e)
      •  
        {
      •  
        Debug.Log(e.Message);
      •  
        }
      •  
        }
      •  
         
      •  
        //連接判斷
      •  
        void Lianjie(IAsyncResult ar)
      •  
        {
      •  
        if (!tcpClient.Connected)
      •  
        {
      •  
        Debug.Log("服務器未開啟,嘗試重連。。。。。。");
      •  
        tcpClient.BeginConnect(IPAddress.Parse(ip1), port1, Lianjie, null);
      •  
        //IAsyncResult rest = tcpClient.BeginConnect(IPAddress.Parse(ip1), port1, Lianjie, null);
      •  
        //bool scu= rest.AsyncWaitHandle.WaitOne(3000);
      •  
        }
      •  
        else
      •  
        {
      •  
        Debug.Log("連接上了");
      •  
        tcpClient.EndConnect(ar);//結束異步連接
      •  
        tcpClient.GetStream().BeginRead(ReadBytes, 0, ReadBytes.Length, ReceiveCallBack, null);
      •  
        }
      •  
        }
      •  
         
      •  
         
      •  
        //接收消息
      •  
        void ReceiveCallBack(IAsyncResult ar)
      •  
        {
      •  
        try
      •  
        {
      •  
        int len = tcpClient.GetStream().EndRead(ar);//結束異步讀取
      •  
        if (len > 0)
      •  
        {
      •  
         
      •  
        string str = Encoding.UTF8.GetString(ReadBytes, 0,len);
      •  
        str = Uri.UnescapeDataString(str);
      •  
        //將接收到的消息寫入日志
      •  
        //Debuger.Log(string.Format("收到主機:{0}發來的消息|{1}", ip1, str));
      •  
        //Debug.Log(str);
      •  
        tcpClient.GetStream().BeginRead(ReadBytes, 0, ReadBytes.Length, ReceiveCallBack, null);
      •  
        }
      •  
        else
      •  
        {
      •  
        tcpClient = null;
      •  
        Debug.Log("連接斷開,嘗試重連。。。。。。");
      •  
        ConnectServer(ip1,port1);
      •  
        }
      •  
        }
      •  
        catch (Exception e)
      •  
        {
      •  
        Debug.Log(e.Message);
      •  
        }
      •  
        }
      •  
         
      •  
        //發送消息
      •  
        public void SendMsg(string msg)
      •  
        {
      •  
        byte[] msgBytes = Encoding.UTF8.GetBytes(msg);
      •  
        tcpClient.GetStream().BeginWrite(msgBytes, 0, msgBytes.Length, (ar) => {
      •  
        tcpClient.GetStream().EndWrite(ar);//結束異步發送
      •  
        }, null);//開始異步發送
      •  
        }
      •  
         
      •  
        /// <summary>
      •  
        /// 斷開連接
      •  
        /// </summary>
      •  
        public void Close()
      •  
        {
      •  
        if (tcpClient != null && tcpClient.Client.Connected)
      •  
        tcpClient.Close();
      •  
        if (!tcpClient.Client.Connected)
      •  
        {
      •  
        tcpClient.Close();//斷開掛起的異步連接
      •  
        }
      •  
        }
      •  
         
      •  
        }
      •  
        }
      (責任編輯:admin)本文地址:http://www.bmm520.net/info/net/2021/0711/22470.html

      推薦資訊

      亚洲毛片av日韩av无码| 亚洲精品亚洲人成在线观看| 亚洲成a人片在线观看中文动漫| 亚洲乱码无限2021芒果| 亚洲欧洲自拍拍偷精品 美利坚 | 亚洲中文字幕无码爆乳| 国产亚洲视频在线播放| 亚洲欧美成人av在线观看| 亚洲伊人久久大香线焦| 久久久久亚洲AV成人片| 亚洲成色在线综合网站| 亚洲人成国产精品无码| 女bbbbxxxx另类亚洲| 久久夜色精品国产噜噜亚洲a| 亚洲国产美女精品久久| 亚洲毛片在线观看| 亚洲另类激情综合偷自拍图| 亚洲色无码专区在线观看| 亚洲国产高清精品线久久| 国产成人精品久久亚洲高清不卡 | 亚洲制服丝袜第一页| 亚洲色偷偷偷网站色偷一区| 最新国产精品亚洲| 亚洲伦理中文字幕| avtt天堂网手机版亚洲| 亚洲国产成人久久精品app| 亚洲AV成人片色在线观看| 亚洲中文无码a∨在线观看| 色婷婷亚洲十月十月色天| 亚洲AV永久纯肉无码精品动漫 | 337p日本欧洲亚洲大胆裸体艺术| 亚洲国产成人精品女人久久久 | 亚洲av无码片在线观看| 噜噜综合亚洲AV中文无码| 亚洲色偷精品一区二区三区| 亚洲精品无码专区久久久| 亚洲午夜国产精品无码老牛影视| 久久国产成人精品国产成人亚洲| jlzzjlzz亚洲乱熟在线播放| 亚洲国产成人久久综合一区77| 亚洲一级片内射网站在线观看|