概念: 服务器是一个软件或硬件,用于提供客户需要的“服务”。服务器存在的唯一目的就是等待客户的请求,给这些客户服务,然后再等待其它的请求。
分类:
硬件客户/服务器架构:打印机、文件服务器;
软件客户/服务器架构:Web 服务器 、数据库服务器、窗口服务器 (x服务器)等。
套接字:通讯端点
套接字地址:主机与端口,合法的端口号范围为 0 到 65535。其中,小于 1024 的端口号为系统保留端口。
一开始,套接字被设计用在同一台主机上多个应用程序之间的通讯。这也被称进程间通信IPC(Inter Process Communication)
套接字有两种:基于文件型,其“家族名”为 AF_UNIX,表示“地址家族:UNIX”;
和基于网络型,它有自己的家族名字:AF_INET,或叫“地址家族:Internet”。
Python 只支持 AF_UNIX,AF_NETLINK,和 AF_INET 家族。网络编程只用 AF_INET。 无论哪一种地址家族,套接字的类型只有两种:面向连接的套接字, 无连接套接字
面向连接的套接字,即在通讯之前一定要建立一条连接,这种通讯方式也被称为“虚电路”或“流套接字”。面向连接的通讯方式提供了顺序的,可靠的,不会重复的数据传输,而且也不会被加上数据边界。实现这种连接的主要协议就是传输控制协议(即 TCP) 。 无连接套接字,无需建立连接就可以进行通讯,实现这种连接的主要协议就是用户数据报协议(即 UDP)。
套接字对象的常用函数 函数 描述 服务器端套接字函数 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() 连接到当前套接字的远端的地址 s.getsockname() 当前套接字的地址 s.getsockopt() 返回指定套接字的参数 s.setsockopt() 设置指定套接字的参数 s.close() 关闭套接字 可以这样区分“因特网编程”和“Web 编程” ,后者仅包括针对 Web 的应用程序开发,也就是说Web 客户端和服务器是本章的焦点。 高级 Web 客户端的一个例子就是网络爬虫(aka 蜘蛛和机器人)。这些程序可以基于不同目的在因特网上探索和下载页面
URL 格式: prot_sch://net_loc/path;params?query#frag
URL 部件 描述
prot_sch 网络协议或者下载规划
net_loc 服务器位置(或许也有用户信息)
path 斜杠( / )限定文件或者 CGI 应用程序的路径。
Params 可选参数
query 连接符( & )连接键值对
frag 拆分文档中的特殊锚
如今的 Web 服务器典型的部件有 Aphache,Java(Tomcat),PHP 和各种 Perl 模块,Python 模块和集成的数据库部件(MySQL 或者 PostgreSQL),以及 SSL/security。