欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python網(wǎng)絡(luò)編程學(xué)習(xí)筆記(二):socket建立網(wǎng)絡(luò)客戶端

 更新時(shí)間:2014年06月09日 21:40:13   作者:  
看了這一節(jié),突然之間對(duì)python網(wǎng)絡(luò)編程學(xué)習(xí)筆記(1)中的一些不理解的問(wèn)題有了認(rèn)識(shí),至少明白了socket是怎么回事。這里關(guān)于socket的起源等問(wèn)題就不做筆記記錄了,直接進(jìn)入主題

1、建立socket

建立socket對(duì)象需要搞清通信類型和協(xié)議家族。通信類型指明了用什么協(xié)議來(lái)傳輸數(shù)據(jù)。協(xié)議的例子包括IPv4、IPv6、IPX\SPX、AFP。對(duì)于internet通信,通信類型基本上都是AF_INET(和IPv4對(duì)應(yīng))。協(xié)議家族一般表示TCP通信的SOCK_STREAM或者表示UDP通信的SOCK_DGRAM。因此對(duì)于TCP通信,建立一個(gè)socket連接的語(yǔ)句為:
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
對(duì)于UDP通信,建立一個(gè)socket連接的語(yǔ)句為:
s=socket.socket(socket.AF_INET,SOCK_DGRAM)

2、連接socket

連接socket需要提供一個(gè)tuple,包括host(主機(jī)名或者IP)和port(遠(yuǎn)程端口),類似代碼為:
s.connect(("www.baidu.com",80)

3、尋找端口號(hào)

socket庫(kù)中利用getservbyname()函數(shù)可以查詢端口號(hào),一般需要兩個(gè)參數(shù):一是協(xié)議名,如http、smtp、pop3等,一個(gè)是端口名,如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連接后,可以通過(guò)getsockname()獲取本身的ip地址和端口號(hào),也可以通過(guò)getpeername()顯示遠(yuǎn)程機(jī)器的ip地址和端口號(hào)。
如:在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 模塊的類方法
類方法 說(shuō)明
Socket 低層網(wǎng)絡(luò)接口(每個(gè) BSD API)
socket.socket(family, type) 創(chuàng)建并返回一個(gè)新的 socket 對(duì)象
socket.getfqdn(name) 將使用點(diǎn)號(hào)分隔的 IP 地址字符串轉(zhuǎn)換成一個(gè)完整的域名
socket.gethostbyname(hostname) 將主機(jī)名解析為一個(gè)使用點(diǎn)號(hào)分隔的 IP 地址字符串
socket.fromfd(fd, family, type) 從現(xiàn)有的文件描述符創(chuàng)建一個(gè) socket 對(duì)象

Socket 模塊的實(shí)例方法

實(shí)例方法 說(shuō)明
sock.bind( (adrs, port) ) 將 socket 綁定到一個(gè)地址和端口上
sock.accept() 返回一個(gè)客戶機(jī) socket(帶有客戶機(jī)端的地址信息)
sock.listen(backlog) 將 socket 設(shè)置成監(jiān)聽(tīng)模式,能夠監(jiān)聽(tīng) backlog 外來(lái)的連接請(qǐng)求
sock.connect( (adrs, port) ) 將 socket 連接到定義的主機(jī)和端口上
sock.recv( buflen[, flags] ) 從 socket 中接收數(shù)據(jù),最多 buflen 個(gè)字符
sock.recvfrom( buflen[, flags] ) 從 socket 中接收數(shù)據(jù),最多 buflen 個(gè)字符,同時(shí)返回?cái)?shù)據(jù)來(lái)源的遠(yuǎn)程主機(jī)和端口號(hào)
sock.send( data[, flags] ) 通過(guò) socket 發(fā)送數(shù)據(jù)
sock.sendto( data[, flags], addr ) 通過(guò) 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、處理錯(cuò)誤
關(guān)于錯(cuò)誤異常的處理,主要就是用try、except語(yǔ)句。如將python網(wǎng)絡(luò)編程學(xué)習(xí)筆記(1)中g(shù)opherclient.py進(jìn)行一下修改:

