python中关于网络编程(1)

概念解释

客户端/服务器架构

硬件客户端/服务器架构
1.打印(打印机)服务器是硬件服务器的一个例子。它们处理传入的打印作业并将其发送给系统中的打印机(或其他的打印设备)。这样的计算机通常可以通过网络进行访问,并且客户端计算机将向它发送打印请求
2.硬件服务器的另一个例子就是文件服务器。这些通常都是拥有庞大通用存储容量的计算机,可以被客户端远程访问。客户端计算机会挂载服务器计算机上的磁盘,看起来好像这个磁盘就在本地计算机上一样。支持文件服务器的一个最流行的网络操作系统就是 Sun 公司的网络文件系统(NFS)。如果你正在访问一个网络磁盘驱动器,并且无法分辨它是在本地还是网络上,那么此时客户端/服务器系统就已经完成了它的任务。它的目标就是让用户得到与访问本地磁盘完全相同的体验,抽象起来就是正常的磁盘访问,而这些都是通过编程实现来确保以这种方式进行。
软件客户端/服务器架构

常见的软件服务器就是 Web 服务器,数据库服务器,窗体(window)服务器

**

客户端/服务器网络编程

**
首先会创建一个通信端点,它能够使服务器监听请求,一旦一个通信端点已经建立,监听服务器就可以进入无限循环中,等待客户端的连接并响应它们的请求。
客户端
比服务器端更简单,客户端所需要做的只是创建它的单一通信端点,然后建立一个到服务器的连接。然后,客户端就可以发出请求,该请求包括任何必要的数据交换。一旦请求被服务器
处理,且客户端收到结果或某种确认信息,此次通信就会被终止

套接字socket &tcp协议&IP协议

**
socket
套接字是计算机网络数据结构,它体现了上节中所描述的“通信端点”的概念。在任何类型的通信开始之前,网络应用程序必须创建套接字 是计算机之间进行通信的一种约定或一种方式。
可以将 SOCK_STREAM 想象成一条传输带,只要传输带本身没有问题(不会断网),就能保证数据不丢失;同时,较晚传送的数据不会先到达,较早传送的数据不会晚到达,这就保证了数据是按照顺序传递的。

tcp协议
为什么流格式套接字可以达到高质量的数据传输呢?这是因为它使用了 TCP 协议(The Transmission Control Protocol,传输控制协议),TCP 协议会控制你的数据按照顺序到达并且没有错误。
IP
TCP 用来确保数据的正确性,IP(Internet Protocol,网络协议)用来控制数据如何从源头到达目的地,也就是常说的“路由”。

套字节家族名称:

unix:AF_UNIX (又名 AF_LOCAL)是基于文件的。
AF_INET,基于网络的
linux AF_NETLINK ,标准的 BSD 套接字接口进行用户级别和内核级别代码之间的 IPC。
Linux : AF_TIPC 家族 支持透明的进程间通信(TIPC)协
议。 TIPC 允许计算机集群之中的机器相互通信,而无须使用基于 IP 的寻址方式。

1、流格式套接字(SOCK_STREAM)

数据不会消失;
顺序传输的;
数据的发送和接收不是同步的
使用TCP 协议

2、数据报格式套接字(SOCK_DGRAM)

强调快速传输而非传输顺序;
传输的数据可能丢失也可能损毁;
限制每次传输的数据大小;
数据的发送和接收是同步的
使用UDP传输

套接字使用流程与文件的使用流程很类似,三部曲:创建套接字,使用套接字收/发数据,关闭套接字。

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

面向连接的套接字
不管你采用的是哪种地址家族,都有两种不同风格的套接字连接。第一种是面向连接的,这意味着在进行通信之前必须先建立一个连接,例如,使用电话系统给一个朋友打电话。这种类型的通信也称为虚拟电路或流套接字。

创建 TCP 客户端

