python網(wǎng)絡(luò)編程學(xué)習(xí)筆記(二):socket建立網(wǎng)絡(luò)客戶端
1、建立socket
建立socket對象需要搞清通信類型和協(xié)議家族。通信類型指明了用什么協(xié)議來傳輸數(shù)據(jù)。協(xié)議的例子包括IPv4、IPv6、IPX\SPX、AFP。對于internet通信,通信類型基本上都是AF_INET(和IPv4對應(yīng))。協(xié)議家族一般表示TCP通信的SOCK_STREAM或者表示UDP通信的SOCK_DGRAM。因此對于TCP通信,建立一個socket連接的語句為:
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
對于UDP通信,建立一個socket連接的語句為:
s=socket.socket(socket.AF_INET,SOCK_DGRAM)
2、連接socket
連接socket需要提供一個tuple,包括host(主機(jī)名或者IP)和port(遠(yuǎn)程端口),類似代碼為:
s.connect(("www.baidu.com",80)
3、尋找端口號
socket庫中利用getservbyname()函數(shù)可以查詢端口號,一般需要兩個參數(shù):一是協(xié)議名,如http、smtp、pop3等,一個是端口名,如tcp、udp
例如:
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
port=socket.getservbyname('http','tcp')
port的返回值為80。若改為:
port=socket.getservbyname('smtp','tcp')
port的返回值為25。
4、從socket獲取信息
建立socket連接后,可以通過getsockname()獲取本身的ip地址和端口號,也可以通過getpeername()顯示遠(yuǎn)程機(jī)器的ip地址和端口號。
如:在python shell中
>>> import socket
>>> s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>> port=socket.getservbyname('http','tcp')
>>> s.connect(('www.baidu.com',port))
>>> print s.getsockname()
('192.168.87.138', 3213)
>>> print s.getpeername()
('220.181.111.147', 80)
Socket 模塊的類方法
類方法 說明
Socket 低層網(wǎng)絡(luò)接口(每個 BSD API)
socket.socket(family, type) 創(chuàng)建并返回一個新的 socket 對象
socket.getfqdn(name) 將使用點(diǎn)號分隔的 IP 地址字符串轉(zhuǎn)換成一個完整的域名
socket.gethostbyname(hostname) 將主機(jī)名解析為一個使用點(diǎn)號分隔的 IP 地址字符串
socket.fromfd(fd, family, type) 從現(xiàn)有的文件描述符創(chuàng)建一個 socket 對象
Socket 模塊的實(shí)例方法
實(shí)例方法 說明
sock.bind( (adrs, port) ) 將 socket 綁定到一個地址和端口上
sock.accept() 返回一個客戶機(jī) socket(帶有客戶機(jī)端的地址信息)
sock.listen(backlog) 將 socket 設(shè)置成監(jiān)聽模式,能夠監(jiān)聽 backlog 外來的連接請求
sock.connect( (adrs, port) ) 將 socket 連接到定義的主機(jī)和端口上
sock.recv( buflen[, flags] ) 從 socket 中接收數(shù)據(jù),最多 buflen 個字符
sock.recvfrom( buflen[, flags] ) 從 socket 中接收數(shù)據(jù),最多 buflen 個字符,同時返回?cái)?shù)據(jù)來源的遠(yuǎn)程主機(jī)和端口號
sock.send( data[, flags] ) 通過 socket 發(fā)送數(shù)據(jù)
sock.sendto( data[, flags], addr ) 通過 socket 發(fā)送數(shù)據(jù)
sock.close() 關(guān)閉 socket
sock.getsockopt( lvl, optname ) 獲得指定 socket 選項(xiàng)的值
sock.setsockopt( lvl, optname, val ) 設(shè)置指定 socket 選項(xiàng)的值
舉例:
>>> import socket
>>> socket.gethostbyname('www.baidu.com')
'220.181.111.147'
>>> socket.gethostbyname('www.126.com')
'123.125.50.22'
>>> socket.getfqdn('123.125.50.22')
'123.125.50.22'
這里getfqdn卻不能返回域名?
5、處理錯誤
關(guān)于錯誤異常的處理,主要就是用try、except語句。如將python網(wǎng)絡(luò)編程學(xué)習(xí)筆記(1)中g(shù)opherclient.py進(jìn)行一下修改:
# -*- coding: cp936 -*-
##modify by 小五義
import socket,sys
port =70
host=sys.argv[1]
filename=sys.argv[2]
try:
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
except Socket.error,e:
print "建立socket錯誤:%s"%e
try:
s.connect((host,port))
except socket.gaierror,e:
print "host或者端口錯誤:%s" %e
except socket.error,e:
print "連接錯誤:%s" %e
try:
s.sendall(filename+"\r\n")
except socket.error,e:
print "數(shù)據(jù)發(fā)送錯誤:%s" %e
sys.exit(1)
while 1:
try:
buf=s.recv(2048)
except socket.error,e:
print "接收錯誤:%s"%e
sys.exit(1)
if 'does not exist' in buf:
print "%s文件不存在" %filename
else:
if not len(buf):
break
sys.stdout.write(buf)
運(yùn)行結(jié)果是:
C:\>python gopherclient.py quux.org/ wh.txt
連接錯誤:[Errno 10060]
數(shù)據(jù)發(fā)送錯誤:[Errno 10057] 由于套接字沒有連接并且(當(dāng)
據(jù)報(bào)套接字時)
C:\>python gopherclient.py quux.org wh.txt
wh.txt文件不存在
=======================================================================================================================
對python網(wǎng)絡(luò)編程學(xué)習(xí)筆記(1)的添加
筆記1中在dos下運(yùn)行python gopherclient.py quux.org系統(tǒng)提示出錯的問題,終于明白了。錯誤原因是少了文件名。如在quux.org/有whatsnew.txt,于是在dos下運(yùn)行python gopherclient.py quux.org whatsnew.txt。這時會將whatsnew.txt的內(nèi)容全部列出。
- Python 網(wǎng)絡(luò)編程起步(Socket發(fā)送消息)
- Python使用Socket(Https)Post登錄百度的實(shí)現(xiàn)代碼
- python socket網(wǎng)絡(luò)編程步驟詳解(socket套接字使用)
- python實(shí)現(xiàn)socket端口重定向示例
- python socket 超時設(shè)置 errno 10054
- Python通過websocket與js客戶端通信示例分析
- python網(wǎng)絡(luò)編程學(xué)習(xí)筆記(三):socket網(wǎng)絡(luò)服務(wù)器
- python網(wǎng)絡(luò)編程之TCP通信實(shí)例和socketserver框架使用例子
- 為python設(shè)置socket代理的方法
- Pythony運(yùn)維入門之Socket網(wǎng)絡(luò)編程詳解
相關(guān)文章
Python3實(shí)現(xiàn)捕獲Ctrl+C終止信號
這篇文章主要為大家詳細(xì)介紹了如何利用Python3實(shí)現(xiàn)捕獲Ctrl+C終止信號的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03
python中找出numpy array數(shù)組的最值及其索引方法
下面小編就為大家分享一篇python中找出numpy array數(shù)組的最值及其索引方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04
python中asyncore異步模塊的實(shí)現(xiàn)
本文主要介紹了python中asyncore異步模塊的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
windows、linux下打包Python3程序詳細(xì)方法
這篇文章主要介紹了windows、linux下打包Python3程序詳細(xì)方法,需要的朋友可以參考下2020-03-03
解決Jupyter無法導(dǎo)入已安裝的 module問題
這篇文章主要介紹了解決Jupyter無法導(dǎo)入已安裝的 module問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
pandas dataframe中雙中括號和單中括號的區(qū)別及說明
這篇文章主要介紹了pandas dataframe中雙中括號和單中括號的區(qū)別及說明,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08

