这一篇文章,我将图文并茂地介绍Socket编程的基础知识,我相信,如果你按照步骤做完实验,一定可以对Socket编程有更好地理解。

本文源代码,可以通过这里下载 http://files.cnblogs.com/chenxizhang/SocketWorkshop.rar

第一步:创建解决方案

第二步:创建服务端程序

这里可以选择“Console Application”这个类型,比较方便调试

然后编写如下代码,实现服务器的基本功能

using System;using System.Collections.Generic;using System.Linq;using System.Text;

//额外导入的两个命名空间using System.Net.Sockets;using System.Net;

namespace SocketServer{class Program    {/// <summary>/// Socket Server 演示/// 作者:陈希章/// </summary>/// <param name="args"></param>static void Main(string[] args)        {//创建一个新的Socket,这里我们使用最常用的基于TCP的Stream Socket(流式套接字)            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//将该socket绑定到主机上面的某个端口//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx            socket.Bind(new IPEndPoint(IPAddress.Any, 4530));

//启动监听,并且设置一个最大的队列长度//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx            socket.Listen(4);

            Console.WriteLine("Server is ready!");            Console.Read();        }    }}

现在可以启动调试一下看看效果如何,正常情况下应该会看到一个提示,因为我们需要在TCP 4530端口进行监听,所以防火墙会有提示。

点击“Allow access”

这样,我们的服务器就可以开始监听了。但是这有什么用呢?是的,没有什么用。

我们还需要为服务器添加一些功能,例如接受传入的请求,给客户端发送消息,或者从客户端接收消息等等

第三步:接受传入的请求

我们需要通过Accept,或者(BeginAccept)来接受传入的请求,请注意下面代码中的红色部分

using System;using System.Collections.Generic;using System.Linq;using System.Text;

//额外导入的两个命名空间using System.Net.Sockets;using System.Net;

namespace SocketServer{class Program    {/// <summary>/// Socket Server 演示/// 作者:陈希章/// </summary>/// <param name="args"></param>static void Main(string[] args)        {//创建一个新的Socket,这里我们使用最常用的基于TCP的Stream Socket(流式套接字)            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//将该socket绑定到主机上面的某个端口//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx            socket.Bind(new IPEndPoint(IPAddress.Any, 4530));

//启动监听,并且设置一个最大的队列长度//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx            socket.Listen(4);

            //开始接受客户端连接请求//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspx            socket.BeginAccept(new AsyncCallback((ar) =>            {//这就是客户端的Socket实例,我们后续可以将其保存起来                var client = socket.EndAccept(ar);

//给客户端发送一个欢迎消息                client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at "+DateTime.Now.ToString()));            }), null);

            Console.WriteLine("Server is ready!");            Console.Read();        }    }}

wow,看起来不错对吧,我们赶紧做一个客户端来测试一下吧

第四步:创建客户端

我们还是使用一个Console Application

添加如下的代码,并且创建客户端连接

using System;using System.Collections.Generic;using System.Linq;using System.Text;

//导入的命名空间using System.Net.Sockets;

namespace SocketClient{class Program    {/// <summary>/// Socket Server 演示/// 作者:陈希章/// </summary>/// <param name="args"></param>static void Main(string[] args)        {//创建一个Socket            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//连接到指定服务器的指定端口//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspx            socket.Connect("localhost", 4530);

            Console.WriteLine("connect to the server");            Console.Read();

        }    }}

依次选择SocketServer和SocketClient这两个项目,分别将其启动为调试状态(右键菜单,Debug=>Start new instance)

我们看到两个程序都工作正常。

但是,在客户端怎么没有收到服务器发过来的消息呢?那是因为,我们没有在客户端提供这方面的功能。

第五步:在客户端中实现接受消息的方法

using System;using System.Collections.Generic;using System.Linq;using System.Text;

//导入的命名空间using System.Net.Sockets;

namespace SocketClient{class Program    {/// <summary>/// Socket Server 演示/// 作者:陈希章/// </summary>/// <param name="args"></param>static void Main(string[] args)        {//创建一个Socket            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//连接到指定服务器的指定端口//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspx            socket.Connect("localhost", 4530);

//实现接受消息的方法

            var buffer = new byte[1024];//设置一个缓冲区,用来保存数据//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginreceive.aspx            socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback((ar) =>            {//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx                var length = socket.EndReceive(ar);//读取出来消息内容                var message = Encoding.Unicode.GetString(buffer, 0, length);//显示消息                Console.WriteLine(message);

            }), null);

            Console.WriteLine("connect to the server");            Console.Read();

        }    }}

