美文网首页程序员
Python 网络编程

Python 网络编程

作者: keinYe | 来源:发表于2019-02-24 21:43 被阅读0次
    image

    现在的社会向互联网、AI 智能大踏步的高歌猛进,无论是互联网还是 AI 智能他们的基础都指向网络连接,试想一个没有网络连接的社会,大家每人一个功能机,那么什么互联网、什么 AI 智能这些统统靠边站。对于 python 来说,在网上找到的最多的还是网络爬虫的示例教程,其实最终还是网络编程,只是别人已经做好了框架我们只需要使用即可。

    网络编程对于任何一门编程语言来说都是不可或缺的一部分,这里主要对 python 网络连接进行简单的应用以加深记忆。

    网络编程中一个重要的概念即 Socket,通常我们用一个 Socket 来表示一个网络连接。网络连接又分 TCP 连接和 UDP 连接。TCP 连接是可靠的网络连接,通信双方均可以以流的方式发送数据,且发送方要保证接收方接收到数据。UDP 连接是无状态通信,无需真正建立连接,且发送方不保证接收方是否接收到数据。我们所接触到的网络连接通常都是 TCP 连接。

    在创建 TCP 连接时,主动发起连接的叫做客户端,被动响应连接的叫服务器。当我们使用手机在谷歌上搜索数据时,谷歌的角色就是服务器,我们的手机就是客户端,因此手机的使用则被称为用户,而谷歌被称为服务提供商。

    1. 服务器

    服务器的工作流程如下:

    image

    在服务器的工作过程中需要用到以下几个函数:

    • socket: 用来建立 socket 实例。
    • bind:用来绑定 IP 和端口。
    • listen:用来监听当前绑定 IP 和端口的连接时间。
    • accept:用来获取客户端地址和当前连接的 socket。
    • send 和 recv:用来向客户端发送数据和从客户端接收收据。

    以下是完整的服务端代码:

    # -*- coding:utf-8 -*-
    
    import socket
    import time
    
    HOST = '127.0.0.1'
    PORT = 1234
    
    server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
    
    server.bind((HOST, PORT))
    server.listen(1)
    
    conn, addr = server.accept()
    print(addr)
    
    with conn:
        print('Connected by %s:%s' % addr)
        while True:
            time.sleep(1)
            data = conn.recv(1024)
            if not data:
                break
            conn.send(("Hello, %s" % data.decode('utf-8')).encode('utf-8'))
        print('Disconnected %s:%s' % addr)
    

    在该示例中创建了一个绑定在本机 1234 端口的服务器,用来接收客户端的连接,并将客户端发送过来的数据在发回给客户端。linsten(1) 表示同一时刻智能有一个客户端与连接到服务器,若要同时接收多个客户端的连接可修改该参数,且在每个客户端连接到该服务器是开启一个单独线程来处理通信事件。关于线程的知识请参考 Python 之进程与线程

    1. 客户端

    客户端需要连接到一个服务器,首先需要知道该服务器的 IP 地址和端口号,我们常用的 web 服务的端口号是 80,SMTP 服务端口号是 25,FTP 服务端口号是 21。端口号小于 1024 的是 Internet 标准服务的端口,端口号大于 1024 的,可以任意使用。因此在自己编写的程序中的端口号都大于 1024,在我们自己编写的服务器中的端口号就设置为 1234。

    客户端的工作流程

    image
    # -*- coding:utf-8 -*-
    
    import socket
    
    
    HOST = '127.0.0.1'
    PORT = 1234
    
    client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
    
    client.connect((HOST, PORT))
    
    for data in [b'keinYe', b'Steven', b'Micheel']:
        client.send(data)
        print(client.recv(1024).decode('utf-8'))
    client.close()
    

    客户端程序通过 connect 函数连接到的服务器,连接到服务器后通过 send 函数来发送数据,通过 recv 函数来接收数据。

    1. 客户端与服务器的通信

    将客户端和服务端连接并通信是检验代码是否正常工作的最好方法。单是需要注意的是在运行客户端之前要先将服务端运行起来,以下分别是服务端和客户端的运行结果。

    服务端运行结果:

    ('127.0.0.1', 53431)
    Connected by 127.0.0.1:53431
    Disconnected 127.0.0.1:53431
    

    客户端运行结果:

    Hello, keinYe
    Hello, Steven
    Hello, Micheel
    

    相关文章

      网友评论

        本文标题:Python 网络编程

        本文链接:https://www.haomeiwen.com/subject/gvqiyqtx.html