Unity中Socket_TCP异步连接,加入断线检测以及重连功能(服务端客户端源码)

1、服务端

using System;
using System.Collections.Generic;
using System.Text;
#region 命名空间
using System.Net;
using System.Net.Sockets;
using System.Threading;
using UnityEngine;
#endregion

namespace AsynServerConsole
{
   
    /// <summary>
    /// Tcp协议异步通讯类(服务器端)
    /// </summary>
    public class AsynTcpServer: MonoBehaviour
    {
   

        //存储已连接的客户端的泛型集合
        private static Dictionary<string, Socket> socketList = new Dictionary<string, Socket>();

        private void Start()
        {
   
            StartListening();
        }
        float ttt;

        private void Update()
        {
   
            ttt += Time.deltaTime;
            if (ttt>5f)
            {
   
                ttt = 0f;
                 //Debug.Log("连接数量==="+ socketList.Count);

                if (socketList.Count > 0)
                {
   
                    foreach (var item in socketList)
                    {
   
                      //  Debug.Log("连接客户端====" + item.Key);
                        //  HandleClient(item.Value);
                        //AsynSend(item.Value,"心跳");
                    }
                }
                else 
                {
   
                
                }
               
            }
        }
        Socket TcpServer;
        #region Tcp协议异步监听
        /// <summary>
        /// Tcp协议异步监听
        /// </summary>
        public void StartListening()
        {
   
            //主机IP
            IPEndPoint serverIp = new IPEndPoint(IPAddress.Parse("192.168.15.72"), 8686);
            TcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            TcpServer.Bind(serverIp);
            TcpServer.Listen(100);
            Debug.Log("异步开启监听...");
            AsynAccept(TcpServer);
        }
        #endregion

        #region 异步连接客户端
        /// <summary>
        /// 异步连接客户端
        /// </summary>
        /// <param name="tcpServer"></param>
        public void AsynAccept(Socket tcpServer)
        {
   
            tcpServer.BeginAccept(asyncResult =>
            {
   
                Socket tcpClient = tcpServer.EndAccept(asyncResult);

               string str = tcpClient.RemoteEndPoint.ToString();
                socketList.Add(str, tcpClient);

                Debug.Log("收到连接=============" + tcpClient.RemoteEndPoint.ToString());
                AsynSend(tcpClient, "收到客户端连接...");//发送消息
                AsynAccept(tcpServer);//继续监听客户端
                AsynRecive(tcpClient);//继续监听客户端消息
            }, null);
        }
        #endregion

        #region 异步接受客户端消息
        /// <summary>
        /// 异步接受客户端消息
        /// </summary>
        /// <param name="tcpClient"></param>
        public void AsynRecive(Socket tcpClient)
        {
   
            byte[] data = new byte[1024];
            try
            {
   
                tcpClient.BeginReceive(data, 0, data.Length, SocketFlags.None,
                asyncResult =>
                {
   
                    int length = tcpClient.EndReceive(asyncResult);
                    if (length==0)
                    {
   
                        Debug.Log("客户端退出===="+tcpClient.RemoteEndPoint.ToString());
                        foreach (var item in socketList)
                        {
   
                            if (item.Key.Contains(tcpClient.RemoteEndPoint.ToString()))
                            {
   
                                socketList.Remove(item.Key);
                            }
                        }
                         tcpClient.Close();
                        return;
                    }
                    string mes = Encoding.UTF8.GetString(data, 0, length); 
					Debug.Log(tcpClient.RemoteEndPoint.ToString()+"收到客户端消息:{length}=====" + length + "___" + mes);
                  //  Debug.Log(tcpClient.RemoteEndPoint.ToString()+"收到客户端消息:{length}=====" + length + "___" + Encoding.UTF8.GetString(data)); 
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰尼杰尼丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值