C#使用TCP/IP长连接获取数据、心跳检测

这篇具有很好参考价值的文章主要介绍了C#使用TCP/IP长连接获取数据、心跳检测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

逻辑处理

  1. 创建一个Socket对象并连接到服务器,可以使用Socket.Connect()方法。
  2. 使用Socket.Send()方法发送数据到服务器。
  3. 使用Socket.Receive()方法接收服务器返回的数据。
  4. 实现心跳检测,可以定时向服务器发送一个心跳包,如果服务器没有响应,则说明连接已断开。
  5. 如果连接断开,可以尝试重新连接,可以使用Socket.Close()方法关闭当前连接,然后再重新创建一个新的Socket对象。

注意事项:

  • 长连接需要保证数据传输的可靠性,可以考虑使用TCP协议。
  • 心跳检测的频率需要根据具体情况进行调整,过于频繁可能会增加网络负担,过于稀疏可能会延迟发现连接异常。
  • 在使用Socket的过程中,需要考虑异常处理和资源释放问题,避免出现内存泄漏等问题。

代码示例1:

using System;
using System.Net.Sockets;

class Program
{
    static void Main(string[] args)
    {
        string serverIp = "127.0.0.1";
        int serverPort = 12345;

        // 创建 Socket 对象并连接到服务器
        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        socket.Connect(serverIp, serverPort);

        // 发送数据并接收服务器返回的数据
        byte[] sendData = System.Text.Encoding.UTF8.GetBytes("Hello, world!");
        socket.Send(sendData);

        byte[] recvData = new byte[1024];
        int recvSize = socket.Receive(recvData);
        string recvMsg = System.Text.Encoding.UTF8.GetString(recvData, 0, recvSize);
        Console.WriteLine("[Server]: {0}", recvMsg);

        // 定时发送心跳包并检测连接状态
        while (true)
        {
            try
            {
                // 发送心跳包
                byte[] heartbeatData = System.Text.Encoding.UTF8.GetBytes("heartbeat");
                socket.Send(heartbeatData);

                // 接收服务器返回的心跳包响应
                byte[] heartbeatResp = new byte[1024];
                int respSize = socket.Receive(heartbeatResp);
                if (respSize == 0)
                {
                    throw new Exception("Connection failed: no response received.");
                }

                string respMsg = System.Text.Encoding.UTF8.GetString(heartbeatResp, 0, respSize);
                Console.WriteLine("[Server]: {0}", respMsg);

                // 等待一段时间后再次发送心跳包
                System.Threading.Thread.Sleep(5000);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);

                // 连接断开,关闭当前连接并尝试重新连接
                socket.Close();
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socket.Connect(serverIp, serverPort);
            }
        }
    }
}

代码示例2:

using System;
using System.IO;
using System.Net.Sockets;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        string serverIp = "127.0.0.1";
        int serverPort = 12345;
        string logFile = @"C:\log.txt";

        // 创建 Socket 对象并连接到服务器
        Log("Connecting to server...");
        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        try
        {
            socket.Connect(serverIp, serverPort);
            Log("Connected to server.");
        }
        catch (Exception ex)
        {
            Log("Connection failed: " + ex.Message);
            return;
        }

        // 发送数据并接收服务器返回的数据
        byte[] sendData = Encoding.UTF8.GetBytes("Hello, world!");
        try
        {
            Log("Sending data to server...");
            socket.Send(sendData);

            byte[] recvData = new byte[1024];
            int recvSize = socket.Receive(recvData);
            string recvMsg = Encoding.UTF8.GetString(recvData, 0, recvSize);
            Log("[Server]: " + recvMsg);
        }
        catch (Exception ex)
        {
            Log("Error sending or receiving data: " + ex.Message);
            socket.Close();
            return;
        }

        // 定时发送心跳包并检测连接状态
        while (true)
        {
            try
            {
                // 发送心跳包
                byte[] heartbeatData = Encoding.UTF8.GetBytes("heartbeat");
                socket.Send(heartbeatData);
                Log("Sent heartbeat.");

                // 接收服务器返回的心跳包响应
                byte[] heartbeatResp = new byte[1024];
                int respSize = socket.Receive(heartbeatResp);
                if (respSize == 0)
                {
                    throw new Exception("Connection failed: no response received.");
                }

                string respMsg = Encoding.UTF8.GetString(heartbeatResp, 0, respSize);
                Log("[Server]: " + respMsg);

                // 等待一段时间后再次发送心跳包
                System.Threading.Thread.Sleep(5000);
            }
            catch (Exception ex)
            {
                Log("Error sending or receiving heartbeat: " + ex.Message);

                // 连接断开,关闭当前连接并尝试重新连接
                socket.Close();
                Log("Disconnected from server. Trying to reconnect...");
                try
                {
                    socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    socket.Connect(serverIp, serverPort);
                    Log("Connected to server.");
                }
                catch (Exception ex2)
                {
                    Log("Reconnection failed: " + ex2.Message);
                }
            }
        }
    }

    static void Log(string message)
    {
        string timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
        string logMessage = "[" + timestamp + "] " + message;
        Console.WriteLine(logMessage);

        using (StreamWriter writer = File.AppendText(@"C:\log.txt"))
        {
            writer.WriteLine(logMessage);
        }
    }
}

