python 网络编程(一):socket 模块

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 的队列数量,如果服务器需要大并发,这个值尽量设置大一些。该值的具体含义每种系统有所区别,具体可查看相关文档</

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值