雷达智富

首页 > 内容 > 程序笔记 > 正文

程序笔记

C# Socket类实现TCP/IP通信客户端

2024-07-21 59

在本文中,我们将学习如何使用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个月前
赞一波!

文章评论

评论问答