c# socket 客户端 掉线每10秒自动重连

创建TcpClient.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace WpfApp1
{
    public class TcpClient
    {
        static Socket clientSocket;
        static String outBufferStr;
        static Byte[] outBuffer = new Byte[1024];
        static Byte[] inBuffer = new Byte[1024];

        private bool isRunning = false;
        private int lostConneTime = 0;

        private Thread WorkThread = null;

        public TcpClient()
        {
            BuildConnection();
            WorkThread = new Thread(WorkFunc);//工作(接收数据)线程
            WorkThread.IsBackground = true;
            WorkThread.Start();
        }

        public void BuildConnection()
        {
            //将网络端点表示为IP地址和端口 用于socket侦听时绑定  
            IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 4844); //填写自己电脑的IP或者其他电脑的IP,如果是其他电脑IP的话需将ConsoleApplication_socketServer工程放在对应的电脑上。 
            clientSocket = new Socket(ipep.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            //将Socket连接到服务器
            try
            {
                clientSocket.Connect(ipep);
                this.isRunning = true;
            }
            catch
            {
                Console.WriteLine("服务器未开启!");
            }
        }

        public void Send(string content)
        {
            try
            {
                //发送消息
                Console.WriteLine("C# is saying!");
                outBuffer = Encoding.ASCII.GetBytes(content);
                clientSocket.Send(outBuffer, outBuffer.Length, SocketFlags.None);
            }
            catch
            {
                this.lostConneTime += 1;
                Console.WriteLine("丢失python连接{0:N0}", this.lostConneTime);
            }
            if(this.lostConneTime == 10)
            {
                BuildConnection();
                this.lostConneTime = 0;
            }
        }

        private void WorkFunc()
        {
            while (this.isRunning)
            {
                if (clientSocket != null)
                {
                    try
                    {
                        int recvCount = clientSocket.Receive(inBuffer, 1024, SocketFlags.None);
                        if (recvCount > 0)
                        {
                            string recvMsg = Encoding.UTF8.GetString(inBuffer, 0, recvCount);
                            AnalysisReceivedMsg(recvMsg);
                        }
                    }
                    catch
                    {
                        Thread.Sleep(1000);
                    }
                }
            }
            
        }

        private void AnalysisReceivedMsg(string content)
        {
            Console.WriteLine(content);
        }
    }
}

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp1
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        TcpClient tcpClient = null;
        private System.Windows.Threading.DispatcherTimer dispatcherTimer = null;
        public MainWindow()
        {
            InitializeComponent();

            string test = string.Join(" ", new string[] { "5.68,0.0", "5.55,0.41", "5.43,0.81", "5.28,1.18", "5.16,1.54", "5.01,1.87", "4.85,2.17", "4.67,2.44", "4.47,2.67", "4.24,2.84", "3.93,2.93", "3.33,2.74", "0,0" });

            tcpClient = new TcpClient();
            dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
            dispatcherTimer.Tick += new EventHandler(PythonCommu);
            dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 1000);
            dispatcherTimer.Start();
        }

        public void PythonCommu(object sender, EventArgs e)
        {
            tcpClient.Send("I am c#!;");
        }
    }
}

 

C#中,构建一个完整的服务器客户端系统,包括心跳机制和客户端断线重连功能,通常涉及以下几个步骤: **服务端(Server):** 1. **创建服务器端Socket实例:**首先创建一个TcpListener对象监听特定的IP地址和端口。 ```csharp TcpListener listener = new TcpListener(IPAddress.Any, Port); ``` 2. **开始监听连接:**启动监听并等待客户端连接。 ```csharp listener.Start(); ``` 3. **接收客户端连接:**当有客户端连接时,接受新的套接字并处理它们。 4. **心跳检测:**可以定期通过发送心跳包(如空数据包或特定标识符)来检查客户端是否还在线,如果长时间未收到响应,则认为客户端断开。 5. **心跳逻辑:**在发送心跳请求后,设置超时定时器,若未在预定时间内收到回应,则关闭连接并尝试重新连接。 **客户端(Client):** 1. **创建客户端Socket:**创建一个新的TcpClient对象,尝试连接到服务器。 ```csharp TcpClient client = new TcpClient(); client.Connect(ServerIpAddress, ServerPort); ``` 2. **发送和接收数据:**使用GetStream()获取Socket流进行双向通信。 3. **心跳发送和接收:**客户端也需要定期向服务器发送心跳,并处理从服务器接收到的心跳确认。 4. **重连逻辑:**如果客户端断线(例如网络中断),需要在适当的时候尝试重新连接,比如使用Timer或线程池任务。 **示例代码简化版:** ```csharp // 服务器端 while (true) { Socket client = listener.Accept(); // 创建新线程处理客户端请求 Task.Run(() => HandleConnection(client)); } // 客户端 using (TcpClient client = new TcpClient()) { client.Connect(ServerIpAddress, ServerPort); while (IsConnected(client)) { SendHeartbeat(client); ReceiveAndProcessMessage(client); } } ``` 请注意,这只是一个简化的版本,实际应用中需要考虑错误处理、线程同步以及更复杂的重试策略等细节。在客户端断线重连部分,`IsConnected()`函数用于判断连接状态,`SendHeartbeat()`和`ReceiveAndProcessMessage()`则是心跳和数据交换的抽象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值