C#开发: 通信篇-TCP客户端

 

 

 

前言

关于网络通信:

每一台电脑都有自己的ip地址,每台电脑上的网络应用程序都有自己的通信端口,

张三的电脑(ip:192.168.1.110)上有一个网络应用程序A(通信端口5000),

李四的电脑(ip:192.168.1.220)上有一个网络应用程序B(通信端口8000),

张三给李四发消息,首先你要知道李四的ip地址,向指定的ip(李四ip:192.168.1.220)发信息,

信息就发到了李四的电脑。

再指定一下发送的端口号(通信端口8000),信息就发到了李四电脑的网络应用程序B上。

TCP--一种网络通信方式而已。分为服务器(网络应用程序)和客户端(网络应用程序).

 

说明

这节教给大家用C#写一个TCP客户端程序

 

页面

C#开发: 通信篇-TCP客户端

 

 

 

请用户在学习这节之前务必先学完

C#开发: 通信篇-串口调试助手

以上文章涉及到的基础知识不再重复赘述

 

编写连接程序

 

官方文档:

https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.socket?view=netframework-4.8      Socket

https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.socket.beginconnect?view=netframework-4.8     beginconnect

 

1.定义一个 socket

C#开发: 通信篇-TCP客户端

 

 

 

 

 

private Socket MySocket = null;// Socket

 

 

 

 如果报错,按照下面步骤添加Socket对应的包(命名空间)

C#开发: 通信篇-TCP客户端

 

 

 

 

 

 C#开发: 通信篇-TCP客户端

 

 

 

 

 

 

 

 

2.编写点击按钮连接/断开程序

C#开发: 通信篇-TCP客户端

 

 

 

 

 

 

C#开发: 通信篇-TCP客户端

 

 

 

 

 

        /// <连接按钮点击事件>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            if (button1.Text == "连接"){
                //IP地址 和 端口号输入不为空
                if (string.IsNullOrEmpty(textBox1.Text) == false && string.IsNullOrEmpty(textBox2.Text) == false){
                    try{
                        IPAddress ipAddress = IPAddress.Parse(textBox1.Text);//获取IP地址
                        int Port = Convert.ToInt32(textBox2.Text);          //获取端口号

                        MySocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);

                        //使用 BeginConnect 异步连接
                        MySocket.BeginConnect(ipAddress, Port, new AsyncCallback(ConnectedCallback), MySocket);
                    }
                    catch (Exception){
                        MessageBox.Show("IP地址或端口号错误!", "提示");
                    }
                }
                else{
                    MessageBox.Show("IP地址或端口号错误!", "提示");
                }
            }
            else
            {
                try{
                    button1.Text = "连接";
                    MySocket.BeginDisconnect(false,null,null);//断开连接
                }
                catch (Exception){}
            }
        }
        /// <连接异步回调函数>
        /// 
        /// </summary>
        /// <param name="ar"></param>
        void ConnectedCallback(IAsyncResult ar)
        {
            Socket socket = (Socket)ar.AsyncState;
            try{
                socket.EndConnect(ar);
                
                Invoke((new Action(() =>
                {
                    textBox3.AppendText("成功连接服务器\n");//对话框追加显示数据
                    button1.Text = "断开";
                })));
            }
            catch (Exception e){
                Invoke((new Action(() =>
                {
                    textBox3.AppendText("连接失败:" + e.ToString());//对话框追加显示数据
                })));
            }
        }

 

 

3.测试

使用电脑调试助手建立一个TCP服务器

C#开发: 通信篇-TCP客户端

 

 

 

查看一下自己电脑的IP地址

C#开发: 通信篇-TCP客户端

 

 

 

 

或者点击控制面板,按照以下路径进入

C#开发: 通信篇-TCP客户端

 

 

 

C#开发: 通信篇-TCP客户端

 

 

 

C#开发: 通信篇-TCP客户端

 

 

 

 

 

C#开发: 通信篇-TCP客户端

 

 

 

C#开发: 通信篇-TCP客户端

 

 

 

C#开发: 通信篇-TCP客户端

 

 

 

 

关于同步和异步

就对于上面的连接而言,其实还有一个连接函数

 

C#开发: 通信篇-TCP客户端

 

 

 

 

 

首先大家应该知道,有些通信需要点时间才能完成

上面的 Connect函数执行以后就一直等待,直至连接成功才接着往下执行

Connect 函数就是个同步函数.

这样会造成程序卡机!如果卡机时间过长,程序就会报错误

一般把同步函数放到任务里面去执行,这样就避免了卡机

 

异步函数也是底层封装的函数,当执行完以后,不会停在那里

而是接着往下执行,有相应的事件以后才会跳转到回调函数里面去.

这是异步的好处

 

接收数据

https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.socket.beginreceive?view=netframework-4.8

 

先做饭吃饭................

 

C#开发: 通信篇-TCP客户端

上一篇:树莓派镜像烧录SDFormatterV4.0+ Win32DiskImagerV1.0


下一篇:google kaptcha 验证码的使用