Python 网络编程

本文介绍了Python的网络编程,涉及socket模块、套接字类型、面向连接与非连接套接字,以及高级模块如socketserver和事件驱动框架Twisted。详细讲解了TCP和UDP服务器客户端的创建,并探讨了Twisted在网络编程中的应用。
摘要由CSDN通过智能技术生成
本文主要介绍了简单的python网络编程知识,并介绍了socke模块、socketsever模块和twisted框架的简单应用。

参考书籍:《python核心编程(第3版)》
python版本:python3.8

python网络编程相关模块简介

当开发低级套接字程序时,经常配合使用 select 模块和 socket 模块。select 模块提供了 select()函数,该函数管理套接字对象集合。它所做的最有用的一个事情就是接收一套套接字,并监听它们活动的连接。select()函数将会阻塞,直到至少有一个套接字已经为通信做好准备,而当其发生时,它将提供一组准备好读信息的集合(它还可以确定哪些套接字准备好写入,虽然它不像前一种操作那么常见)。
python 网络/套接字编程相关模块:

  • socket:是低级网络编程接口;
  • asyncore/ asynchat:提供创建网络应用程序的基础设施,并异步地处理客户端;
  • select:在一个单线程的网络服务器应用中管理多个套接字连接;
  • socketserver:高级模块,提供网络应用程序的服务器类,包括forking或threading簇;
  • twisted:是一个完整的事件驱动的网络框架,利用它能使用/开发完整的异步网络协议;

在创建服务器方面,async*和 SocketServer 模块都提供更高级的功能。它们以 socket 和/或 select 模块为基础编写,能够使客户端/服务器系统开发更加迅速,因为它们已经自动处理了所有的底层代码。你需要做的所有工作就是以自己的方式创建或继承适当的基类。SocketServer 甚至提供了将线程或新进程集成到服务器的功能,它提供了一个更像并行处理的客户端请求的流程。
Twisted 提供了一个更加强大和灵活的框架,并且已经实现了很多协议。可以在http://twistedmatrix.com 网站上找到更多关于 Twisted 的消息。
Concurrence 是一个更现代化的网络框架,它是荷兰社交网络 Hyves 的后台引擎。Concurrence 是一个搭配了 libevent 的高性能 I/O 系统,libevent 是一个低级事件回调调度系统。Concurrence 是一个异步模型,它使用轻量级线程(执行回调)以事件驱动的方式进行线程间通信和消息传递工作。可以在 http://opensource.hyves.org/concurrence 网址找到更多关于Concurrence 的信息。
现代网络框架遵循众多异步模型(greenlet、generator 等)之一来提供高性能异步服务器。这些框架的其中一个目标就是推动异步编程的复杂性,以允许用户以一种更熟悉的同步方式进行编码。

套接字介绍

套接字是计算机网络数据结构,它体现了“通信端点”的概念。在任何类型的通信开始之前,网络应用程序必须创建套接字。可以将它们比作电话插孔,没有它将无法进行通信。
进程间通信(Inter Process Communication,IPC)。有两种类型的套接字:基于文件的和面向网络的。
第二种类型的套接字是基于文件的,因为两个进程运行在同一台计算机上。它也有自己的家族名字 AF_UNIX(又名 AF_LOCAL,在 POSIX1.g 标准中指定),它代表地址家族(address family):UNIX。包括 Python 在内的大多数受欢迎的平台都使用术语地址家族及其缩写 AF;其他比较旧的系统可能会将地址家族表示成域(domain)或协议家族(protocol family),并使用其缩写 PF 而非 AF。
第二种类型的套接字是基于网络的,它也有自己的家族名字 AF_INET,或者地址家族:因特网。
针对 Linux 的另一种特性(Python 2.6 中新增)就是支持透明的进程间通信(TIPC)协议。TIPC 允许计算机集群之中的机器相互通信,而无须使用基于 IP 的寻址方式。Python 对TIPC 的支持以AF_TIPC 家族的方式呈现。
总的来说,Python 只支持 AF_UNIX、AF_NETLINK、AF_TIPC 和 AF_INET 家族。

套接字地址:主机——端口对