cs = socket() # 创建客户端套接字
cs.connect() # 尝试连接服务器
comm_loop: # 通信循环
cs.send()/cs.recv() # 对话(发送/接收)
cs.close() # 关闭客户端

要创建套接字,必须使用 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 套接字,可以用下面的方式调用 socket.socket()。

tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

同样,为了创建 UDP/IP 套接字,需要执行以下语句。

udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

可以使用from socket import *

套接字对象(内置)方法

服务器套接字方法
s.bind() :将地址(主机名、端口号对)绑定到套接字上
s.listen() :设置并启动 TCP 监听器
s.accept() :被动接受 TCP 客户端连接,一直等待直到连接到达(阻塞)

客户端套接字方法
s.connect() :主动发起 TCP 服务器连接
s.connect_ex() :connect()的扩展版本,此时会以错误码的形式返回问题,而不是抛出一个异常

普通的套接字方法
s.recv(): 接收 TCP 消息
s.recv_into(): 接收 TCP 消息到指定的缓冲区
s.send() 发送 TCP 消息
s.sendall() 完整地发送 TCP 消息
s.recvfrom() 接收 UDP 消息
s.recvfrom_into()① 接收 UDP 消息到指定的缓冲区
s.sendto() 发送 UDP 消息
s.getpeername() 连接到套接字( TCP)的远程地址
s.getsockname() 当前套接字的地址
s.getsockopt() 返回给定套接字选项的值
s.setsockopt() 设置给定套接字选项的值
s.shutdown() 关闭连接
s.close() 关闭套接字
s.detach()② 在未关闭文件描述符的情况下关闭套接字,返回文件描述符
s.ioctl()③ 控制套接字的模式(仅支持 Windows)
面向阻塞的套接字方法
s.setblocking() 设置套接字的阻塞或非阻塞模式
s.settimeout()④ 设置阻塞套接字操作的超时时间
s.gettimeout()④ 获取阻塞套接字操作的超时时间
面向文件的套接字方法
s.fileno() 套接字的文件描述符
s.makefile() 创建与套接字关联的文件对象

数据属性

s.family① 套接字家族
s.type① 套接字类型
s.proto① 套接字协议

创建 TCP 服务器

ss = socket() # 创建服务器套接字
ss.bind() # 套接字与地址绑定
ss.listen() # 监听连接
inf_loop: # 服务器无限循环
cs = ss.accept() # 接受客户端连接
comm_loop: # 通信循环
cs.recv()/cs.send() # 对话(接收/发送)
cs.close() # 关闭客户端套接字
ss.close() # 关闭服务器套接字#(可选)

如果是面向连接。
所以在 TCP 服务器开始操作之前,必须安装一些基础设施。特别地, TCP 服务器必须监听(传入)的连接。一旦这个安装过程完成后,服务器就可以开始它的无限循环。
调用 accept()函数之后,就开启了一个简单的(单线程)服务器,它会等待客户端的连接。
默认情况下, accept()是阻塞的,这意味着执行将被暂停,直到一个连接到达。另外,套接字确实也支持非阻塞模式,可以参考文档或操作系统教材
一旦服务器接受了一个连接,就会返回(利用 accept())一个独立的客户端套接字,用来与即将到来的消息进行交换。使用新的客户端套接字类似于将客户的电话切换给客服代表。当一个客户电话最后接进来时,主要的总机接线员会接到这个电话,并使用另一条线路将这个电话转接给合适的人来处理客户的需求。
当一个处理程序检测到一些外部条件时,服务器就应该关闭。在这些情况下,应该调用一个 close()方法
创建 TCP 客户端

cs = socket() # 创建客户端套接字
cs.connect() # 尝试连接服务器
comm_loop: # 通信循环
cs.send()/cs.recv() # 对话(发送/接收)
cs.close()

## socket 模块属性

