Python 3 - 网络编程

  • 简述

    Python 提供了两个级别的网络服务访问权限。在较低级别,您可以访问底层操作系统中的基本套接字支持,这允许您为面向连接和无连接协议实现客户端和服务器。
    Python 还有一些库可以提供对特定应用程序级网络协议(例如 FTP、HTTP 等)的更高级别的访问。
    本章让您了解网络中最著名的概念——套接字编程。
  • 什么是套接字?

    套接字是双向通信通道的端点。套接字可以在进程内、同一台机器上的进程之间或不同大陆的进程之间进行通信。
    套接字可以通过多种不同的通道类型实现:Unix 域套接字、TCP、UDP 等等。套接字库提供了用于处理公共传输的特定类以及用于处理其余部分的通用接口。
    套接字有自己的词汇表 -
    序号 术语和说明
    1
    domain
    用作传输机制的协议系列。这些值是常量,例如 AF_INET、PF_INET、PF_UNIX、PF_X25 等。
    2
    type
    两个端点之间的通信类型,通常用于面向连接的协议的 SOCK_STREAM 和用于无连接协议的 SOCK_DGRAM。
    3
    protocol
    通常为零,这可用于标识域和类型中协议的变体。
    4
    hostname
    网络接口的标识符 -
    • 一个字符串,可以是主机名、点分四组地址或冒号(也可能是点)表示法的 IPV6 地址
    • 字符串“<broadcast>”,指定 INADDR_BROADCAST 地址。
    • 一个零长度字符串,指定 INADDR_ANY,或者
    • 一个整数,解释为主机字节顺序的二进制地址。
    5
    port
    每台服务器侦听在一个或多个端口上调用的客户端。端口可以​​是 Fixnum 端口号、包含端口号的字符串或服务名称。
  • 插座模块

    要创建套接字,您必须使用 socket 模块中可用的socket.socket()函数,该函数具有通用语法 -
    
    s = socket.socket (socket_family, socket_type, protocol = 0)
    
    这是参数的描述 -
    • socket_family− 如前所述,这是 AF_UNIX 或 AF_INET。
    • socket_type− 这是 SOCK_STREAM 或 SOCK_DGRAM。
    • protocol− 这通常被忽略,默认为 0。
    一旦你有了套接字对象,你就可以使用所需的函数来创建你的客户端或服务器程序。以下是所需功能的列表 -
  • 服务器套接字方法

    序号 方法及说明
    1
    s.bind()
    此方法将地址(主机名、端口号对)绑定到套接字。
    2
    s.listen()
    此方法设置并启动 TCP 侦听器。
    3
    s.accept()
    这被动地接受 TCP 客户端连接,等待连接到达(阻塞)。
  • 客户端套接字方法

    序号 方法及说明
    1
    s.connect()
    该方法主动发起 TCP 服务器连接。
  • 通用套接字方法

    序号 方法及说明
    1
    s.recv()
    此方法接收 TCP 消息
    2
    s.send()
    该方法传输TCP报文
    3
    s.recvfrom()
    此方法接收 UDP 消息
    4
    s.sendto()
    该方法传输UDP报文
    5
    s.close()
    此方法关闭套接字
    6
    socket.gethostname()
    返回主机名。
  • 一个简单的服务器

    为了编写 Internet 服务器,我们使用socket套接字模块中可用的函数来创建套接字对象。然后使用套接字对象调用其他函数来设置套接字服务器。
    现在打电话给bind(hostname, port)函数在给定主机上为您的服务指定一个端口。
    接下来调用返回对象的accept方法。此方法一直等到客户端连接到您指定的端口,然后返回一个表示与该客户端的连接的连接对象。
    
    #!/usr/bin/python3           # This is server.py file
    import socket                                         
    # create a socket object
    serversocket = socket.socket(
               socket.AF_INET, socket.SOCK_STREAM) 
    # get local machine name
    host = socket.gethostname()                           
    port = 9999                                           
    # bind to the port
    serversocket.bind((host, port))                                  
    # queue up to 5 requests
    serversocket.listen(5)                                           
    while True:
       # establish a connection
       clientsocket,addr = serversocket.accept()      
       print("Got a connection from %s" % str(addr))
        
       msg = 'Thank you for connecting'+ "\r\n"
       clientsocket.send(msg.encode('ascii'))
       clientsocket.close()
    
  • 一个简单的客户端

    让我们编写一个非常简单的客户端程序,它打开到给定端口 12345 和给定主机的连接。使用 Python 的套接字模块函数创建套接字客户端非常简单。
    socket.connect(hosname, port )端口上打开到主机名的 TCP 连接。一旦打开了套接字,就可以像读取任何 IO 对象一样从中读取数据。完成后,记得关闭它,就像关闭文件一样。

    例子

    以下代码是一个非常简单的客户端,它连接到给定的主机和端口,从套接字读取任何可用数据,然后退出 -
    
    #!/usr/bin/python3           # This is client.py file
    import socket
    # create a socket object
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    # get local machine name
    host = socket.gethostname()                           
    port = 9999
    # connection to hostname on the port.
    s.connect((host, port))                               
    # Receive no more than 1024 bytes
    msg = s.recv(1024)                                     
    s.close()
    print (msg.decode('ascii'))
    
    现在在后台运行这个 server.py,然后运行上面的 client.py 来查看结果。
    
    # Following would start a server in background.
    $ python server.py & 
    # Once server is started run client as follows:
    $ python client.py
    

    输出

    这将产生以下结果 -
    
    on server terminal
    Got a connection from ('192.168.1.10', 3747)
    On client terminal
    Thank you for connecting
    
  • Python 互联网模块

    下面列出了 Python 网络/互联网编程中的一些重要模块 -
    协议 常用功能 端口号 Python模块
    HTTP 网页 80 httplib、urllib、xmlrpclib
    NNTP 新闻网 119 nntplib
    FTP 文件传输 20 ftlib, urllib
    SMTP 发送电子邮件 25 smtplib
    POP3 正在获取电子邮件 110 流行图书馆
    IMAP4 正在获取电子邮件 143 imaplib
    Telnet 命令行 23 telnetlib
    Gopher 文件传输 70 gopherlib, urllib
    请检查上面提到的所有库以使用 FTP、SMTP、POP 和 IMAP 协议。
  • 延伸阅读

    这是套接字编程的快速入门。这是一个庞大的主题。建议通过以下链接查找更多详细信息 -