Python 网络编程
C/S 架构 & 套接字
C/S 架构的全称是 Client/Server,即客户端/服务器架构;它是一种网络体系架构,通常采取两层:服务器负责数据的管理,客户端负责完成与用户的交互任务
socket 即套接字,是计算机网络数据结构,任何类型的通信开始之前,网络应用必须创建套接字;最初是为同一主机上的应用程序创建,用于进程间通信(Inter Process Communication, IPC)。
类型:
- 基于文件
- 面向网路
家族:
- AF_UNIX / AF_LOCAL
- AF_INET
- AF_NETLINK
- AF_TIPC
套接字地址:主机-端口对(0-65535,小于 1024 为系统预留端口),https://www.iana.org/assignments/port-numbers
状态:
- 面向连接套接字:TCP/IP,SOCK_STREAM
- 无连接套接字:UDP/IP,SOCK_DGRAM
socket 模块
socket() 函数
函数语法:socket (socket_family, socket_type, protocol=0)
,protocol 通常省略,默认为 01
2
3
4
5from socket import *
#创建 TCP/IP 套接字
tcpSock = socket (AF_INET, SOCK_STREAM)
#创建 UDP/IP 套接字
udpSock = socket (AF_INET, SOCK_DGRAM)内置方法
| 用途 | 函数 | 描述 |
|———|————————-|————————————————-|
| 服务器端 | s.bind() | 绑定地址(主机名,端口号对)到套接字 |
| 服务器端 | s.listen() | 开始 TCP 监听 |
| 服务器端 | s.accept() | 被动接受 TCP 客户端链接,(阻塞式)等待链接的到来 |
| 客户端 | s.connect() | 主动初始化 TCP 服务器链接 |
| 客户端 | s.connect_ex() | connect() 扩展版本,出错时返回错误码,而不是抛出异常 |
| 公共用途 | s.recv() | 接受 TCP 数据 |
| 公共用途 | s.send() | 发送 TCP 数据 |
| 公共用途 | s.sendall() | 完整发送 TCP 数据 |
| 公共用途 | s.recvfrom() | 接受 UDP 数据 |
| 公共用途 | s.sendto() | 发送 UDP 数据 |
| 公共用途 | s.getpeername() | 链接到当前套接字的远程的地址(TCP 链接) |
| 公共用途 | s.getsockname() | 当前套接字的地址 |
| 公共用途 | s.getsockopt() | 返回当前套接字的参数 |
| 公共用途 | s.setsockopt() | 设置指定套接字的参数 |
| 公共用途 | s.close() | 关闭套接字 |
| 面向模块 | s.setblocking() | 设置套接字的阻塞与非阻塞模式 |
| 面向模块 | s.settimeout() | 设置阻塞套接字操做的超时时间 |
| 面向模块 | s.gettimeout() | 获得阻塞套接字操做的超时时间 |
| 面向文件 | s.fileno() | 套接字文件描述符 |
| 面向文件 | s.makefile() | 建立一个与该套接字关联的文件对 |伪代码实例
TCP 服务器
SocketServer 模块以 socket 为基础而创建的高级套接字通信模块,支持客户端请求的线程和多线程处理1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#创建 TCP/IP 服务器套接字
ss = socket ()
#套接字与地址绑定
ss.bind()
#监听连接
ss.listen()
#服务器无限循环
inf_loop:
#接受客户端连接
cs =ss.accept()
#通信循环
comm_loop:
#对话接收/发送
cs.recv()/cs.send()
#关闭客户端套接字
cs.close()
#关闭服务器套接字
ss.close()TCP 客户端
1
2
3
4
5
6
7
8
9
10#创建 TCP/IP 服务器套接字
cs = socket ()
#尝试连接服务器
cs.connect()
#通信循环
comm_loop:
#对话发送/接收
cs.send()/cs.recv()
#关闭客户端套接字
cs.close()UDP 服务器
1
2
3
4
5
6
7
8
9
10
11
12
13
14#创建 TCP/IP 服务器套接字
ss = socket ()
#套接字与地址绑定
ss.bind()
#监听连接
ss.listen()
#服务器无限循环
inf_loop:
#对话接收/发送
cs=ss.recvfrom()/ss.sendto()
#关闭客户端套接字
cs.close()
#关闭服务器套接字
ss.close()UDP 客户端
1
2
3
4
5
6
7
8#创建 TCP/IP 服务器套接字
cs = socket ()
#通信循环
comm_loop:
#对话发送/接收
cs.sendto()/cs.recvfrom()
#关闭客户端套接字
cs.close()socket 模块属性
SocketServer 模块
3.x 重命名为 socketserver,使编写一个 Socket 服务器通信变得更加简单,其实就是对 socket 的再封装模块类
| 类 | 描述 |
|——————————————————————-|———————————————————-|
| BaseServer | 包括服务器的核心功能与混合类的一些功能 |
| TCPServer/UDPServer | 基本的网络同步 TCP/UDP 服务器 |
| UnixStreamServer/UnixDatagramServer | 基本的文件同步 TCP/UDP 服务器 |
| ForkingMixIn/ThreadingMixIn | 实现了核心的进程/线程化功能,用于与服务器类进行混合,提供异步特性 |
| ForkingTCPServer/ForkingUDPServer | ForkingMixIn 和 TCPServer/UDPServer 组合 |
| ThreadingTCPServer/ThreadingUDPServer | Threading 和 TCPServer/UDPServer 组合 |
| BaseRequestHandler | 用于定制 Handler 类型 |
| StreamRequestHandler/DatagramRequestHandler | TCP/UDP 请求处理类的一个实现 |Twisted 框架
Twsited 是一个完整的事件驱动的网络框架,基于它能使用和开发完整的异步网络应用程序和协议;它不属于 Python 标准库,需要单独安装
它提供了大量的支持来建立完整的系统:网络协议、线程、安全性和身份认证、聊天/即时通信、数据库管理、关系数据库集成、Web/Internet、电子邮件、命令行参数、GUI 集成工具包等
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 君玉自牧!