AF_UNIX、 AF_INET、 AF_INET6①、
AF_NETLINK②、 AF_TIPC③
Python 中支持的套接字地址家族
SO_STREAM、 SO_DGRAM 套接字类型(TCP=流, UDP=数据报)
has_ipv6④ 指示是否支持 IPv6 的布尔标记
异常
error 套接字相关错误
herror① 主机和地址相关错误
gaierror① 地址相关错误
timeout 超时时间
函数
socket() 以给定的地址家族、套接字类型和协议类型(可选)创建一个套接字对象
socketpair()⑤ 以给定的地址家族、套接字类型和协议类型(可选)创建一对套接字对象
create_connection() 常规函数,它接收一个地址(主机名,端口号)对,返回套接字对象
fromfd() 以一个打开的文件描述符创建一个套接字对象
ssl() 通过套接字启动一个安全套接字层连接;不执行证书验证
getaddrinfo()① 获取一个五元组序列形式的地址信息
getnameinfo() 给定一个套接字地址,返回(主机名,端口号)二元组
getfqdn()⑥ 返回完整的域名
gethostname() 返回当前主机名
gethostbyname() 将一个主机名映射到它的 IP 地址
gethostbyname_ex() gethostbyname()的扩展版本,它返回主机名、别名主机集合和 IP 地址列表
gethostbyaddr() 将一个 IP 地址映射到 DNS 信息;返回与 gethostbyname_ex()相同的 3 元组
getprotobyname() 将一个协议名(如‘tcp’)映射到一个数字
getservbyname()/getservbyport() 将一个服务名映射到一个端口号,或者反过来;对于任何一个函数来说,协议名都是可
选的
ntohl()/ntohs() 将来自网络的整数转换为主机字节顺序
htonl()/htons() 将来自主机的整数转换为网络字节顺序
inet_aton()/inet_ntoa() 将 IP 地址八进制字符串转换成 32 位的包格式,或者反过来(仅用于 IPv4 地址)
inet_pton()/inet_ntop() 将 IP 地址字符串转换成打包的二进制格式,或者反过来(同时适用于 IPv4 和 IPv6 地址)
getdefaulttimeout()/setdefaulttimeout() 以秒(浮点数)为单位返回默认套接字超时时间;以秒(浮点数)为单位设置默认套接字超时时间

*SocketServer 模块

BaseServer 包含核心服务器功能和 mix-in 类的钩子;仅用于推导,这样不会创建这个类
的实例;可以用 TCPServer 或 UDPServer 创建类的实例
TCPServer/UDPServer 基础的网络同步 TCP/UDP 服务器
UnixStreamServer/UnixDatagramServer 基于文件的基础同步 TCP/UDP 服务器
ForkingMixIn/ThreadingMixIn 核心派出或线程功能;只用作 mix-in 类与一个服务器类配合实现一些异步
性;不能直接实例化这个类
ForkingTCPServer/ForkingUDPServer ForkingMixIn 和 TCPServer/UDPServer 的组合
ThreadingTCPServer/ThreadingUDPServer ThreadingMixIn 和 TCPServer/UDPServer 的组合
BaseRequestHandler 包含处理服务请求的核心功能;仅仅用于推导,这样无法创建这个类的实例;可以使用 StreamRequestHandler 或 DatagramRequestHandler 创建类的实例
StreamRequestHandler/DatagramRequestHandler 实现 TCP/UDP 服务器的服务处理器

创建 SocketServer TCP 服务器

from SocketServer import TCPServer as TCP, StreamRequestHandler as SRH

def handle(self):
pass

创建 SocketServer TCP 客户端

执行 TCP 服务器和客户端

*Twisted 框架介绍

创建 Twisted Reactor TCP 服务器

创建 Twisted Reactor TCP 客户端

执行 TCP 服务器和客户端

相关模块

socket 正如本章讨论的,它是低级网络编程接口
asyncore/asynchat 提供创建网络应用程序的基础设施,并异步地处理客户端
select 在一个单线程的网络服务器应用中管理多个套接字连接SocketServer 高级模块,提供网络应用程序的服务器类,包括 forking 或 threading

  • 19
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值