从此
📄文章 #️⃣专题 🌐酷站 👨‍💻技术 📺 📱

🏠 » 📄文章 » 内容

 欢迎来访!

C#.NET TCP、UDP、Socket

🕗2024-07-25👁️4

进程间通信的方式主要是有命名管道、消息队列、共享内存、Socket通信,个人用的最多的是Sokcet相关。

Socket

Socket是传输通信协议么?No,Socket是一种传输层和应用层之间、用于实现网络通信的编程接口。Socket可以使用各种协议如TCP、UDP协议实现进程通信,TCP/UDP才是传输通信协议

Socket位于传输层与应用层之间,接口在System.Net.Sockets命名空间下。下面是Socket以TCP通信的DEMO:

    //创建一个 Socket 实例
    Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    
    //连接到服务器
    clientSocket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8000));
    
    //发送数据
    string message = "Hello, Server!";
    byte[] data = Encoding.ASCII.GetBytes(message);
    clientSocket.Send(data);
    
    //接收数据
    byte[] buffer = new byte[1024];
    int bytesRead = clientSocket.Receive(buffer);
    Debug.WriteLine(Encoding.ASCII.GetString(buffer, 0, bytesRead));
    
    clientSocket.Close();

 

TcpClient/UdpClient

TCP/UDP均是位于传输层的通信协议,所以Socket的使用也是位于传输层的通信操作

TCP是面向连接,提供可靠、顺序的数据流传输。用于一对一的通信,即一个TCP连接只能有一个发送方和一个接收方。详细连接方式是,先通过三次握手建立连接、然后传输数据,传输数据完再通过4次挥手关闭连接。所以适用于需要数据完整性和可靠传输的场景

而UDP则是无连接的,不需要建立和维护连接状态,不提供确认机制,也不重传丢失的数据报,但也因此传输实时性高,适合低延时、数据量小、广播场景

基于Socket抽象编程接口,TCP、UDP构建更高级别抽象网络编程TcpClient、UdpClient,它们用于简化TCP网络编程中的常见任务

TcpClient、UdpClient是 .NET 提供的用于方便管理TCP和UDP网络通信的类,下面是对应的Demo

Tcp服务端:

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

class TcpServerExample
{
    public static void Main()
    {
        TcpListener listener = new TcpListener(“127.0.0.1", 8000);
        listener.Start();
        Console.WriteLine("Server is listening on port 8000...");

        TcpClient client = listener.AcceptTcpClient();
        NetworkStream stream = client.GetStream();

        byte[] data = new byte[1024];
        int bytesRead = stream.Read(data, 0, data.Length);
        Console.WriteLine("Received: " + Encoding.ASCII.GetString(data, 0, bytesRead));

        byte[] response = Encoding.ASCII.GetBytes("Hello, Client!");
        stream.Write(response, 0, response.Length);

        stream.Close();
        client.Close();
        listener.Stop();
    }
}

TCP客户端:

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

class TcpClientExample
{
    public static void Main()
    {
        TcpClient client = new TcpClient("127.0.0.1", 8000);
        NetworkStream stream = client.GetStream();

        byte[] message = Encoding.ASCII.GetBytes("Hello, Server!");
        stream.Write(message, 0, message.Length);

        byte[] data = new byte[1024];
        int bytesRead = stream.Read(data, 0, data.Length);
        Debug.WriteLine("Received: " + Encoding.ASCII.GetString(data, 0, bytesRead));

        stream.Close();
        client.Close();
    }
}

 

Udp服务端:

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

class UdpServerExample
{
    public static void Main()
    {
        UdpClient udpServer = new UdpClient(8000);
        IPEndPoint remoteEP = new IPEndPoint(”127.0.0.1“, 0);

        Console.WriteLine("Server is listening on port 8000...");

        byte[] data = udpServer.Receive(ref remoteEP);
        Console.WriteLine("Received: " + Encoding.ASCII.GetString(data));

        byte[] response = Encoding.ASCII.GetBytes("Hello, Client!");
        udpServer.Send(response, response.Length, remoteEP);

        udpServer.Close();
    }
}

UDP客户端:

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

class UdpClientExample
{
    public static void Main()
    {
        UdpClient udpClient = new UdpClient();
        IPEndPoint remoteEP = new IPEndPoint(”127.0.0.1", 8000);

        byte[] message = Encoding.ASCII.GetBytes("Hello, Server!");
        udpClient.Send(message, message.Length, remoteEP);

        byte[] data = udpClient.Receive(ref remoteEP);
        Console.WriteLine("Received: " + Encoding.ASCII.GetString(data));

        udpClient.Close();
    }
}

上面是基本的网络通信DEMO,TcpClient用于基于连接、可靠的TCP通信,适用于需要数据完整性和可靠传输的场景。Udp用于无连接、不保证传输的UDP通信,适用于对实时性要求高、允许少量数据丢失的场景(如视频流)。会议场景下的传屏软件适合用这个协议,传屏发送端固定帧率一直推送,网络丢失几帧问题不大,重要的是延时低了很多。

TcpClient、UdpClient是位于传输层的通信类,分别实现了基于TCP和UDP协议的通信功能。