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协议进行的。

8d15d8631dc0affbf46bd64f1c35492a.jpeg

实现一个客户端

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

创建Socket实例:客户端首先需要创建一个Socket实例。这需要指定地址族(通常为AddressFamily.InterNetwork),套接字类型(通常为SocketType.Stream)和协议类型(通常为ProtocolType.Tcp)。

连接到服务器:使用Socket实例的Connect方法连接到服务器。这需要一个IPEndPoint实例,该实例指定服务器的IP地址和端口号。

发送数据:一旦连接到服务器,客户端就可以使用Socket实例的Send方法发送数据。数据需要转换为字节数组才能发送。

接收数据:客户端可以使用Socket实例的Receive方法来接收服务器的响应。这将返回一个字节数组,可以转换为字符串或其他类型的数据。

关闭连接:完成通信后,使用Socket实例的Close方法关闭连接。

使用sokit测试工具

2f099a0cc22390d27f6003eb0f72cda3.jpeg

ea526b3de962e72d1aff484b24022bd6.jpeg

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

转自:.NET绿叶社区

leavescn.com/Articles/Content/3187

版权声明:本文来源于网络收集或网友供稿,仅供学习交流之用,如有侵权,请留言转告小编立即删除。

- EOF -

技术群:添加小编微信dotnet999

公众号:dotnet讲堂 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值