单客户端连接多服务器代码示例文章来源地址https://www.toymoban.com/news/detail-537038.html


using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;

class Client {
    // 声明变量
    private static List<TcpClient> clients = new List<TcpClient>(); // 多个服务端
    private static bool run = true; // 运行状态
    private static bool connected = false; // 连接状态
    private static StreamWriter logFile; // 日志文件

    static void Main(string[] args) {
        // 创建日志文件
        logFile = new StreamWriter("log.txt", true);
        logFile.AutoFlush = true;

        // 连接多个服务端
        Connect("192.168.0.1", 5000);
        Connect("192.168.0.2", 5000);

        // 执行心跳检测和断线重连
        while (run) {
            if (!connected) {
                // 断线重连
                Reconnect();
            } else {
                // 执行心跳检测
                foreach (TcpClient client in clients) {
                    if (client.Connected) {
                        NetworkStream stream = client.GetStream();
                        byte[] message = System.Text.Encoding.ASCII.GetBytes("PING");
                        stream.Write(message, 0, message.Length);
                    }
                }
                Thread.Sleep(10000); // 等待10秒
            }
        }

        // 关闭日志文件
        logFile.Close();
    }

    static void Connect(string ip, int port) {
        try {
            TcpClient client = new TcpClient(ip, port);
            clients.Add(client);
            connected = true;
            logFile.WriteLine("Connected to " + ip + ":" + port);
            // 启动接收线程
            Thread receiveThread = new Thread(new ParameterizedThreadStart(Receive));
            receiveThread.Start(client);
        } catch (Exception e) {
            logFile.WriteLine("Error connecting to " + ip + ":" + port + " - " + e.Message);
        }
    }

