dotNet 之网络TCP

**硬件支持型号 点击 查看 硬件支持 详情**

DTU701 产品详情

DTU702 产品详情

DTU801 产品详情

DTU802 产品详情

DTU902 产品详情

G5501 产品详情

ARM dotnet 编程

dotNet使用TCP,可以使用Socket和TcpClient 、TcpListener类 2种,对于高级用户,建议使用Socket类,可以获得更大控制和性能。TcpClientTcpListener 内部都依赖于 Socket 类。

这里使用TcpClient 和 TcpListener,编写一个客户端和服务端程序,客户端发送数据服务端接收并显示,服务端发送数据,每一个客户都接收到数据并显示:

Socket编程可能会需要用到IPEndPoint、Dns、IPAddress等类,再往上TCP相关有TcpListener、TcpClient、NetworkStream,再往上就是大家熟悉的HttpClient等。

服务端代码如下:

复制代码
cs 复制代码
using System.Net;
using System.Net.Sockets;
using System.Text;
​
namespace hwapp
{
    class Program
    {
        /// 创建 TcpListener
        /// TcpListener 类型用于监视 TCP 端口上的传入请求,然后创建一个 Socket 或 TcpClient 来管理与客户端的连接。 
        static TcpListener tcpListener;
        static List<NetworkStream> networkStreams = new List<NetworkStream>();
        static void Main(string[] args) 
        {
            ///开启监听
            tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"), 9999);
            
            ///Start 方法可使用侦听,而 Stop 方法禁用端口上的侦听。
            tcpListener.Start(10); // 最多 同时 接收10个用户连接
            Console.WriteLine("启动服务(IP:127.0.0.1 端口:9999),等待客户端连接!");
            
            ///开启一个线程,循环等待客户端的连接
            Task.Run(() => { Accept(); });
​
            while(true)
            {
                /// 使用 NetworkStream 将数据写入连接的客户端
                var msg = Console.ReadLine();
                foreach (var item in networkStreams)
                {
                    item.Write(Encoding.UTF8.GetBytes(msg));
                }
            }
        }
​
        static void Accept()
        {
            while (true)
            {
                ///【阻塞】等待客户端的连接
                /// AcceptTcpClientAsync 方法接受传入的连接请求并创建 TcpClient 来处理请求
                TcpClient tcpClient = tcpListener.AcceptTcpClient();
                NetworkStream networkStream = tcpClient.GetStream();
                Console.WriteLine($"{tcpClient.Client.RemoteEndPoint}上线");
                networkStreams.Add(networkStream);
                ///开启一个新的线程 等待新的消息
                Task.Run(() => { Read(networkStream, tcpClient); });
            }
        }
​
        /// <summary>
        /// 接收消息
        /// </summary>
        /// <param name="networkStream"></param>
        static void Read(NetworkStream networkStream, TcpClient tcpClient)
        {
            while (true)
            {
                try
                {
                    byte[] buffer = new byte[1024 * 1024];
                    /// 【阻塞】等待接收新的消息
                    var readLen = networkStream.Read(buffer, 0, buffer.Length);
                    if (readLen == 0)
                    {
                        Console.WriteLine($"{tcpClient.Client.RemoteEndPoint}下线");
                        networkStreams.Remove(networkStream);
                        networkStream.Close();
                        tcpClient.Close();
                        return;
                    }
                    Console.WriteLine(tcpClient.Client.RemoteEndPoint + ":" + Encoding.UTF8.GetString(buffer, 0, readLen));
                }
                catch (Exception) { }
            }
        }
    }
}
​

客户端代码如下:

cs 复制代码
namespace IOTtcpClient
{
    class Program
    {
        /// 创建客户端套接字
        static TcpClient tcpClient;
        static NetworkStream networkStream;
        static void Main(string[] args)
        {
            Console.WriteLine("TCP tcp Client");
​
            var ipEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999);
​
            tcpClient = new TcpClient();
            try
            {
                /// 连接到服务器
                tcpClient.Connect(ipEndPoint);
                Console.WriteLine("连接成功");
                /// 创建 NetworkStream 以发送和接收数据
                /// 需要使用 GetStream() 方法实例化 NetworkStream,以便能够发送和接收数据
                networkStream = tcpClient.GetStream();
​
                //读取
                Task.Run(() => { Read(); });
​
                Console.WriteLine("=======");
                while (true)
                {
                    Console.Write("->");
                    var msg = Console.ReadLine();
                    /// 发送消息到服务端
                    networkStream.Write(Encoding.UTF8.GetBytes(msg));
                }
            }
            catch (Exception) {
                Console.WriteLine("连接失败");
            }
        }
​
        /// <summary>
        /// 接收数据
        /// </summary>
        static void Read()
        {
            while (networkStream.CanRead)
            {
                try
                {
                    byte[] buffer = new byte[1024 * 1024];
                    ///【阻塞】等待接收新的消息
                    var readLen = networkStream.Read(buffer, 0, buffer.Length);
                    if (readLen == 0)   ///客户端断开连接
                    {
                        Console.WriteLine("强行断开连接");
                        networkStream.Close();
                        return;
                    }
                    Console.WriteLine("<-" + Encoding.UTF8.GetString(buffer, 0, readLen));
                }
                catch (Exception) { }
            }
        }
    }
}

更多信息 请查看 dotNet基础知识.pdf

DTU系列 说明

**硬件支持型号 点击 查看 硬件支持 详情**

DTU701 产品详情

DTU702 产品详情

DTU801 产品详情

DTU802 产品详情

DTU902 产品详情

G5501 产品详情

ARM dotnet 编程

相关推荐
MXsoft6187 小时前
在大型混合云网络环境中,如何高效实现自动化运维?
运维·网络·自动化
love530love14 小时前
OpenClaw Windows Companion 桌面客户端 连接 LM Studio 完整配置指南
人工智能·windows·python·openclaw
xian_wwq21 小时前
【案例分析】Hugging Face生产基础设施入侵攻击分析
网络·安全
灵机一物1 天前
企业选型参考:2026 CXL 内存扩展方案六强测评与落地指南
服务器·网络·数据库·人工智能
yeflx1 天前
速腾Airy雷达使用记录
java·服务器·网络
CPETW1 天前
企业版配套软件介绍 ---- USB TO SPI 3.0-Slave
网络·科技·单片机·嵌入式硬件·电子
jsons11 天前
autofs挂载
linux·服务器·网络
2401_873479401 天前
如何识别C2通信中的恶意出站IP?IP离线库+威胁情报融合方案
网络·tcp/ip·安全·ip
你驴我1 天前
WhatsApp Cloud API 速率限制下的令牌桶与退避策略实践
网络·后端·python
Eloudy1 天前
QSFP28、RoCEv2、RFSoC-4x2 数据传输与器件链路
网络·fpga开发·rocev2