请注意以上红色的部分,我们用了BeginReceive方法进行异步的消息侦听,如果收到了,我们就打印出来

看起来已经实现了我们需求了:服务器给客户端发了一个消息,而客户端也已经收到了。

但是,这远远不够,因为它们之间的通讯不仅仅是一次性的,那么如果服务器要不断地给客户端发消息,例如每隔两秒钟就发送一个消息,如何实现呢?

第六步:实现服务器定期向客户端发消息

using System;using System.Collections.Generic;using System.Linq;using System.Text;

//额外导入的两个命名空间using System.Net.Sockets;using System.Net;

namespace SocketServer{class Program    {/// <summary>/// Socket Server 演示/// 作者:陈希章/// </summary>/// <param name="args"></param>static void Main(string[] args)        {//创建一个新的Socket,这里我们使用最常用的基于TCP的Stream Socket(流式套接字)            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//将该socket绑定到主机上面的某个端口//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx            socket.Bind(new IPEndPoint(IPAddress.Any, 4530));

//启动监听,并且设置一个最大的队列长度//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx            socket.Listen(4);

//开始接受客户端连接请求//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspx            socket.BeginAccept(new AsyncCallback((ar) =>            {//这就是客户端的Socket实例,我们后续可以将其保存起来                var client = socket.EndAccept(ar);

//给客户端发送一个欢迎消息                client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at "+DateTime.Now.ToString()));

                //实现每隔两秒钟给服务器发一个消息//这里我们使用了一个定时器                var timer = new System.Timers.Timer();                timer.Interval = 2000D;                timer.Enabled = true;                timer.Elapsed += (o, a) =>                {                    client.Send(Encoding.Unicode.GetBytes("Message from server at " +DateTime.Now.ToString()));                };                timer.Start();

            }), null);

            Console.WriteLine("Server is ready!");            Console.Read();        }    }}

我们还要实现在客户端一直监听消息的机制,而不是一次性接收.请注意下面红色的部分

using System;using System.Collections.Generic;using System.Linq;using System.Text;

//导入的命名空间using System.Net.Sockets;

namespace SocketClient{class Program    {/// <summary>/// Socket Server 演示/// 作者:陈希章/// </summary>/// <param name="args"></param>static void Main(string[] args)        {//创建一个Socket            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//连接到指定服务器的指定端口//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspx            socket.Connect("localhost", 4530);            Console.WriteLine("connect to the server");

//实现接受消息的方法

//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginreceive.aspx socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage),socket);

            Console.Read();

        }

 static byte[] buffer = new byte[1024];

public static void ReceiveMessage(IAsyncResult ar) {try { var socket = ar.AsyncState as Socket;

//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx var length = socket.EndReceive(ar);//读取出来消息内容 var message = Encoding.Unicode.GetString(buffer, 0, length);//显示消息 Console.WriteLine(message);

//接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息了) socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket); }catch(Exception ex){ Console.WriteLine(ex.Message); } }    }}

重新调试起来,看起来的效果如下图所示

我们继续做下面的实验,一步一步地研究Socket通讯中可能遇到的一些问题

请先关闭掉客户端这个程序,而不要关闭服务端程序,这时会发现一个错误

这个错误很容易理解,因为客户端已经关闭,也就是客户端那个Socket已经不存在了,服务器还继续向它发送消息当然会出错。所以,从可靠性方面的考虑,我们必须在发送消息之前检测Socket的活动状态

第七步:检测客户端的活动状态

using System;using System.Collections.Generic;using System.Linq;using System.Text;

//额外导入的两个命名空间using System.Net.Sockets;using System.Net;

namespace SocketServer{class Program    {/// <summary>/// Socket Server 演示/// 作者:陈希章/// </summary>/// <param name="args"></param>static void Main(string[] args)        {//创建一个新的Socket,这里我们使用最常用的基于TCP的Stream Socket(流式套接字)            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//将该socket绑定到主机上面的某个端口//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx            socket.Bind(new IPEndPoint(IPAddress.Any, 4530));

//启动监听,并且设置一个最大的队列长度//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx            socket.Listen(4);

//开始接受客户端连接请求//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspx            socket.BeginAccept(new AsyncCallback((ar) =>            {//这就是客户端的Socket实例,我们后续可以将其保存起来                var client = socket.EndAccept(ar);

//给客户端发送一个欢迎消息                client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at "+DateTime.Now.ToString()));

//实现每隔两秒钟给服务器发一个消息//这里我们使用了一个定时器                var timer = new System.Timers.Timer();                timer.Interval = 2000D;                timer.Enabled = true;                timer.Elapsed += (o, a) =>                {                    //检测客户端Socket的状态if(client.Connected)                    {try                        {                            client.Send(Encoding.Unicode.GetBytes("Message from server at " + DateTime.Now.ToString()));                        }catch(SocketException ex)                        {                            Console.WriteLine(ex.Message);                        }                    }else                    {                        timer.Stop();                        timer.Enabled = false;                        Console.WriteLine("Client is disconnected, the timer is stop.");                    }                };                timer.Start();

            }), null);

            Console.WriteLine("Server is ready!");            Console.Read();        }    }}

