国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python網絡編程學習筆記(二):socket建立網絡客戶端

2019-11-25 18:23:16
字體:
來源:轉載
供稿:網友

1、建立socket

建立socket對象需要搞清通信類型和協議家族。通信類型指明了用什么協議來傳輸數據。協議的例子包括IPv4、IPv6、IPX/SPX、AFP。對于internet通信,通信類型基本上都是AF_INET(和IPv4對應)。協議家族一般表示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(主機名或者IP)和port(遠程端口),類似代碼為:
s.connect(("www.baidu.com",80)

3、尋找端口號

socket庫中利用getservbyname()函數可以查詢端口號,一般需要兩個參數:一是協議名,如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()顯示遠程機器的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 低層網絡接口(每個 BSD API)
socket.socket(family, type) 創建并返回一個新的 socket 對象
socket.getfqdn(name) 將使用點號分隔的 IP 地址字符串轉換成一個完整的域名
socket.gethostbyname(hostname) 將主機名解析為一個使用點號分隔的 IP 地址字符串
socket.fromfd(fd, family, type) 從現有的文件描述符創建一個 socket 對象

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 選項的值

舉例:
>>> 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、處理錯誤
關于錯誤異常的處理,主要就是用try、except語句。如將python網絡編程學習筆記(1)中gopherclient.py進行一下修改:

復制代碼 代碼如下:

# -*- 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 "數據發送錯誤:%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)

運行結果是:

C:/>python gopherclient.py quux.org/ wh.txt
連接錯誤:[Errno 10060]
數據發送錯誤:[Errno 10057] 由于套接字沒有連接并且(當
據報套接字時)

C:/>python gopherclient.py quux.org wh.txt
wh.txt文件不存在

=======================================================================================================================
對python網絡編程學習筆記(1)的添加
筆記1中在dos下運行python gopherclient.py quux.org系統提示出錯的問題,終于明白了。錯誤原因是少了文件名。如在quux.org/有whatsnew.txt,于是在dos下運行python gopherclient.py quux.org whatsnew.txt。這時會將whatsnew.txt的內容全部列出。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 太康县| 元朗区| 凤城市| 玛纳斯县| 泰兴市| 武威市| 金华市| 辉南县| 芜湖县| 封丘县| 汶川县| 湘阴县| 磐安县| 泾川县| 田阳县| 张家界市| 岢岚县| 中宁县| 治县。| 和硕县| 永济市| 汕头市| 利川市| 革吉县| 英吉沙县| 吴堡县| 盱眙县| 拜城县| 梓潼县| 田林县| 泗阳县| 丽江市| 德安县| 南皮县| 来宾市| 德昌县| 焦作市| 松原市| 辛集市| 松桃| 福贡县|