编辑
2025-09-27
C#
00

目录

摘要
正文
写一个服务器
BeginReceive方法用于开始异步接收数据。该方法的参数如下:
BeginAccept是.NET框架中的一个方法,用于开始一个异步操作,以等待一个来自客户端的连接请求。

摘要

在计算机科学中,TCP/IP协议是一种网络通信协议,它被广泛用于计算机之间的通信。为了在计算机之间进行通信,我们需要编写服务器端代码来处理客户端的请求,并向客户端发送响应。在本文中,我们将学习如何使用C#编写一个基本的TCP/IP服务器端,以便在计算机之间进行通信。

正文

  • Socket类用于网络通信。
  • Bind方法将Socket绑定到本地的一个网络地址和端口号。
  • Listen方法使Socket开始监听连接请求。
  • BeginAcceptEndAccept方法异步接受一个连接请求,返回一个表示连接的Socket对象。
  • BeginReceiveEndReceive方法异步从Socket接收数据。

写一个服务器

image.png

C#
public partial class Form1 : Form { Socket serverSocket; public Form1() { InitializeComponent(); } private void btnStart_Click(object sender, EventArgs e) { try { // 初始化Socket类的新实例 serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 将socket绑定到本地端点并侦听传入的连接 serverSocket.Bind(new IPEndPoint(IPAddress.Any, 3001)); serverSocket.Listen(10); MessageBox.Show("服务器已启动。"); // 开始接受传入的连接 serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null); } catch (Exception ex) { MessageBox.Show("错误: " + ex.Message); } } private void AcceptCallback(IAsyncResult ar) { try { while (true) { // 完成连接请求 Socket clientSocket = serverSocket.EndAccept(ar); // 开始接收来自客户端的数据 byte[] buffer = new byte[1024]; clientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback) , new StateObject { WorkSocket = clientSocket, Buffer = buffer }); // 重新开始接受传入的连接 serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null); } } catch (Exception ex) { MessageBox.Show("接受连接时出错: " + ex.Message); } } private void ReceiveCallback(IAsyncResult ar) { try { // 从异步状态对象获取客户端socket和buffer StateObject state = (StateObject)ar.AsyncState; Socket clientSocket = state.WorkSocket; byte[] buffer = state.Buffer; // 完成接收操作 int bytesRead = clientSocket.EndReceive(ar); if (bytesRead > 0) { // 将数据转换为字符串 string data = Encoding.UTF8.GetString(buffer, 0, bytesRead); // 显示接收到的数据 this.Invoke(() => { txtReceive.AppendText(data); txtReceive.AppendText(System.Environment.NewLine); }); } } catch (Exception ex) { MessageBox.Show("接收数据时出错: " + ex.Message); } } } public class StateObject { public Socket WorkSocket = null; public byte[] Buffer; }

BeginReceive方法用于开始异步接收数据。该方法的参数如下:

  1. buffer:类型为byte[],这是用于存储接收到的数据的字节数组。
  2. offset:类型为int,这是buffer中开始存储数据的位置。通常设置为0,表示从数组的开始位置存储数据。
  3. size:类型为int,这是要接收的最大字节数。通常设置为buffer的长度,表示可以接收的最大数据量就是buffer的大小。
  4. socketFlags:类型为SocketFlags,这是控制Socket行为的标志。通常设置为SocketFlags.None
  5. callback:类型为AsyncCallback,这是接收操作完成时要调用的方法的委托。这个方法应该接受一个IAsyncResult参数,并且没有返回值。
  6. state:类型为object,这是一个用户定义的对象,它将此对象的信息传递给回调方法。可以将任何需要在回调方法中使用的数据放在这个对象中。

因此,clientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), state);这行代码的意思是:开始异步接收数据,将接收到的数据存储在buffer数组中,从数组的开始位置存储,最多接收buffer.Length个字节的数据,当接收操作完成时,调用ReceiveCallback方法,并将state对象传递给它。

BeginAccept是.NET框架中的一个方法,用于开始一个异步操作,以等待一个来自客户端的连接请求。

这个方法的参数是一个AsyncCallback委托,这个委托指向的方法将在接收到连接请求并接受这个请求后被调用。这个方法的参数是一个IAsyncResult对象,这个对象包含了异步操作的状态信息。

调用serverSocket.BeginAccept方法后,服务器会开始监听,当有客户端尝试连接时,服务器会接受这个连接请求,然后调用AsyncCallback委托指向的方法。这个方法通常会处理来自客户端的数据。

在你的代码中,serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);这行代码的意思是:开始异步接受连接请求,当接收到连接请求并接受这个请求后,调用AcceptCallback方法。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!