復(fù)制代碼 代碼如下:

# -*- 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錯(cuò)誤:%s"%e

try:
    s.connect((host,port))
except socket.gaierror,e:
    print "host或者端口錯(cuò)誤:%s" %e
except socket.error,e:
    print "連接錯(cuò)誤:%s" %e

try:
    s.sendall(filename+"\r\n")
except socket.error,e:
    print "數(shù)據(jù)發(fā)送錯(cuò)誤:%s" %e
    sys.exit(1)


while 1:
    try:
        buf=s.recv(2048)
    except socket.error,e:
        print "接收錯(cuò)誤:%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
連接錯(cuò)誤:[Errno 10060]
數(shù)據(jù)發(fā)送錯(cuò)誤:[Errno 10057] 由于套接字沒(méi)有連接并且(當(dāng)
據(jù)報(bào)套接字時(shí))

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

=======================================================================================================================
對(duì)python網(wǎng)絡(luò)編程學(xué)習(xí)筆記(1)的添加
筆記1中在dos下運(yùn)行python gopherclient.py quux.org系統(tǒng)提示出錯(cuò)的問(wèn)題,終于明白了。錯(cuò)誤原因是少了文件名。如在quux.org/有whatsnew.txt,于是在dos下運(yùn)行python gopherclient.py quux.org whatsnew.txt。這時(shí)會(huì)將whatsnew.txt的內(nèi)容全部列出。

相關(guān)文章

  • Python3實(shí)現(xiàn)捕獲Ctrl+C終止信號(hào)

    Python3實(shí)現(xiàn)捕獲Ctrl+C終止信號(hào)

    這篇文章主要為大家詳細(xì)介紹了如何利用Python3實(shí)現(xiàn)捕獲Ctrl+C終止信號(hào)的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-03-03
  • Python日期時(shí)間模塊arrow的具體使用

    Python日期時(shí)間模塊arrow的具體使用

    Python中有很多時(shí)間和日期處理的庫(kù),有time、datetime等,本文主要介紹了一下arrow,arrow是一個(gè)專門處理時(shí)間和日期的輕量級(jí)Python庫(kù),感興趣的可以了解一下
    2021-09-09
  • python中找出numpy array數(shù)組的最值及其索引方法

    python中找出numpy array數(shù)組的最值及其索引方法

    下面小編就為大家分享一篇python中找出numpy array數(shù)組的最值及其索引方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • python中asyncore異步模塊的實(shí)現(xiàn)

    python中asyncore異步模塊的實(shí)現(xiàn)

    本文主要介紹了python中asyncore異步模塊的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • pandas分別寫入excel的不同sheet方法

    pandas分別寫入excel的不同sheet方法

    今天小編就為大家分享一篇pandas分別寫入excel的不同sheet方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • python開(kāi)發(fā)任意表達(dá)式求值全功能示例

    python開(kāi)發(fā)任意表達(dá)式求值全功能示例

    這篇文章主要為大家介紹了python開(kāi)發(fā)任意表達(dá)式求值全功能示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • windows、linux下打包Python3程序詳細(xì)方法

    windows、linux下打包Python3程序詳細(xì)方法

    這篇文章主要介紹了windows、linux下打包Python3程序詳細(xì)方法,需要的朋友可以參考下
    2020-03-03
  • 解決Jupyter無(wú)法導(dǎo)入已安裝的 module問(wèn)題

    解決Jupyter無(wú)法導(dǎo)入已安裝的 module問(wèn)題

    這篇文章主要介紹了解決Jupyter無(wú)法導(dǎo)入已安裝的 module問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • Python Matplotlib初階使用入門教程

    Python Matplotlib初階使用入門教程

    本文介紹Python Matplotlib庫(kù)的入門求生級(jí)使用方法,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-11-11
  • pandas dataframe中雙中括號(hào)和單中括號(hào)的區(qū)別及說(shuō)明

    pandas dataframe中雙中括號(hào)和單中括號(hào)的區(qū)別及說(shuō)明

    這篇文章主要介紹了pandas dataframe中雙中括號(hào)和單中括號(hào)的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08

最新評(píng)論