如果一个套接字像一个电话插孔——允许通信的一些基础设施,那么主机名和端口号就像区号和电话号码的组合。然而,拥有硬件和通信的能力本身并没有任何好处,除非你知道电话打给谁以及如何拨打电话。一个网络地址由主机名和端口号对组成,而这是网络通信所需要的。
有效的端口号范围为 0~65535(尽管小于 1024 的端口号预留给了系统)。如果你正在使用 POSIX 兼容系统(如 Linux、Mac OS X 等),那么可以在/etc/services 文件中找到预留端口号的列表(以及服务器/协议和套接字类型)。众所周知的端口号列表可以在这个网站中查看:http://www.iana.org/assignments/port-numbers。

面向连接的套接字

在进行通信之前必须先建立一个连接。面向连接的通信提供序列化的、可靠的和不重复的数据交付,而没有记录边界。这基本上意味着每条消息可以拆分成多个片段,并且每一条消息片段都确保能够到达目的地,然后将它们按顺序组合在一起,最后将完整消息传递给正在等待的应用程序。
实现这种连接类型的主要协议是传输控制协议(更为人熟知的是它的缩写 TCP)。为 了创建 TCP 套接字,必须使用 SOCK_STREAM 作为套接字类型。TCP 套接字的名字SOCK_STREAM 基于流套接字的其中一种表示。因为这些套接字(AF_INET)的网络版本使用因特网协议(IP)来搜寻网络中的主机,所以整个系统通常结合这两种协议(TCP 和 IP)来进行(当然,也可以使用 TCP 和本地[非网络的 AF_LOCAL/AF_UNIX]套接字,但是很明显此时并没有使用 IP)。

面向非连接的套接字

数据报类型的套接字,它是一种无连接的套接字。这意味着,在通信开始之前并不需要建立连接。此时,在数据传输过程中并无法保证它的顺序性、可靠性或重复性。然而,数据报确实保存了记录边界,这就意味着消息是以整体发送的,而并非首先分成多个片段。
使用数据报的消息传输可以比作邮政服务。信件和包裹或许并不能以发送顺序到达。事实上,它们可能不会到达。为了将其添加到并发通信中,在网络中甚至有可能存在重复的消息。
实现这种连接类型的主要协议是用户数据报协议(更为人熟知的是其缩写 UDP)。为 了创建 UDP 套接字,必须使用 SOCK_DGRAM 作为套接字类型。你可能知道,UDP 套接字的SOCK_DGRAM 名字来自于单词“datagram”(数据报)。因为这些套接字也使用因特网协议来寻找网络中的主机,所以这个系统也有一个更加普通的名字,即这两种协议(UDP 和 IP)的组合名字,或 UDP/IP。

Python中的网络编程

socket模块

socket()模块函数
创建套接字:socket.socket()函数,一般语法:

# socket(socket_family, socket_type, protocol=0)
# socket_family 是 AF_UNIX 或 AF_INET
# socket_type 是 SOCK_STREAM或 SOCK_DGRAM
# protocol 通常省略,默认为 0
# 创建 TCP/IP 套接字
tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 创建 UDP/IP 套接字
udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

常见套接字对象方法和属性


socket模块属性
在这里插入图片描述
在这里插入图片描述

创建TCP服务器客户端

伪代码:

'''
一种TCP服务器操作伪代码,应首先启动服务器:
ss = socket()                   # 创建服务器套接字
ss.bind()                       # 套接字与地址绑定
ss.listen()                     # 监听连接
inf_loop:                       # 服务器无限循环
    cs = ss.accept()            # 接受客户端链接
    comm_loop:                  # 通信循环
        cs.recv()/cs.send()     # 对话(接收/发送)
    cs.close()                  # 关闭客户端套接字
ss.close()                      # 关闭服务器套接字 # (可选)
'''
'''
创建TCP客户端伪代码
cs = socket()               # 创建客户端套接字
cs.connect()                # 尝试连接服务器
comm_loop:                  # 通信循环
    cs.send()/cs.recv()     # 对话(发送/接收)
cs.close()                  # 关闭客户端套接字

'''

代码示例:

'''TCP服务器'''
from socket import *
from time import ctime

tcpSerSock = socket(AF_INET, SOCK_STREAM)

HOST = gethostname()
PORT = 9999
BUFSIZ = 1024
ADDR = (HOST, PORT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值