在计算机科学中,TCP/IP协议是一种网络通信协议,它被广泛用于计算机之间的通信。为了在计算机之间进行通信,我们需要编写服务器端代码来处理客户端的请求,并向客户端发送响应。在本文中,我们将学习如何使用C#编写一个基本的TCP/IP服务器端,以便在计算机之间进行通信。
Socket
类用于网络通信。Bind
方法将Socket
绑定到本地的一个网络地址和端口号。Listen
方法使Socket
开始监听连接请求。BeginAccept
和EndAccept
方法异步接受一个连接请求,返回一个表示连接的Socket
对象。BeginReceive
和EndReceive
方法异步从Socket
接收数据。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
方法用于开始异步接收数据。该方法的参数如下:buffer
:类型为byte[]
,这是用于存储接收到的数据的字节数组。offset
:类型为int
,这是buffer
中开始存储数据的位置。通常设置为0,表示从数组的开始位置存储数据。size
:类型为int
,这是要接收的最大字节数。通常设置为buffer
的长度,表示可以接收的最大数据量就是buffer
的大小。socketFlags
:类型为SocketFlags
,这是控制Socket行为的标志。通常设置为SocketFlags.None
。callback
:类型为AsyncCallback
,这是接收操作完成时要调用的方法的委托。这个方法应该接受一个IAsyncResult
参数,并且没有返回值。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 许可协议。转载请注明出处!