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

    1. 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)
    
    1. 套接字對(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é)議
    1. 創(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()
    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)主機(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. 執(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     # 返回?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. 創(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ù)報(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í)間
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市纺弊,隨后出現(xiàn)的幾起案子牛欢,更是在濱河造成了極大的恐慌,老刑警劉巖淆游,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件傍睹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡犹菱,警方通過(guò)查閱死者的電腦和手機(jī)拾稳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)腊脱,“玉大人访得,你說(shuō)我怎么就攤上這事∩掳迹” “怎么了悍抑?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)杜耙。 經(jīng)常有香客問(wèn)我搜骡,道長(zhǎng),這世上最難降的妖魔是什么泥技? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任浆兰,我火速辦了婚禮,結(jié)果婚禮上珊豹,老公的妹妹穿的比我還像新娘簸呈。我一直安慰自己,他們只是感情好店茶,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布蜕便。 她就那樣靜靜地躺著,像睡著了一般贩幻。 火紅的嫁衣襯著肌膚如雪轿腺。 梳的紋絲不亂的頭發(fā)上两嘴,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音族壳,去河邊找鬼憔辫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛仿荆,可吹牛的內(nèi)容都是我干的贰您。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼拢操,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼锦亦!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起令境,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤杠园,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后舔庶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抛蚁,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年栖茉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了篮绿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吕漂,死狀恐怖亲配,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惶凝,我是刑警寧澤吼虎,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站苍鲜,受9級(jí)特大地震影響思灰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜混滔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一洒疚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坯屿,春花似錦油湖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春喊括,著一層夾襖步出監(jiān)牢的瞬間胧瓜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工郑什, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留府喳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓蘑拯,卻偏偏與公主長(zhǎng)得像劫拢,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子强胰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容