python 网络编程(一):socket 模块
socket 基本API
socket 模块导入:
import socket
查看 socket 模块的帮助:
help(socket)
socket 异常
socket 接口在发生异常时会抛出以下几种错误类型
socket.error:与一般 IO 和通信问题有关的异常
|--socket.gaierror:与查询地址有关的
|--socket.herror:与其他地址错误有关,和 C 语言中的 h_errno 相关
|--socket.timeout:与一个 socket 调用 settimeout() 后,超时处理有关
socket.error 是其它三种异常的基类,使用 socket.error 可以捕捉其它三种异常。因此如果需要具体捕捉某种异常时,对 socket.error 的捕捉应该放到最后。如我们希望捕捉 socket.gaierror 和其它 socket.error,应该这样写:
try:
s.connect((host, port))
except socket.gaierror, e:
sys.stdout.write("address-related error connecting to server err: %s\n" % e)
sys.exit(1)
except socket.error, e:
sys.stdout.write("connect err: %s\n" % e)
sys.exit(1)
如果将 “except socket.error, e:” 块放到 “except socket.gaierror, e:” 块前,将永远不会执行 “except socket.gaierror, e:” 块中的内容
socket
原型:
socket([family[, type[, proto]]]) -> socket object
socket 是一个类方法,用于创建一个 socket 实例
这里的参数和 C 的 socket 定义基本一致,返回一个 socket 类实例
创建 TCP 类实例:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, e:
sys.stdout.write("Create socket err: %s\n" % e)
sys.exit(1)
创建 UDP 类实例:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
except socket.error, e:
sys.stdout.write("Create socket err: %s\n" % e)
sys.exit(1)
connect
原型:
connect(address)
connect 是一个实例方法,用于客户端连接到服务端,TCP 和 UDP 的客户端皆可使用
address 是一个 address info 元组:(host, port),host 是一个字符串类型,port 是一个整数类型
这里的 host 与 C 的 socket 接口使用上有所区别,可以是域名,也可以是一个点十分格式的 IP 地址,connect 会对域名进行 DNS 翻译
实例:
try:
s.connect((host, port))
except socket.gaierror, e:
sys.stdout.write("address-related error connecting to server err: %s\n" % e)
sys.exit(1)
except socket.error, e:
sys.stdout.write("connect err: %s\n" % e)
sys.exit(1)
这里,如果指定的 host DNS 翻译失败,会抛出 socket.gaierror 的异常。而其他情况,如服务端未打开对应端口,则会抛出 socket.error
setblocking
原型:
setblocking(flag)
setblocking 是一个实例方法
flag 为 True 表示将 socket 设置为阻塞的方式;为 False 表示将 socket 设置为非阻塞方式
实例:
sock.setblocking(False)
setsockopt
原型:
setsockopt(level, option, value)
setsockopt 是一个实例方法,用于设置 socket 属性,参数基本与 C 的 setsockopt 一致
可以使用以下代码查看当前支持的 option
#!/usr/bin/env python
import socket
solist = [x for x in dir(socket) if x.startswith('SO_')]
solist.sort()
for x in solist:
print x
实例:
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
bind
原型:
bind(address)
bind 是一个实例方法,用于绑定服务端地址,address 是一个元组(host, port),如果 host 为”,表示绑定服务器上的所有 IP 的 port 端口,相当于 C 中 IPv4 的 INADDR_ANY 和 IPv6 的 in6addr_any
实例:
s.bind((host, port))
listen
原型:
listen(backlog)
listen 是一个实例方法,用于开启服务端的监听。这里的 backlog 一般认为为 TCP 建立三次握手的时候,服务端处于接收 SYN 连接,回送 SYN,ACK,等待 ACK 的队列数量,如果服务器需要大并发,这个值尽量设置大一些。该值的具体含义每种系统有所区别,具体可查看相关文档</