socket模塊網(wǎng)絡(luò)編程

    1. socket()類
    # socket語法
    socket(socket_family, socket_type, protocol=0)
    # soket_family: AF_UNIT, AF_INET, AF_INET6...
    # socket_type: SOCK_STREAM(TCP), SOCK_DGRAM(UDP)
    # protocol默認為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)
    
    1. 套接字對象(內(nèi)置)方法
名 稱 描 述
服務(wù)器套接字方法
s.bind() 將地址(主機名、端口號對)綁定到套接字上
s.listen() 設(shè)置并啟動 TCP 監(jiān)聽器
s.accept() 被動接受 TCP 客戶端連接,一直等待直到連接到達(阻塞)
客戶端套接字方法
s.connect() 主動發(fā)起 TCP 服務(wù)器連接
s.connect_ex() connect()的擴展版本,此時會以錯誤碼的形式返回問題,而不是拋出一個異常
普通的套接字方法
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)的遠程地址
s.getsockname() 當(dāng)前套接字的地址
s.getsockopt() 返回給定套接字選項的值
s.setsockopt() 設(shè)置給定套接字選項的值
s.shutdown() 關(guān)閉連接
s.close() 關(guān)閉套接字
s.detach() 在未關(guān)閉文件描述符的情況下關(guān)閉套接字,返回文件描述符
s.ioctl() 控制套接字的模式(僅支持 Windows)
面向阻塞的套接字方法
s.setblocking() 設(shè)置套接字的阻塞或非阻塞模式
s.settimeout() 設(shè)置阻塞套接字操作的超時時間
s.gettimeout() 獲取阻塞套接字操作的超時時間
面向文件的套接字方法
s.fileno() 套接字的文件描述符
s.makefile() 創(chuàng)建與套接字關(guān)聯(lián)的文件對象
數(shù)據(jù)屬性
s.family 套接字家族
s.type 套接字類型
s.proto 套接字協(xié)議
    1. 創(chuàng)建 TCP 服務(wù)器
      $ vim tsTserv.py
  1 #!/usr/bin/python3
  2 # coding=utf-8
  3 
  4 # 導(dǎo)入socket模塊,和時間模塊的ctime()方法,返回當(dāng)前時間戳
  5 import socket
  6 from time import ctime
  7 
  8 HOST = ''       # 空白地址,表示任何可用的地址
  9 PORT = 6666     # 隨機端口
 10 BUFSIZ = 1024           # 緩沖區(qū)大小
 11 ADDR = (HOST, PORT)     # 地址
 12 
 13 # 創(chuàng)建一個tcp/ip套接字
 14 tcpSerSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 15 # 綁定的ip和端口并開啟監(jiān)聽
 16 tcpSerSock.bind(ADDR)
 17 # 傳入連接請求的最大數(shù)
 18 tcpSerSock.listen(5)
 19 
 20 # 等待用戶客戶端連接
 21 while True:
 22     # 輸出提示信息
 23     print('[*] waiting for connection...')
 24     # 被動接受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ù)據(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()
    1. 創(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)主機
 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. 執(zhí)行 TCP 服務(wù)器和客戶端
# 終端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. 創(chuàng)建 UDP 服務(wù)器
  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     # 返回數(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. 創(chuàng)建 UDP 客戶端
  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. 執(zhí)行 UDP 服務(wù)器和客戶端
# 終端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
    1. socket 模塊屬性
屬 性 名 稱 描 述
數(shù)據(jù)屬性
AF_UNIX、AF_INET、AF_INET6 、AF_NETLINK 、AF_TIPC Python 中支持的套接字地址家族
SO_STREAM、SO_DGRAM 套接字類型(TCP=流,UDP=數(shù)據(jù)報)
has_ipv6 指示是否支持 IPv6 的布爾標(biāo)記
異常
error 套接字相關(guān)錯誤
herror 主機和地址相關(guān)錯誤
gaierror 地址相關(guān)錯誤
timeout 超時時間
函數(shù)
socket() 以給定的地址家族、套接字類型和協(xié)議類型(可選)創(chuàng)建一個套接字對象
socketpair() 以給定的地址家族、套接字類型和協(xié)議類型(可選)創(chuàng)建一對套接字對象
create_connection() 常規(guī)函數(shù),它接收一個地址(主機名,端口號)對,返回套接字對象
fromfd() 以一個打開的文件描述符創(chuàng)建一個套接字對象
ssl() 通過套接字啟動一個安全套接字層連接;不執(zhí)行證書驗證
getaddrinfo() 獲取一個五元組序列形式的地址信息
getnameinfo() 給定一個套接字地址,返回(主機名,端口號)二元組
getfqdn() 返回完整的域名
gethostname() 返回當(dāng)前主機名
gethostbyname() 將一個主機名映射到它的 IP 地址
gethostbyname_ex() gethostbyname()的擴展版本,它返回主機名、別名主機集合和 IP 地址列表
gethostbyaddr() 將一個 IP 地址映射到 DNS 信息;返回與 gethostbyname_ex()相同的 3 元組
getprotobyname() 將一個協(xié)議名(如‘tcp’ )映射到一個數(shù)字
getservbyname()/getservbyport() 將一個服務(wù)名映射到一個端口號,或者反過來;對于任何一個函數(shù)來說協(xié)議名都是可選的
ntohl()/ntohs() 將來自網(wǎng)絡(luò)的整數(shù)轉(zhuǎn)換為主機字節(jié)順序
htonl()/htons() 將來自主機的整數(shù)轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序
inet_aton()/inet_ntoa() 將 IP 地址八進制字符串轉(zhuǎn)換成 32 位的包格式,或者反過來(僅用于 IPv4 地址)
inet_pton()/inet_ntop() 將IP 地址字符串轉(zhuǎn)換成打包的二進制格式,或者反過來(同時適用于 IPv4 和IPv6 地址)
getdefaulttimeout()/setdefaulttimeout() 以秒(浮點數(shù))為單位返回默認套接字超時時間;以秒(浮點數(shù))單位設(shè)置默認套接字超時時間
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容