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 编程

相关推荐
JoySSLLian5 小时前
手把手教你安装免费SSL证书(附宝塔/Nginx/Apache配置教程)
网络·人工智能·网络协议·tcp/ip·nginx·apache·ssl
Zach_yuan5 小时前
自定义协议:实现网络计算器
linux·服务器·开发语言·网络
猫头虎5 小时前
如何解决 OpenClaw “Pairing required” 报错:两种官方解决方案详解
网络·windows·网络协议·macos·智能路由器·pip·scipy
charlotte102410246 小时前
高并发:关于在等待学校教务系统选课时的碎碎念
java·运维·网络
Zaralike6 小时前
Linux 服务器网络不通排查 SOP(标准操作流程)
linux·服务器·网络
云姜.6 小时前
网络协议----OSI七层网络协议 和 TCP/IP四层(五层)网络协议
网络·网络协议
!chen6 小时前
LabVIEW TCP Server端工具TCP通信
网络·tcp/ip·labview
枷锁—sha7 小时前
【SRC】SQL注入快速判定与应对策略(一)
网络·数据库·sql·安全·网络安全·系统安全
郝学胜-神的一滴7 小时前
深入解析C/S模型下的TCP通信流程:从握手到挥手的技术之旅
linux·服务器·c语言·网络·网络协议·tcp/ip
池央7 小时前
CANN 算子诊断与故障定位:oam-tools 在异构计算错误解析中的作用
网络