本文章向大家介紹C# Socket之異步TCP客戶端斷線重連,主要包括C# Socket之異步TCP客戶端斷線重連使用實(shí)例、應(yīng)用技巧、基本知識(shí)點(diǎn)總結(jié)和需要注意事項(xiàng),具有一定的參考價(jià)值,需要的朋友可以參考一下。
我們知道TCP通信是一種面向連接的Socket,針對(duì)于面向連接的TCP服務(wù)應(yīng)用,安全,但是效率低,它首先需要服務(wù)端開(kāi)啟服務(wù),然后客戶端才可以去連接,如果服務(wù)端沒(méi)有開(kāi)啟通信服務(wù)或者連接之后再中途因?yàn)槟承┰驍嚅_(kāi)連接了,那么都是會(huì)通信失敗的,所以我們這篇博客主要是對(duì)TCP通信加入兩個(gè)機(jī)制。1,客戶端開(kāi)啟后未連接成功,自動(dòng)重連請(qǐng)求 2,若通信途中因?yàn)槟承┰驍嚅_(kāi)連接了自動(dòng)重連機(jī)制 因?yàn)闇y(cè)試發(fā)現(xiàn)如果是程序運(yùn)行途中我們利用同步的方式重新連接的話連接時(shí)會(huì)出現(xiàn)程序卡頓的情況,這個(gè)對(duì)用戶的體驗(yàn)是非常不好的,為了避免這個(gè)情況,我們采用的是異步TCP通信的方式,代碼如下,這是一個(gè)單例腳本,無(wú)需掛載,程序開(kāi)始時(shí)調(diào)用一下ConnectServer方法開(kāi)啟通信就好,記得關(guān)閉程序時(shí)要調(diào)用一下Close方法來(lái)斷開(kāi)掛起的異步連接,否則調(diào)試的時(shí)候通信會(huì)一直保存著。
- /***********************************
- * Description:異步TCP客戶端
- * Mountpoint:這是一個(gè)單例腳本,無(wú)需掛載,直接調(diào)用即可
- * 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
- {
- //規(guī)范命名、添加注釋、合理封裝、限制訪問(wèn)權(quán)限
- 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;
-
- //連接服務(wù)器
- public void ConnectServer(string ip, int port)
- {
- //Debuger.EnableSave = true;
- ip1 = ip;
- port1 = port;
- try
- {
- tcpClient = new System.Net.Sockets.TcpClient();//構(gòu)造Socket
- tcpClient.BeginConnect(IPAddress.Parse(ip), port,Lianjie, null);//開(kāi)始異步
- }
- catch (Exception e)
- {
- Debug.Log(e.Message);
- }
- }
-
- //連接判斷
- void Lianjie(IAsyncResult ar)
- {
- if (!tcpClient.Connected)
- {
- Debug.Log("服務(wù)器未開(kāi)啟,嘗試重連。。。。。。");
- 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);//結(jié)束異步連接
- tcpClient.GetStream().BeginRead(ReadBytes, 0, ReadBytes.Length, ReceiveCallBack, null);
- }
- }
-
-
- //接收消息
- void ReceiveCallBack(IAsyncResult ar)
- {
- try
- {
- int len = tcpClient.GetStream().EndRead(ar);//結(jié)束異步讀取
- if (len > 0)
- {
-
- string str = Encoding.UTF8.GetString(ReadBytes, 0,len);
- str = Uri.UnescapeDataString(str);
- //將接收到的消息寫(xiě)入日志
- //Debuger.Log(string.Format("收到主機(jī):{0}發(fā)來(lái)的消息|{1}", ip1, str));
- //Debug.Log(str);
- tcpClient.GetStream().BeginRead(ReadBytes, 0, ReadBytes.Length, ReceiveCallBack, null);
- }
- else
- {
- tcpClient = null;
- Debug.Log("連接斷開(kāi),嘗試重連。。。。。。");
- ConnectServer(ip1,port1);
- }
- }
- catch (Exception e)
- {
- Debug.Log(e.Message);
- }
- }
-
- //發(fā)送消息
- public void SendMsg(string msg)
- {
- byte[] msgBytes = Encoding.UTF8.GetBytes(msg);
- tcpClient.GetStream().BeginWrite(msgBytes, 0, msgBytes.Length, (ar) => {
- tcpClient.GetStream().EndWrite(ar);//結(jié)束異步發(fā)送
- }, null);//開(kāi)始異步發(fā)送
- }
-
- /// <summary>
- /// 斷開(kāi)連接
- /// </summary>
- public void Close()
- {
- if (tcpClient != null && tcpClient.Client.Connected)
- tcpClient.Close();
- if (!tcpClient.Client.Connected)
- {
- tcpClient.Close();//斷開(kāi)掛起的異步連接
- }
- }
-
- }
- }
(責(zé)任編輯:admin)本文地址:http://m.bmm520.net/info/net/2021/0711/22470.html