-
- socket()類
# socket語(yǔ)法
socket(socket_family, socket_type, protocol=0)
# soket_family: AF_UNIT, AF_INET, AF_INET6...
# socket_type: SOCK_STREAM(TCP), SOCK_DGRAM(UDP)
# protocol默認(rèn)為0
# 創(chuàng)建TCP/IPv4套接字
tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 創(chuàng)建UDP/IPv6套接字
tcpSock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
- 套接字對(duì)象(內(nèi)置)方法
名 稱 |
描 述 |
服務(wù)器套接字方法 |
s.bind() |
將地址(主機(jī)名翘骂、端口號(hào)對(duì))綁定到套接字上 |
s.listen() |
設(shè)置并啟動(dòng) TCP 監(jiān)聽器 |
s.accept() |
被動(dòng)接受 TCP 客戶端連接充易,一直等待直到連接到達(dá)(阻塞) |
客戶端套接字方法 |
s.connect() |
主動(dòng)發(fā)起 TCP 服務(wù)器連接 |
s.connect_ex() |
connect()的擴(kuò)展版本算行,此時(shí)會(huì)以錯(cuò)誤碼的形式返回問(wèn)題篱蝇,而不是拋出一個(gè)異常 |
普通的套接字方法 |
s.recv() |
接收 TCP 消息 |
s.recv_into() |
接收 TCP 消息到指定的緩沖區(qū) |
s.send() |
發(fā)送 TCP 消息 |
s.sendall() |
完整地發(fā)送 TCP 消息 |
s.recvfrom() |
接收 UDP 消息 |
s.recvfrom_into() |
接收 UDP 消息到指定的緩沖區(qū) |
s.sendto() |
發(fā)送 UDP 消息 |
s.getpeername() |
連接到套接字(TCP)的遠(yuǎn)程地址 |
s.getsockname() |
當(dāng)前套接字的地址 |
s.getsockopt() |
返回給定套接字選項(xiàng)的值 |
s.setsockopt() |
設(shè)置給定套接字選項(xiàng)的值 |
s.shutdown() |
關(guān)閉連接 |
s.close() |
關(guān)閉套接字 |
s.detach() |
在未關(guān)閉文件描述符的情況下關(guān)閉套接字亡电,返回文件描述符 |
s.ioctl() |
控制套接字的模式(僅支持 Windows) |
面向阻塞的套接字方法 |
s.setblocking() |
設(shè)置套接字的阻塞或非阻塞模式 |
s.settimeout() |
設(shè)置阻塞套接字操作的超時(shí)時(shí)間 |
s.gettimeout() |
獲取阻塞套接字操作的超時(shí)時(shí)間 |
面向文件的套接字方法 |
s.fileno() |
套接字的文件描述符 |
s.makefile() |
創(chuàng)建與套接字關(guān)聯(lián)的文件對(duì)象 |
數(shù)據(jù)屬性 |
s.family |
套接字家族 |
s.type |
套接字類型 |
s.proto |
套接字協(xié)議 |
- 創(chuàng)建 TCP 服務(wù)器
$ vim tsTserv.py
1 #!/usr/bin/python3
2 # coding=utf-8
3
4 # 導(dǎo)入socket模塊抄沮,和時(shí)間模塊的ctime()方法,返回當(dāng)前時(shí)間戳
5 import socket
6 from time import ctime
7
8 HOST = '' # 空白地址除抛,表示任何可用的地址
9 PORT = 6666 # 隨機(jī)端口
10 BUFSIZ = 1024 # 緩沖區(qū)大小
11 ADDR = (HOST, PORT) # 地址
12
13 # 創(chuàng)建一個(gè)tcp/ip套接字
14 tcpSerSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
15 # 綁定的ip和端口并開啟監(jiān)聽
16 tcpSerSock.bind(ADDR)
17 # 傳入連接請(qǐng)求的最大數(shù)
18 tcpSerSock.listen(5)
19
20 # 等待用戶客戶端連接
21 while True:
22 # 輸出提示信息
23 print('[*] waiting for connection...')
24 # 被動(dòng)接受tcp連接,一直等待知道連接為止tcpCliSock為套接字母截,addr為元組(str, int)
25 (tcpCliSock, addr) = tcpSerSock.accept()
26 # 打印連接信息
27 print('[+]...connected from: %s: %d' % (addr[0], addr[1]))
28
29
30 # 接受用戶輸入并返回
31 while True:
32 # 接受BUFSIZ大小數(shù)據(jù)
33 data = tcpCliSock.recv(BUFSIZ)
34 # 當(dāng)數(shù)據(jù)為空到忽,則用戶關(guān)閉連接,退出
35 if not data:
36 break
37 # 返回時(shí)間戳+數(shù)據(jù),python3使用byte
38 tcpCliSock.send(b'[%s] %s' % (bytes(ctime(), 'utf-8'), data))
39 # 關(guān)閉客戶端連接
40 tcpCliSock.close()
41 # 關(guān)閉服務(wù)器
42 tcpSerSock.close()
- 創(chuàng)建 TCP 客戶端
$ vim tsTclnt.py
1 #!/usr/bin/python3
2 # coding=utf-8
3
4 import socket
5
6 HOST = '127.0.0.1'
7 PORT = 6666
8 BUFSIZ = 1024
9 ADDR = (HOST, PORT)
10
11 tcpClntSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
12 # 連接目標(biāo)主機(jī)
13 tcpClntSock.connect(ADDR)
14
15 while True:
16 # 輸入發(fā)送的數(shù)據(jù)
17 data = input(">>> ")
18
19 # 判斷是否退出
20 if data == 'exit':
21 break
22
23 # 發(fā)送信息清寇,byte
24 tcpClntSock.send(bytes(data, 'utf-8'))
25 # 接受返回的數(shù)據(jù)
26 result = tcpClntSock.recv(BUFSIZ)
27 if not result:
28 break
29 # 打印數(shù)據(jù)喘漏,解碼
30 print(bytes.decode(result))
31 # 關(guān)閉連接
32 tcpClntSock.close()
# 終端1
$ ./tsTserv.py #先開啟服務(wù)端
[*] waiting for connection... #等待用戶連接
[+]...connected from: 127.0.0.1: 36712 #有客戶端連接
[*] waiting for connection... #連接斷開,等待新的連接
# 終端2
$ ./tsTclnt.py #開啟客戶端
>>> hello #發(fā)送
[Mon Nov 27 08:36:45 2017] hello #回包
>>> good bey #發(fā)送
[Mon Nov 27 08:37:36 2017] good bey #回包
>>> exit #退出關(guān)閉連接
1 #!/usr/bin/python3
2 # coding=utf-8
3
4 import socket
5 from time import ctime
6
7 HOST = '127.0.0.1'
8 PORT = 6666
9 BUFSIZ = 1024
10 ADDR = (HOST, PORT)
11
12 udpSerSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
13 udpSerSock.bind(ADDR)
14
15 while True:
16 print('[*] waiting for message...')
17 # 接受數(shù)據(jù)
18 (data, addr) = udpSerSock.recvfrom(BUFSIZ)
19 # 返回?cái)?shù)據(jù)
20 udpSerSock.sendto(b'[%s] %s' % (bytes(ctime(), 'utf-8'), data), addr)
21 # 打印信息
22 print('[+]...received from and returned to: %s: %d' % (addr[0], addr[1]))
23 udpSerSock.close()
1 #!/usr/bin/python3
2 # coding=utf-8
3
4 import socket
5
6 HOST = '127.0.0.1'
7 PORT = 6666
8 BUFSIZ = 1024
9 ADDR = (HOST, PORT)
10
11 udpClntSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
12
13 while True:
14 data = input(">>> ")
15
16 if data == 'exit':
17 break
18
19 # 發(fā)送信息华烟,byte
20 udpClntSock.sendto(bytes(data, 'utf-8'), ADDR)
21 # 接受返回的數(shù)據(jù)
22 (result, ADDR) = udpClntSock.recvfrom(BUFSIZ)
23 if not result:
24 break
25 print(bytes.decode(result))
26 udpClntSock.close()
# 終端1
$ ./tsUserv.py #開啟udp服務(wù)器
[*] waiting for message...
[+]...received from and returned to: 127.0.0.1: 39160 #接受并返回
[*] waiting for message...
[+]...received from and returned to: 127.0.0.1: 39160
[*] waiting for message...
# 終端2
$ ./tsUclnt.py
>>> hello
[Mon Nov 27 10:25:27 2017] hello
>>> good bey!
[Mon Nov 27 10:25:34 2017] good bey!
>>> exit
屬 性 名 稱 |
描 述 |
數(shù)據(jù)屬性 |
AF_UNIX翩迈、AF_INET、AF_INET6 盔夜、AF_NETLINK 负饲、AF_TIPC |
Python 中支持的套接字地址家族 |
SO_STREAM、SO_DGRAM |
套接字類型(TCP=流喂链,UDP=數(shù)據(jù)報(bào)) |
has_ipv6 |
指示是否支持 IPv6 的布爾標(biāo)記 |
異常 |
error |
套接字相關(guān)錯(cuò)誤 |
herror |
主機(jī)和地址相關(guān)錯(cuò)誤 |
gaierror |
地址相關(guān)錯(cuò)誤 |
timeout |
超時(shí)時(shí)間 |
函數(shù) |
socket() |
以給定的地址家族返十、套接字類型和協(xié)議類型(可選)創(chuàng)建一個(gè)套接字對(duì)象 |
socketpair() |
以給定的地址家族、套接字類型和協(xié)議類型(可選)創(chuàng)建一對(duì)套接字對(duì)象 |
create_connection() |
常規(guī)函數(shù)椭微,它接收一個(gè)地址(主機(jī)名洞坑,端口號(hào))對(duì),返回套接字對(duì)象 |
fromfd() |
以一個(gè)打開的文件描述符創(chuàng)建一個(gè)套接字對(duì)象 |
ssl() |
通過(guò)套接字啟動(dòng)一個(gè)安全套接字層連接蝇率;不執(zhí)行證書驗(yàn)證 |
getaddrinfo() |
獲取一個(gè)五元組序列形式的地址信息 |
getnameinfo() |
給定一個(gè)套接字地址迟杂,返回(主機(jī)名匈仗,端口號(hào))二元組 |
getfqdn() |
返回完整的域名 |
gethostname() |
返回當(dāng)前主機(jī)名 |
gethostbyname() |
將一個(gè)主機(jī)名映射到它的 IP 地址 |
gethostbyname_ex() |
gethostbyname()的擴(kuò)展版本,它返回主機(jī)名逢慌、別名主機(jī)集合和 IP 地址列表 |
gethostbyaddr() |
將一個(gè) IP 地址映射到 DNS 信息;返回與 gethostbyname_ex()相同的 3 元組 |
getprotobyname() |
將一個(gè)協(xié)議名(如‘tcp’ )映射到一個(gè)數(shù)字 |
getservbyname()/getservbyport() |
將一個(gè)服務(wù)名映射到一個(gè)端口號(hào)间狂,或者反過(guò)來(lái)攻泼;對(duì)于任何一個(gè)函數(shù)來(lái)說(shuō)協(xié)議名都是可選的 |
ntohl()/ntohs() |
將來(lái)自網(wǎng)絡(luò)的整數(shù)轉(zhuǎn)換為主機(jī)字節(jié)順序 |
htonl()/htons() |
將來(lái)自主機(jī)的整數(shù)轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序 |
inet_aton()/inet_ntoa() |
將 IP 地址八進(jìn)制字符串轉(zhuǎn)換成 32 位的包格式,或者反過(guò)來(lái)(僅用于 IPv4 地址) |
inet_pton()/inet_ntop() |
將IP 地址字符串轉(zhuǎn)換成打包的二進(jìn)制格式鉴象,或者反過(guò)來(lái)(同時(shí)適用于 IPv4 和IPv6 地址) |
getdefaulttimeout()/setdefaulttimeout() |
以秒(浮點(diǎn)數(shù))為單位返回默認(rèn)套接字超時(shí)時(shí)間忙菠;以秒(浮點(diǎn)數(shù))單位設(shè)置默認(rèn)套接字超時(shí)時(shí)間 |