此模塊提供訪問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)