编辑
2025-09-27
C#
00

目录

摘要
正文
实现一个客户端
使用sokit测试工具

摘要

在本文中,我们将学习如何使用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协议进行的。

image.png

实现一个客户端

Socket类进行TCP/IP通信的客户端流程

  1. 创建Socket实例:客户端首先需要创建一个Socket实例。这需要指定地址族(通常为AddressFamily.InterNetwork),套接字类型(通常为SocketType.Stream)和协议类型(通常为ProtocolType.Tcp)。
  2. 连接到服务器:使用Socket实例的Connect方法连接到服务器。这需要一个IPEndPoint实例,该实例指定服务器的IP地址和端口号。
  3. 发送数据:一旦连接到服务器,客户端就可以使用Socket实例的Send方法发送数据。数据需要转换为字节数组才能发送。
  4. 接收数据:客户端可以使用Socket实例的Receive方法来接收服务器的响应。这将返回一个字节数组,可以转换为字符串或其他类型的数据。
  5. 关闭连接:完成通信后,使用Socket实例的Close方法关闭连接。

使用sokit测试工具

image.png

image.png

C#
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(); } } }

image.png

本文作者:技术老小子

本文链接:

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