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

相关推荐
这个DBA有点耶13 分钟前
数据库一体机架构演进:从硬件堆叠到软硬深度耦合
服务器·网络·数据库·硬件架构·运维开发·database·数据库架构
arbboter38 分钟前
【网络工具】NetProxy网络代理用户手册
开发语言·网络·c#·网络代理·网络异常·代理工具
走,带你去玩1 小时前
windows电脑 trae对接lanhu-mcp
windows
消失的旧时光-19432 小时前
第一篇:Ktor Client 到底是什么?从 Retrofit 迁移理解 Ktor 网络请求架构
网络·架构·retrofit·ktor·dsl
数据知道3 小时前
反序列化漏洞:Java、PHP、Python 三条线各讲透
java·网络·python·安全·网络安全·php
江畔柳前堤3 小时前
Function Calling 与 Tool Calling:从认知到工程的全景深度解析
开发语言·网络·人工智能·深度学习·算法·机器学习·php
LabVIEW开发3 小时前
LabVIEW 通过以太网控制 Yokogawa WT3000 功率分析仪:tmctl.dll 与原始套接字方案
网络·labview·labview知识·labview功能·labview程序
xiaoxiangsiyan4 小时前
企业日常运维高频应用服务全解
运维·网络·云原生·容器·dns
那年窗外下的雪.4 小时前
AIDC 学习日志 Day 3:OSPF Underlay 实验、故障排查与深入解析
服务器·网络·php
星恒讯工业路由器5 小时前
IP地址冲突:成因、影响与工业网络中的应对策略
网络·信息与通信·ip地址冲突·工业网络·网络故障排查·ip-mac绑定