上面代码的逻辑很清楚,但有时候还是会触发那个SocketException。为什么呢?这是因为我们的Timer是每隔两秒钟检查一次,那么就很可能有一种情况,我们检查的时候,它还是连接状态,消息发出去之后,它断开了。这种情况肯定是存在的。所以要用Try..catch的结构

目前我们实现的场景很简单,服务器只管发消息,客户端只管收消息。但实际工作中,可能希望服务器和客户端都能收发消息。请看下一节

第八步:实现双向收发消息

先看服务端的修改

using System;using System.Collections.Generic;using System.Linq;using System.Text;

//额外导入的两个命名空间using System.Net.Sockets;using System.Net;

namespace SocketServer{class Program    {/// <summary>/// Socket Server 演示/// 作者:陈希章/// </summary>/// <param name="args"></param>static void Main(string[] args)        {//创建一个新的Socket,这里我们使用最常用的基于TCP的Stream Socket(流式套接字)            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//将该socket绑定到主机上面的某个端口//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx            socket.Bind(new IPEndPoint(IPAddress.Any, 4530));

//启动监听,并且设置一个最大的队列长度//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx            socket.Listen(4);

//开始接受客户端连接请求//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspx            socket.BeginAccept(new AsyncCallback((ar) =>            {//这就是客户端的Socket实例,我们后续可以将其保存起来                var client = socket.EndAccept(ar);

//给客户端发送一个欢迎消息                client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at "+DateTime.Now.ToString()));

//实现每隔两秒钟给服务器发一个消息//这里我们使用了一个定时器                var timer = new System.Timers.Timer();                timer.Interval = 2000D;                timer.Enabled = true;                timer.Elapsed += (o, a) =>                {//检测客户端Socket的状态if(client.Connected)                    {try                        {                            client.Send(Encoding.Unicode.GetBytes("Message from server at " + DateTime.Now.ToString()));                        }catch(SocketException ex)                        {                            Console.WriteLine(ex.Message);                        }                    }else                    {                        timer.Stop();                        timer.Enabled = false;                        Console.WriteLine("Client is disconnected, the timer is stop.");                    }                };                timer.Start();

              //接收客户端的消息(这个和在客户端实现的方式是一样的)                client.BeginReceive(buffer,0,buffer.Length,SocketFlags.None,new AsyncCallback(ReceiveMessage),client);

            }), null);

            Console.WriteLine("Server is ready!");            Console.Read();        }

        static byte[] buffer = new byte[1024];