    static void Reconnect() {
        logFile.WriteLine("Trying to reconnect...");
        foreach (TcpClient client in clients) {
            try {
                if (!client.Connected) {
                    client.Connect(((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString(), ((IPEndPoint)client.Client.RemoteEndPoint).Port);
                    connected = true;
                    logFile.WriteLine("Reconnected to " + ((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString() + ":" + ((IPEndPoint)client.Client.RemoteEndPoint).Port);
                    // 启动接收线程
                    Thread receiveThread = new Thread(new ParameterizedThreadStart(Receive));
                    receiveThread.Start(client);
                }
            } catch (Exception e) {
                logFile.WriteLine("Error reconnecting to " + ((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString() + ":" + ((IPEndPoint)client.Client.RemoteEndPoint).Port + " - " + e.Message);
            }
        }
        Thread.Sleep(5000); // 等待5秒
    }

    static void Receive(object clientObject) {
        TcpClient client = (TcpClient)clientObject;
        NetworkStream stream = client.GetStream();
        byte[] message = new byte[1024];
        int bytesRead;
        while (run) {
            try {
                bytesRead = stream.Read(message, 0, message.Length);
                if (bytesRead > 0) {
                    string data = System.Text.Encoding.ASCII.GetString(message, 0, bytesRead);
                    logFile.WriteLine("Received data: " + data);
                }
            } catch (Exception e) {
                connected = false;
                logFile.WriteLine("Error receiving data from " + ((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString() + ":" + ((IPEndPoint)client.Client.RemoteEndPoint).Port + " - " + e.Message);
                break;
            }
        }
    }
}

到了这里,关于C#使用TCP/IP长连接获取数据、心跳检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • TCP长连接的连接池、容量控制与心跳保活

    TCP 本身并没有长短连接的区别,长短与否,完全取决于我们怎么用它。 短连接:每次通信时,创建 Socket;一次通信结束,调用 socket.close()。这就是一般意义上的短连接,短连接的好处是管理起来比较简单,存在的连接都是可用的连接,不需要额外的控制手段。 长连接:每次

    2023年04月23日
    浏览(25)
  • Java IO流(五)Netty实战[TCP|Http|心跳检测|Websocket]

    Server端  Client 运行结果 Server Client 运行结果  注意: 需要调整readerIdleTime|writerIdleTime|allIdleTime参数才会显示对应超时信息 服务端 客户端(浏览器) 效果图

    2024年02月11日
    浏览(26)
  • java.net.SocketTimeoutException: Read timed out,tcp连接心跳[TCP Keep-Alive],socket模拟http

     读超时con.setReadTimeout(3 * 60 * 60 * 1000);已设置为3小时。 日志 日志发现 等待了 3小时,抛出了异常 经过排查,是因为 后端防火墙,连接空闲20分钟,连接就会被丢弃。 解决办法是,使用 socket.setKeepAlive(true); 注意HttpURLConnection的connection.setRequestProperty(\\\"Connection\\\", \\\"keep-alive\\\");是不

    2024年02月07日
    浏览(26)
  • C++ Qt TCP的心跳检测机制,断线重连技术,应用层代码重新实现

    目录 前言: 一、Qt直接启动本身的KeepAlive 二、在应用层自己实现一个心跳检测  三、自定义心跳代码实现: 完整客户端服务端工程下载: 共用的结构体相关头文件:         客户端部分核心代码:         服务端部分核心代码: 运行结果展示: 前两篇关于qt tcp 相关的,

    2024年02月05日
    浏览(31)
  • 如何实现无公网ip固定TCP端口地址远程连接Oracle数据库

    Oracle,是甲骨文公司的一款关系数据库管理系统,它在数据库领域一直处于领先地位。可以说Oracle数据库系统是世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小微机环境。它是一种高效率的、可靠性好的、适应高吞吐量的数据

    2024年01月18日
    浏览(36)
  • C#中 怎么检测Tcp网线断开?

    在 C# 中,如果使用 TcpClient 或 TcpListener 这样的套接字进行通信,并且网络连接断开,不发送心跳是无法立即检测到断开的。这是因为 TCP 协议本身没有内置的机制来检测连接是否还活动中。 当使用 TCP 进行通信时,通常是通过发送和接收数据来维持连接的活跃状态。如果没有

    2024年02月03日
    浏览(40)
  • 从TCP/IP到TCP连接过程(详解三次握手

    概述 OSI七层模型是一个概念(标准),TCP/IP是一种更加简化和实用的模型 TCP/IP四层模型各层作用 四层模型 功能 协议 应用层 负责处理用户和应用程序之间的通信。例如数据交换的格式和规则,以便不同的应用程序能够相互通信。 HTTP:超文本传输协议,用于Web页面的传输。

    2024年04月17日
    浏览(29)
  • TCP/IP(十一)TCP的连接管理(八)socket网络编程

    一  socket网络编程  socket 基本操作函数 bind、listen、connect、accept、recv、send、select、close ①  针对 TCP 应该如何 Socket 编程? ②   listen 时候参数 backlog 的意义? ③  accept 发生在三次握手的哪一步? ④   客户端调用 close 了,连接是断开的流程是什么? ⑤  没有 accept,能建立 T

    2024年02月07日
    浏览(41)
  • 【NVIDIA JETSON AGX XAVIER】与个人笔记本(win11)建立TCP-IP连接传输数据(含源码)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 NVIDIA JETSON AGX XAVIER当作客户端 个人笔记本(win11)当作服务器 首先要将Xavier与笔记本通过网线连接起来,实现Xavier联网(两者 可以相互ping通 就可以)并且需要知道 笔记本的ip地址 (假如现在是192.16

    2024年03月17日
    浏览(41)
  • openGauss学习笔记-100 openGauss 数据库管理-管理数据库安全-客户端接入之用SSL进行安全的TCP/IP连接

    100.1 背景信息 openGauss支持SSL标准协议(TLS 1.2),SSL协议是安全性更高的协议标准,它们加入了数字签名和数字证书来实现客户端和服务器的双向身份验证,保证了通信双方更加安全的数据传输。 100.2 前提条件 从CA认证中心申请到正式的服务器、客户端的证书和密钥。(假设

    2024年02月05日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包