此模块提供访问BSD套接字接口。 python
容许在现代modern Unix systems, Windows, Mac OS X, BeOS, OS/2与可能的其余平台上使用。(须要平台依赖) 编程
套接地址表示:
套接字地址表示以下:单个字符串用于AF_UNIX地址族。一对(主机,端口)是用于AF_INET地址类别,其中主机是一个字符串,表明互联网域名符号像'daring.cwi.nl的像'100.50.200.5'或IPv4地址中的主机名和端口一个整数。 windows
对于IPv4地址,接受两个特殊的形式,而不是一个主机地址:空字符串表示INADDR_ANY和字符串<BROADCAST>'表明INADDR_BROADCAST的的。行为是否是为了向后兼容的IPv6,所以,你可能会想避免这些,若是你打算在你的Python程序支持IPv6。
若是你使用一个主机名在IPv4/v6的套接字地址的主机部分中,程序会显示一个不肯定的行为,Python使用DNS解析返回的第一个地址。不一样的方式解决的套接字地址转换为实际的IPv4/v6地址,DNS解析或主机配置的结果而定。尽可能在主机部分使用数字地址。 服务器
经过setblocking()方法支持非阻塞式模式。 网络
经过setTimeout()方法支持广泛超时。 ssh
exception 异步
socket.error socket抛出系统异常。 socket
socket.herror 引起与地址相关错误。C API中包括gethostbyname_ex()和gethostbyaddr()。
函数
socket.gaierror 由getaddrinfo() and getnameinfo()引起的地址错误。
google
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.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)
关停半个或一个链接。
表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 选项的值 |
这里有四个最小的例子程序,使用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)