C# Socket数据接收的三种实现方式
前言
在网络通信过程中,数据的传递是至关重要的一个环节,而数据的收发是Socket编程中最为重要的操作之一。本文将探讨Socket数据接收方面的内容,介绍C# Socket数据接收的三种实现方式。
Socket数据接收的三种实现方式
在C# Socket编程中,Socket数据接收主要有以下三种实现方式:
- 阻塞式接收(Blocking)
- 异步回调接收(Asynchronous)
- 同步回调接收(Synchronous)
下面我们将分别对这三种实现方式进行详细介绍,并附上相应的代码示例。
1. 阻塞式接收(Blocking)
阻塞式接收是指当Socket没有数据可接收时,程序将会一直等待,直到有数据到来为止。
以下是阻塞式接收的示例代码:
using System;
using System.Net.Sockets;
public class Program
{
public static void Main()
{
// 创建Socket对象
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 绑定IP地址和端口号
serverSocket.Bind(new IPEndPoint(IPAddress.Any, 8000));
// 开始监听
serverSocket.Listen(10);
// 接受客户端请求
Console.WriteLine("等待客户端连接...");
Socket clientSocket = serverSocket.Accept();
// 接收数据
byte[] buffer = new byte[1024];
int length = clientSocket.Receive(buffer);
// 输出接收到的数据
Console.WriteLine("接收到的数据:" + Encoding.Default.GetString(buffer, 0, length));
// 关闭Socket
clientSocket.Close();
serverSocket.Close();
}
}
以上代码中,先创建一个Socket对象,然后绑定IP地址和端口号,开始监听客户端的连接请求。当有客户端连接到服务器后,接收到客户端发送的数据,输出接收到的数据。最后关闭连接。
2. 异步回调接收(Asynchronous)
异步回调接收是指程序不会一直等待Socket数据到来,而是利用回调函数的方式,等待数据到来时触发回调函数并执行相应的操作。
以下是异步回调接收的示例代码:
using System;
using System.Net.Sockets;
public class Program
{
private static byte[] buffer = new byte[1024];
public static void Main()
{
// 创建Socket对象
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 绑定IP地址和端口号
serverSocket.Bind(new IPEndPoint(IPAddress.Any, 8000));
// 开始监听
serverSocket.Listen(10);
// 接受客户端请求
Console.WriteLine("等待客户端连接...");
serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), serverSocket);
Console.ReadLine();
}
private static void AcceptCallback(IAsyncResult ar)
{
// 获取Socket对象
Socket serverSocket = ar.AsyncState as Socket;
// 结束Socket连接
Socket clientSocket = serverSocket.EndAccept(ar);
// 接收数据
clientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), clientSocket);
}
private static void ReceiveCallback(IAsyncResult ar)
{
// 获取Socket对象
Socket clientSocket = ar.AsyncState as Socket;
// 结束Socket连接
int length = clientSocket.EndReceive(ar);
// 输出接收到的数据
Console.WriteLine("接收到的数据:" + Encoding.Default.GetString(buffer, 0, length));
// 关闭Socket
clientSocket.Close();
}
}
以上代码中,与阻塞式接收方式相比,唯一不同的是异步回调接收方式使用了另外两个函数:AcceptCallback和ReceiveCallback,在接收到客户端请求和数据的时候分别被调用。在主函数中先开始监听,当有客户端连接上时,触发AcceptCallback函数,接收到客户端发送的数据时,触发ReceiveCallback函数。最终完成数据接收。
3. 同步回调接收(Synchronous)
同步回调接收是指程序会一直等待Socket数据到来,在接收到数据之后执行相应的操作。
以下是同步回调接收的示例代码:
using System;
using System.Net.Sockets;
public class Program
{
private static byte[] buffer = new byte[1024];
public static void Main()
{
// 创建Socket对象
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 绑定IP地址和端口号
serverSocket.Bind(new IPEndPoint(IPAddress.Any, 8000));
// 开始监听
serverSocket.Listen(10);
// 接受客户端请求
Console.WriteLine("等待客户端连接...");
Socket clientSocket = serverSocket.Accept();
// 接收数据
int length = clientSocket.Receive(buffer);
// 输出接收到的数据
Console.WriteLine("接收到的数据:" + Encoding.Default.GetString(buffer, 0, length));
// 关闭Socket
clientSocket.Close();
serverSocket.Close();
}
}
同步回调接收方式与阻塞式接收方式非常类似,唯一的区别在于程序不会一直等待,而是等待数据到来,一旦数据到来,立即执行相应的操作。以上代码中,除此之外几乎与阻塞式接收方式一致。
至此,C# Socket数据接收的三种实现方式全部介绍完毕。这些方式各有优缺点,开发者可以根据具体的需求应用到自己的项目中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# Socket数据接收的三种实现方式 - Python技术站