public static void ReceiveMessage(IAsyncResult ar)        {try            {                var socket = ar.AsyncState as Socket;

//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx                var length = socket.EndReceive(ar);//读取出来消息内容                var message = Encoding.Unicode.GetString(buffer, 0, length);//显示消息                Console.WriteLine(message);

//接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息了)                socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);            }catch(Exception ex){                Console.WriteLine(ex.Message);            }        }    }}

可以看出来,为了让服务器可以接受消息,其实并不需要什么特别的设计,与客户端接受消息其实可以是一样的

再来看看客户端的修改

using System;using System.Collections.Generic;using System.Linq;using System.Text;

//导入的命名空间using System.Net.Sockets;

namespace SocketClient{class Program    {/// <summary>/// Socket Server 演示/// 作者:陈希章/// </summary>/// <param name="args"></param>static void Main(string[] args)        {//创建一个Socket            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//连接到指定服务器的指定端口//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspx            socket.Connect("localhost", 4530);            Console.WriteLine("connect to the server");

//实现接受消息的方法

//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginreceive.aspx            socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);

            //接受用户输入,将消息发送给服务器端while(true)            {                var message = "Message from client : " + Console.ReadLine();                var outputBuffer = Encoding.Unicode.GetBytes(message);                socket.BeginSend(outputBuffer, 0, outputBuffer.Length, SocketFlags.None, null, null);            }

        }

static byte[] buffer = new byte[1024];

public static void ReceiveMessage(IAsyncResult ar)        {try            {                var socket = ar.AsyncState as Socket;

//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx                var length = socket.EndReceive(ar);//读取出来消息内容                var message = Encoding.Unicode.GetString(buffer, 0, length);//显示消息                Console.WriteLine(message);

//接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息了)                socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);            }catch(Exception ex)            {                Console.WriteLine(ex.Message);            }        }    }}

我在这里做了一个死循环,用户可以不断地输入,这些消息会被发送给服务器。如下图所示

【备注】因为服务器每隔两秒钟会发送新消息过来,所以在输入的时候,动作要稍快一点啦

本文最后探讨一个问题,就是如何让我们的服务器可以支持多个客户端

第九步:支持多个客户端

这个步骤只需要修改服务端程序即可

using System;using System.Collections.Generic;using System.Linq;using System.Text;

//额外导入的两个命名空间using System.Net.Sockets;using System.Net;

namespace SocketServer{class Program    {/// <summary>/// Socket Server 演示/// 作者:陈希章/// </summary>/// <param name="args"></param>static void Main(string[] args)        {//创建一个新的Socket,这里我们使用最常用的基于TCP的Stream Socket(流式套接字)            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//将该socket绑定到主机上面的某个端口//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx            socket.Bind(new IPEndPoint(IPAddress.Any, 4530));

//启动监听,并且设置一个最大的队列长度//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx            socket.Listen(4);

//开始接受客户端连接请求//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspx socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);

            Console.WriteLine("Server is ready!");            Console.Read();        }

        public static void ClientAccepted(IAsyncResult ar)        {

            var socket = ar.AsyncState as Socket;

//这就是客户端的Socket实例,我们后续可以将其保存起来            var client = socket.EndAccept(ar);

//给客户端发送一个欢迎消息            client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at " + DateTime.Now.ToString()));

//实现每隔两秒钟给服务器发一个消息//这里我们使用了一个定时器            var timer = new System.Timers.Timer();            timer.Interval = 2000D;            timer.Enabled = true;            timer.Elapsed += (o, a) =>            {//检测客户端Socket的状态if(client.Connected)                {try                    {                        client.Send(Encoding.Unicode.GetBytes("Message from server at " + DateTime.Now.ToString()));                    }catch(SocketException ex)                    {                        Console.WriteLine(ex.Message);                    }                }else                {                    timer.Stop();                    timer.Enabled = false;                    Console.WriteLine("Client is disconnected, the timer is stop.");                }            };            timer.Start();

//接收客户端的消息(这个和在客户端实现的方式是一样的)            client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);

//准备接受下一个客户端请求            socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);        }

static byte[] buffer = new byte[1024];

public static void ReceiveMessage(IAsyncResult ar)        {

try            {                var socket = ar.AsyncState as Socket;

//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx                var length = socket.EndReceive(ar);//读取出来消息内容                var message = Encoding.Unicode.GetString(buffer, 0, length);//显示消息                Console.WriteLine(message);

//接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息了)                socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);            }catch(Exception ex){                Console.WriteLine(ex.Message);            }        }    }}

最后调试起来看到的效果如下图

本文源代码,可以通过这里下载 http://files.cnblogs.com/chenxizhang/SocketWorkshop.rar

转载于:https://www.cnblogs.com/kingdom_0/articles/2277683.html

你得学会并且学得会的Socket编程基础知识(转)相关推荐

  1. 你得学会并且学得会的Socket编程基础知识

    这一篇文章,我将图文并茂地介绍Socket编程的基础知识,我相信,如果你按照步骤做完实验,一定可以对Socket编程有更好地理解. 本文源代码,可以通过这里下载 http://files.cnblog ...

  2. 学python需要什么基础知识-没学过Python先要学习哪些基础知识?

    零基础学Python应该学习哪些入门知识 关于零基础怎么样能快速学好Python的问题,百度提问和解答的都很多,你可以百度下看看.我觉得从个人自学的角度出发,应从以下几个方面来理解: 1 为什么选择学 ...

  3. 没学过编程可以学python吗_没编程基础可以学python吗

    Python是一门高级编程语言,而且Python语言适合零基础人员学习,也是初学者的首选. 如何学习好Python: 1. 要有决心 做任何事情,首先要有足够的决心和坚持,才能做好事情.学好Pytho ...

  4. c语言程序设计学了什么知识,初学C语言编程基础知识

    初学C语言编程基础知识 初学C语言的人,很多基础知识是需要学习的,下面小编为大家带来了初学C语言编程的基础知识,欢迎大家阅读! 初学C语言编程基础知识 (1)学习过C语言的同学在对单片机有了基本了解之 ...

  5. 自学python能学成吗-没有任何编程基础可以直接学习python语言吗?学会后能够做什么?...

    很明确的说 python非常适合没有任何编程基础的人入门.. 目前应用最多的:全栈开发.数据分析.运维开发,今天我们就以这三个重点的岗位来做一下自学Python的规划,希望你在学之前就能有结果的来走得 ...

  6. 没有任何基础的可以学python吗-对没有编程基础的人来说,直接学Python入门IT合适吗?...

    原标题:对没有编程基础的人来说,直接学Python入门IT合适吗? 对于0基础的人,直接学 Python 编程合适吗? 小编只能说非常合适,因为在目前的编程语言中,Python的抽象程度是最高的,是最 ...

  7. 如果你已经学会了Python编程基础知识,那么下一步?

    如果你已经学会了Python编程的基础知识,就已经准备好编写执行现实世界任务的完整程序了. 这本<Python极客编程:用代码探索世界>16个有趣的编程项目,项目式的学习方法,有趣案例提升 ...

  8. 小孩入门学什么计算机语言,有一定编程基础的孩子应该学什么编程语言?

    原标题:有一定编程基础的孩子应该学什么编程语言? 梁启超先生在<少年中国说>里强调:"少年智则国智,少年富则国富,少年强则国强,少年独立则国独立,少年自由则国自由,少年进步则国进 ...

  9. python语言流程控制语句的格式_慢步学python,编程基础知识,流程控制语句if

    慢步业余学python编程,今天休息继续分享python编程知识. 面向过程编程,重要的是程序的流程,今天说说流程控制语句if. 在我们高中数学中就有流程图的学习,只是没有真正应用起来而已,办公软件也 ...

最新文章

  1. 打开iPhone自拍,就能用虚幻引擎开发3A游戏大作!新应用无门槛创造超逼真游戏角色...
  2. 虚拟鼠标代替安卓触屏_iQOO对比黑鲨2:那个虚拟按键设计更好?
  3. Tomcat 怎么停止服务的?
  4. python条形图一直长_条形图的坐标轴标签过长,怎么优化更美观呢?
  5. 最新优质网站联盟大全(个人站长必知)
  6. 初学swift笔记 枚举(七)
  7. 脸书令牌怎么使用_网工知识角|QOS技术令牌桶算法一分钟速记,考试无忧
  8. GoFrame带你从0-1快速入门
  9. 微信小程序开发入门教程 含视频 有源码
  10. 基于逻辑回归的评分卡模型简单概述
  11. 西电计算机科学与技术排名,2020最新世界学科排名:西电3个学科跻身全球10强,发展势头强劲...
  12. 网上得到的一个3D渲染引擎
  13. Android Wi-Fi 设置wifi Only 11a、b、g、n 扫描(以QCOM为平台)
  14. PostgreSQL 中的系统字段:tableoid、xmin、xmax、cmin、cmax、ctid
  15. EduSoho v8.7.10 本地播放视频超时或者快进后网络错误导致视频下载中途失败。
  16. 伽罗华域(Galois Field,GF,有限域)
  17. 基因组层次聚类实战小案例
  18. ionic4学习笔记11-某东项目热门商品展示
  19. PhpExcel读取Excel表格中的数据
  20. mysql can't open file: '..frm'_修复Can't open file的mysql数据库表的方法

热门文章

  1. 排序算法之选择排序(简单选择排序、堆排序)
  2. centos 使用mysql_Centos下MySQL使用总结
  3. 能ping通工作组计算机 无法访问,可以ping通不能访问共享,其他电脑可以访问
  4. MySQL主从、主主、半同步节点架构的的原理及实验总结
  5. Linux的Vim编辑器
  6. php遍历文本文档txt文件中的链接内容为数组
  7. Python学习 Week2 part1
  8. 自适应网页设计(转)
  9. not supported between instances of 'SafeText' and 'int' 问题出现以及解决
  10. Linux 截取线上日志