C# Socket类实现TCP/IP通信客户端
在本文中,我们将学习如何使用C#编写一个基本的TCP/IP客户端,以便在计算机之间进行通信。Socket是C#中用于网络通信的基本类之一,它允许应用程序在本地计算机和远程计算机之间进行通信。在本文中,我们将使用Socket类来创建一个TCP/IP客户端应用程序,以便可以从本地计算机向远程计算机发送数据。
TCP/IP,即传输控制协议/网际协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议,同时也是一种应用广泛的网络协议。
TCP/IP协议包含了两个主要的协议:传输控制协议(TCP)和网际协议(IP)。
TCP(Transmission Control Protocol):传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。它负责在数据发送和接收设备之间建立连接,确保数据的有序传输,并检查数据在传输过程中是否出错。
IP(Internet Protocol):网际协议是用于发送和接收数据包的协议。每个使用TCP/IP的设备都有一个独一无二的IP地址,这使得数据能够被正确地发送到目标设备。
TCP/IP协议是互联网的基础,所有的互联网数据通信都是基于TCP/IP协议进行的。
实现一个客户端
Socket类进行TCP/IP通信的客户端流程
创建Socket实例:客户端首先需要创建一个Socket实例。这需要指定地址族(通常为AddressFamily.InterNetwork),套接字类型(通常为SocketType.Stream)和协议类型(通常为ProtocolType.Tcp)。
连接到服务器:使用Socket实例的Connect方法连接到服务器。这需要一个IPEndPoint实例,该实例指定服务器的IP地址和端口号。
发送数据:一旦连接到服务器,客户端就可以使用Socket实例的Send方法发送数据。数据需要转换为字节数组才能发送。
接收数据:客户端可以使用Socket实例的Receive方法来接收服务器的响应。这将返回一个字节数组,可以转换为字符串或其他类型的数据。
关闭连接:完成通信后,使用Socket实例的Close方法关闭连接。
使用sokit测试工具
public partial class Form1 : Form
{
Socket clientSocket;
public Form1()
{
InitializeComponent();
}
private async void btnConnect_Click(object sender, EventArgs e)
{
try
{
// 创建一个Socket
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 连接到服务器
clientSocket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 3001));
MessageBox.Show("Connected to server.");
await ReceiveDataAsync();
}
catch (Exception ex)
{
MessageBox.Show("Error: " + ex.Message);
}
}
private void btnSend_Click(object sender, EventArgs e)
{
if (clientSocket.Connected)
{
// 将消息转换为字节
byte[] bytesToSend = Encoding.ASCII.GetBytes(txtSend.Text);
// 发送消息
clientSocket.Send(bytesToSend);;
}
else
{
MessageBox.Show("Please connect to the server first.");
}
}
private async Task ReceiveDataAsync()
{
while (clientSocket.Connected)
{
try
{
byte[] bytesToReceive = new byte[1024];
var receiveTask = clientSocket.ReceiveAsync(bytesToReceive, SocketFlags.None);
//超过5秒后提示出错
if (await Task.WhenAny(receiveTask, Task.Delay(5000)) == receiveTask)
{
int bytesReceived = receiveTask.Result;
string response = Encoding.ASCII.GetString(bytesToReceive, 0, bytesReceived);
this.Invoke(() =>
{
txtReceive.AppendText(response);
txtReceive.AppendText(System.Environment.NewLine);
});
}
else
{
txtReceive.AppendText("error");
txtReceive.AppendText(System.Environment.NewLine);
}
}
catch (Exception ex)
{
txtReceive.AppendText("error");
txtReceive.AppendText(System.Environment.NewLine);
}
}
}
private void btnClose_Click(object sender, EventArgs e)
{
if (clientSocket.Connected)
{
clientSocket.Close();
}
}
}
更新于:4个月前相关文章
- .NET C# EntityFramework(EF)连接SQLite代码示例
- 【说站】python中Queue如何通信
- .NET9 C# 13 有哪些新特性?
- C#中的String和StringBuilder的区别
- .NET C#中的IEnumerable和IEnumerator的区别
- C# Const 和 ReadOnly的区别
- C# 使用Barrier进行多线程同步
- C#发送邮件代码简洁示例(附源码下载)
- C# Word转换成Pdf的方法
- c#使用MongoDB开发LBS应用
- hprose for C#使用教程
- c#实现与Java无差异的GZip压缩和GZip解压缩
- .NET Core c#使用SkiaSharp压缩裁切图片去除水印
- c# decimal保留2位小数 并向下舍入
- .NET Core c#使用SkiaSharp压缩图片
- C#复制文件到指定文件夹
- c#获取枚举的Description
- c#读取pdf里的表格
- c# HttpClient下载图片
- c#使用HtmlAgilityPack编辑html并保存