此模块提供访问BSD套接字接口。
一、底层网络接口
允许在现代modern Unix systems, Windows, Mac OS X, BeOS, OS/2与可能的其他平台上使用。(需要平台依赖)
套接地址表示:
套接字地址表示如下:单个字符串用于AF_UNIX地址族。一对(主机,端口)是用于AF_INET地址类别,其中主机是一个字符串,代表互联网域名符号像'daring.cwi.nl的像'100.50.200.5'或IPv4地址中的主机名和端口一个整数。
对于IPv4地址,接受两个特殊的形式,而不是一个主机地址:空字符串表示INADDR_ANY和字符串<BROADCAST>'代表INADDR_BROADCAST的的。行为是不是为了向后兼容的IPv6,因此,你可能会想避免这些,如果你打算在你的Python程序支持IPv6。
如果你使用一个主机名在IPv4/v6的套接字地址的主机部分中,程序会显示一个不确定的行为,Python使用DNS解析返回的第一个地址。不同的方式解决的套接字地址转换为实际的IPv4/v6地址,DNS解析或主机配置的结果而定。尽量在主机部分使用数字地址。
通过setblocking()方法支持非阻塞式模式。
通过setTimeout()方法支持普遍超时。
exception
socket.error socket抛出系统异常。
socket.herror 引发与地址相关错误。C API中包括gethostbyname_ex()和gethostbyaddr()。
socket.gaierror 由getaddrinfo() and getnameinfo()引发的地址错误。
socket.timeout 由之前使用socket引发的超时异常
2.3新增
socket.AF_UNIX
socket.AF_INET
socket.AF_INET6
这些常数代表地址(协议)的家庭,用于socket()的第一个参数。 AF_UNIX常量如果没有定义,那么这个协议是不支持的。
socket.SOCK_STREAM
socket.SOCK_DGRAM
socket.SOCK_RAW
socket.SOCK_RDM
socket.SOCK_SEQPACKET
这些常量表示套接字类型,第二个参数用于socket()。 (只有SOCK_STREAM和SOCK_DGRAM似乎是普遍有用的。)
SO_*
socket.SOMAXCONN
MSG_*
SOL_*
IPPROTO_*
IPPORT_*
INADDR_*
IP_*
IPV6_*
EAI_*
AI_*
NI_*
TCP_*
在unix文档中socket和ip端口中有很多如此的常量,普遍用在setsockopt()和getsockopt()方法中,在大多数情况中,这些unix头文件中被定义的符号已经作为默认值已经提供。
SIO_*
RCVALL_*
windows WSAIoctl()常量参数。
New in version 2.6.
TIPC_*
TIPC相关常量。匹配C socket API 输出。
socket.has_ipv6
>>> socket.has_ipv6
True
表示支持IPV6.
socket.create_connection(address[, timeout[, source_address]])
连接到一个TCP服务监听网络地址address(host, port),并返回一个socket对象。这是一个比socket.connect()高级的函数:如果是非IP地址,会尝试连接所有解析到的域名。与此同时兼容IPV6/4使得对客户端编程更容易。
timeout,可选超时,如果长时间未连接成功,会在timeout时间重新连接。可以从getdefaulttimeout()获得默认超时时间。
s=socket.socket()
s.connect(('127.0.0.1',1234))
(地址,端口)作为address。
source_address 用法同address,如果不提供默认使用主机提供的。(2.7新增)
socket.getaddrinfo(host, port[, family[, socktype[, proto[, flags]]]])
取得该host(域名)的地址。返回值:(family, socktype, proto, canonname, sockaddr)
>>> socket.getaddrinfo('www.baidu.com',80,0,0,socket.SOL_TCP)
[(2, 1, 6, '', ('61.135.169.125', 80)), (2, 1, 6, '', ('61.135.169.105', 80))]
New in version 2.2.
socket.getfqdn([name])
返回一个完全合格的域名名称。如果名字被省略或为空,它被解释为本地主机。首先使用gethostbyaddr()找到合法的名称,其次是主机别名,最后使用gethostname()时返回的主机名。
socket.gethostbyname(hostname)
获取hostname(域名)的IP,不支持IPV6,getaddrinfo()支持IPV6.
>>> socket.gethostbyname('g.cn')
'203.208.46.211'
socket.gethostbyname_ex(hostname)
返回hostname的所有IP地址列表。
>>> socket.gethostbyname_ex('g.cn')
('g.cn', [], ['203.208.46.208', '203.208.46.209', '203.208.46.210', '203.208.46.212', '203.208.46.211'])
socket.gethostname()
获取当前主机名。可以通过gethostbyname(gethostname())获取当前IP
>>> socket.gethostname()
'mail.chen.com'
>>> from socket import *
>>> gethostbyname(gethostname())
'60.229.229.45'
socket.gethostbyaddr(ip_address)
由IP地址获取host名。
socket.getnameinfo(socketaddr, flags)
socket.getprotobyname(protocolname)
获取协议名的常数。比如(‘icmp’)
socket.getservbyname(servicename[, protocolname])
由给出的服务名获得端口,比如‘sshd',protocllname是互联网协议名,比如’udp‘
socket.getservbyport(port[, protocolname])
与上相反
socket.socket([family[, type[, proto]]])
由给出的参数建立socket
>>> s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>> socket.socket(socket.AF_INET,socket.SOCK_STREAM)
<socket._socketobject object at 0x10b0d5980>
socket.socketpair([family[, type[, proto]]])
同上,UNIX可用。 New in version 2.4.
socket.fromfd(fd, family, type[, proto])
从现有的文件描述符创建一个 socket 对象。UNIX可用
socket.inet_aton(ip_string)
用32位包装IP地址
socket.inet_ntoa(packed_ip)
转换32位IP地址
socket.getdefaulttimeout()
获得默认超时时间(秒)(浮点)
socket.setdefaulttimeout(timeout)
设置默认超时时间。初始化生成,未设置为无。
socket.SocketType
python类型对象,相当于type(socket(..))
另参考
Module SocketServer 网络服务简化模块
Module ssl 一个TLS / SSL套接字对象包装器。
二、Socket Objects 套接字对象
socket.accept()
接受连接。套接字必须绑定到一个地址,侦听连接。返回值是一对(conn,address),其中conn是一个新的socket对象可用来发送和接收数据连接上,地址是绑定的另一端连接到socket。
socket.bind(address)
把socket BIND到 address上。
socket.close()
关闭套接字。套接字对象的未来的操作将失败。远程端将收到不再有数据。套接字会自动关闭,当他们进行垃圾回收。!调用shutdown() 之前 close().
socket.connect(address)
连接到远程的套接字。!这种方法一直以来接受一对参数AF_INET地址,而不是只有一个元组。
socket.connect_ex(address)
返回错误值,不抛出异常。例如在异步连接时可用。
socket.fileno()
返回套接字的文件描述符(一个小整数)。!Windows下的小整数返回这个方法不能使用,可以使用一个文件描述符(如os.fdopen())。Unix则无此限制。
socket.getpeername() ?
返回的套接字连接到的远程地址。这是非常有用的,找到的端口号,例如远程IPv4/v6的套接字。
socket.getsockname()
返回套接字的自己的地址。这是非常有用的,以查询的IPv4/v6的套接字的端口号
socket.getsockopt(level, optname[, buflen]) ?
获得指定 socket 选项的值
socket.ioctl(control, option)
平台:windoes
?
socket.listen(backlog)
监听连接的套接字
socket.listen(backlog)
积压参数指定的最大排队连接数应至少为0,最大值是取决于系统的(通常为5),最低值将被强制为0。
socket.makefile([mode[, bufsize]])
返回一个文件对象与套接字关联。 (File对象文件对象)的文件对象引用一个DUP()PED版本的套接字文件描述符,这样的文件对象和套接字对象可能被关闭或垃圾独立收集。套接字必须是阻塞模式(它不能有超时)。可选的模式和,BUFSIZE参数解释同样的方式通过内置的file()函数。
socket.recv(bufsize[, flags])
从套接字接收数据。返回值是一个字符串代表接收到的数据。最大数量的数据立即收到指定由bufsize。
socket.recvfrom(bufsize[, flags])
从套接字接收数据。返回值是一对(string,地址)返回字符串和地址。
socket.recvfrom_into(buffer[, nbytes[, flags]])
从socket接收数据,写入到缓冲区,而不是创建一个新的字符串。返回值是一对(nbytes,address)nbytes以收到的字节数和地址套接字的地址发送数据。
socket.recv_into(buffer[, nbytes[, flags]])
接收从套接字nBytes个字节,将数据存储到一个缓冲区,而不是创建一个新的字符串。 nbytes以未指定的(或0),接收可在给定的缓冲区的大小。返回接收的字节数。
socket.send(string[, flags])
将数据发送到套接字。必须连接到远程套接字。
socket.sendall(string[, flags])
继续发送。同上。
socket.sendto(string, address)
将数据发送到套接字。套接字不应该被连接到远程套接字。
socket.sendto(string, flags, address)
同上。
socket.setblocking(flag)
设置阻塞或非阻塞套接字模式:如果flag为0,套接字设置无阻塞,否则成阻塞模式。起初,所有的套接字都处于阻塞模式。在非阻塞模式,如果一个recv()调用没有找到任何数据,或者如果一个发送()调用不能立即处理的数据,错误引发异常;处于阻塞模式,调用块,直到他们可以继续进行。 s.setblocking(0)是相当于到s.settimeout(0.0); s.setblocking(1)是相当于s.settimeout的(无)。
socket.settimeout(value)
设置超时时间。
socket.gettimeout()
获得超时时间。
套接字的阻塞和超时的一些注意事项:一个Socket对象可以在三种模式之一:堵塞,非阻塞,或超时。总是创建套接字处于阻塞模式。在阻止模式下,操作块,直到完成系统会返回一个错误(如连接超时)。在非阻塞模式,操作失败(有一个错误,不幸的是,依赖系统),如果他们不能立即完成。在超时模式下,操作失败,如果他们不能完成指定的超时套接字内,或如果系统返回一个错误。 setblocking()方法简直是一定的setTimeout()调用的简写。
超时模式内部设置套接字非阻塞模式。阻塞和超时模式之间共享文件描述符和套接字对象引用到同一网络的端点。这样做的后果是,套接字处于阻塞模式时,只能用于文件的makefile()方法返回的对象;超时或非阻塞模式不能立即完成的文件操作将失败。
需要注意的是连接(),操作超时设置,一般建议调用setTimeout()调用connect()之前,或通过一个超时参数到create_connection()。系统网络协议栈可能返回连接超时自身的错误,不管任何Python套接字超时设置。
(google)
socket.setsockopt(level, optname, value)
socket.shutdown(how)
关停半个或一个连接。
三、转载-简化socketAPI
表1. Python 类和模块
类/模块 | 说明 |
Socket | 低层网络接口(每个 BSD API) |
提供简化网络服务器开发的类 |
类方法 | 说明 |
Socket | 低层网络接口(每个 BSD API) |
socket.socket(family, type) | 创建并返回一个新的 socket 对象 |
socket.getfqdn(name) | 将使用点号分隔的 IP 地址字符串转换成一个完整的域名 |
socket.gethostbyname(hostname) | 将主机名解析为一个使用点号分隔的 IP 地址字符串 |
socket.fromfd(fd, family, type) | 从现有的文件描述符创建一个 socket 对象 |
实例方法 | 说明 |
sock.bind( (adrs, port) ) | 将 socket 绑定到一个地址和端口上 |
sock.accept() | 返回一个客户机 socket(带有客户机端的地址信息) |
sock.listen(backlog) | 将 socket 设置成监听模式,能够监听 backlog 外来的连接请求 |
sock.connect( (adrs, port) ) | 将 socket 连接到定义的主机和端口上 |
sock.recv( buflen[, flags] ) | 从 socket 中接收数据,最多 buflen 个字符 |
sock.recvfrom( buflen[, flags] ) | 从 socket 中接收数据,最多 buflen 个字符,同时返回数据来源的远程主机和端口号 |
sock.send( data[, flags] ) | 通过 socket 发送数据 |
sock.sendto( data[, flags], addr ) | 通过 socket 发送数据 |
sock.close() | 关闭 socket |
sock.getsockopt( lvl, optname ) | 获得指定 socket 选项的值 |
sock.setsockopt( lvl, optname, val ) | 设置指定 socket 选项的值 |
四、官方API例子
这里有四个最小的例子程序,使用TCP / IP协议的服务器相呼应它接收的所有数据
服务器必须执行的顺序socket,bind,listen,recv(可能重复recv()服务多个客户端),而客户端只需要顺序socket,connect.
first two examples support IPv4 only.
# Echo server program
import socket
HOST = '' # Symbolic name meaning all available interfaces
PORT = 50007 # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
data = conn.recv(1024)
if not data: break
conn.sendall(data)
conn.close()
# Echo client program
import socket
HOST = 'daring.cwi.nl' # The remote host
PORT = 50007 # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall('Hello, world')
data = s.recv(1024)
s.close()
print 'Received', repr(data)