亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python網絡編程學習筆記(一)

 更新時間:2014年06月09日 21:15:13   作者:  
這篇文章主要介紹了python網絡編程基礎知識,需要的朋友可以參考下

學習用書:《python 網絡編程基礎》作者John Goerzen

第一部分底層網絡學習

        Python提供了訪問底層操作系統(tǒng)Socket接口的全部方法,需要的時候這些接口可以提供靈活而強有力的功能。

(1)基本客戶端操作

        在《python 網絡編程基礎》一書中,作者列出了一個簡單的Python客戶端程序,具體如下:

復制代碼 代碼如下:

import socket,sys
port =70
host=sys.argv[1]

filename=sys.argv[2]

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((host,port))

s.sendall(filename+"\r\n")

while 1:
    buf=s.recv(2048)
    if not len(buf):
        break
    sys.stdout.write(buf)

該程序實現(xiàn)的是Gopher協(xié)議,實現(xiàn)從主機上請求相關文檔的功能。(Gopher是Internet上一個非常有名的信息查找系統(tǒng),它將Internet上的文件組織成某種索引,很方便地將用戶從Internet的一處帶到另一處。在WWW出現(xiàn)之前,Gopher是Internet上最主要的信息檢索工具,Gopher站點也是最主要的站點。但在WWW出現(xiàn)后,Gopher失去了昔日的輝煌?,F(xiàn)在它基本很少被使用。)
       于是,我按照書上的語句進行了一下測試,在dos下運行python gopherclient.py quux.org。但是系統(tǒng)提示為

Traceback (most recent call last):
File "gopherclient.py", line 5, i
filename=sys.argv[2]
IndexError: list index out of range

看了一下,sys.argv只有兩個元素['gopherclient.py', 'quux.org/']所以filename=sys.argv[2]就超出下界了??墒菫槭裁磿霈F(xiàn)這個原因呢?是書里面寫錯了嗎,因為我也是初學socket,不是很了解,所以我也是沒有找到原因,如果哪位大牛知道是什么原因,希望能給講解一下。

(2)基本服務器操作
        《python 網絡編程基礎》一書中同樣給出了一個簡單的服務器程序,具體如下:

復制代碼 代碼如下:

import socket
host=''
port=51423
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind((host,port))
s.listen(1)

print "Server is running on port %d;press Ctrl-C to terminate." %port
while 1:
    clientsock,clientaddr=s.accept()
    clientfile=clientsock.makefile('rw',0)
    clientfile.write("welcome,"+str(clientaddr)+'\n')
    clientfile.write("Please enter a string:")
    line=clientfile.readline().strip()
    clientfile.write("You entered %d characters.\n" %len(line))
    clientfile.close()
    clientsock.close()

該程序運行后,提示“Server is running on port 51423:press Ctrl-C to terminate”。此時,通過另一臺機器telnet本機器的51423端口,如telnet 127.0.0.1:51423,此時會提示welcome 127.0.0.1 ****,please enter a string:。 然后輸入幾個字符后,會返回你輸入字符的個數(shù)。

這里就該程序進行一下分析:

1、首先導入socket模塊,給host和port賦值。
2、調用socket.socket()來建立一個socket賦值給s。socket.socket(domain, type, protocol).domain參數(shù)的值有AF_UNIX,AF_LOCAL,AF_INET,PF_UNIX,PF_LOCAL,PF_INET。這幾個值中AF_UNIX=AF_LOCAL, PF_UNIX=PF_LOCAL, AF_LOCAL=PF_LOCAL, AF_INET=PF_INET。一般來說,AF 表示ADDRESS FAMILY 地址族,PF 表示PROTOCOL FAMILY 協(xié)議族,但這兩個宏定義是一樣的,所以使用哪個都沒有關系。參數(shù)type指定socket的類型:SOCK_STREAM提供有序、可靠、雙向及基于連接的字節(jié)流。SOCK_DGRAM支持數(shù)據報。SOCK_SEQPACKET提供有序、可靠、雙向及基于連接的數(shù)據報通信。SOCK_RAW提供對原始網絡協(xié)議的訪問。SOCK_RDM提供可靠的數(shù)據報層,但是不保證有序性。protocol一般取0(為什么取0我也沒搞清楚,放在以后明白了再寫上吧)。
3、s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)。setsockopt()函數(shù)用于任意類型、任意狀態(tài)套接口的設置選項值。盡管在不同協(xié)議層上存在選項,但本函數(shù)僅定義了最高的“套接口”層次上的選項。選項影響套接口的操作,諸如加急數(shù)據是否在普通數(shù)據流中接收,廣播數(shù)據是否可以從套接口發(fā)送等等。 這個函數(shù)中,第一個參數(shù)為協(xié)議層參數(shù),指明了希望訪問一個選項所在的協(xié)議棧。通常我們需要使用下面中的一個:
SOL_SOCKET來訪問套接口層選項
SOL_TCP來訪問TCP層選項
第二個參數(shù)是與第一個參數(shù)相對應的。第一個參數(shù)決定了協(xié)議層level,第二個參數(shù)決定了該協(xié)議層下選項組合。SOL_SOCKET的選項組合如下:
協(xié)議層 選項名字
SOL_SOCKET SO_REUSEADDR
SOL_SOCKET SO_KKEPALIVE
SOL_SOCKET SO_LINGER
SOL_SOCKET SO_BROADCAST
SOL_SOCKET SO_OOBINLINE
SOL_SOCKET SO_SNDBUF
SOL_SOCKET SO_RCVBUF
SOL_SOCKET SO_TYPE
SOL_SOCKET SO_ERROR
具體的一些組合用法可見:http://wenku.baidu.com/view/23013b7101f69e3143329402.html
第三個參數(shù)設為1,這里我也沒很明白其中的意思,我試著把1換成50,結果是一樣的。換成0也是可以的,沒發(fā)現(xiàn)什么區(qū)別。希望大牛們給指點一下。
4、s.bind((host,port))綁定主機端口。
5、s.listen(1):listen函數(shù)使用主動連接套接口變?yōu)楸贿B接套接口,使得一個進程可以接受其它進程的請求,從而成為一個服務器進程。在TCP服務器編程中l(wèi)isten函數(shù)把進程變?yōu)橐粋€服務器,并指定相應的套接字變?yōu)楸粍舆B接。這里的參數(shù)涉及到一些網絡的細節(jié)。在進程正理一個一個連接請求的時候,可能還存在其它的連接請求。因為TCP連接是一個過程,所以可能存在一種半連接的狀態(tài),有時由于同時嘗試連接的用戶過多,使得服務器進程無法快速地完成連接請求。如果這個情況出現(xiàn)了,服務器進程希望內核如何處理呢?內核會在自己的進程空間里維護一個隊列以跟蹤這些完成的連接但服務器進程還沒有接手處理或正在進行的連接,這樣的一個隊列內核不可能讓其任意大,所以必須有一個大小的上限。這個backlog告訴內核使用這個數(shù)值作為上限。毫無疑問,服務器進程不能隨便指定一個數(shù)值,內核有一個許可的范圍。這個范圍是實現(xiàn)相關的。很難有某種統(tǒng)一,一般這個值會小30以內。這里設定為1表示每次最多只有一個等候處理的連接。
6、while循環(huán)從accept()函數(shù)開始。程序會在連接了一個客戶端后關閉socket。當某個客戶端連接的時,accept返回兩個信息,一個新的連接客戶端socket和客戶端的ip地址、端口號。如在上面的例子中添加print語句輸出clientsock和clientaddr,你會發(fā)現(xiàn)clientsock為socket.socketobject,clientaddr=('客戶端Ip',端口)。后面的循環(huán)中使用了文件類對象,服務器接著顯示出一些介紹性信息,從客戶端讀一個字符串,顯示一個應答,最后關閉客戶端socket。

相關文章

  • python3+PyQt5使用數(shù)據庫窗口視圖

    python3+PyQt5使用數(shù)據庫窗口視圖

    這篇文章主要為大家詳細介紹了python3+PyQt5使用數(shù)據庫窗口視圖,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • 使用Python-OpenCV消除圖像中孤立的小區(qū)域操作

    使用Python-OpenCV消除圖像中孤立的小區(qū)域操作

    這篇文章主要介紹了使用Python-OpenCV消除圖像中孤立的小區(qū)域操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Python簡單實現(xiàn)安全開關文件的兩種方式

    Python簡單實現(xiàn)安全開關文件的兩種方式

    這篇文章主要介紹了Python簡單實現(xiàn)安全開關文件的兩種方式,涉及Python的try語句針對錯誤的判定與捕捉相關技巧,需要的朋友可以參考下
    2016-09-09
  • 如何獲取Python簡單for循環(huán)索引

    如何獲取Python簡單for循環(huán)索引

    這篇文章主要介紹了如何獲取Python簡單for循環(huán)索引,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • python入門之語言基礎

    python入門之語言基礎

    這篇文章主要介紹了Python入門之基礎語法詳解,文中有非常詳細的代碼示例,對正在學習python的小伙伴們有很大的幫助喲,需要的朋友可以參考下
    2021-10-10
  • Python讀取和處理文件后綴為.sqlite的數(shù)據文件(實例講解)

    Python讀取和處理文件后綴為.sqlite的數(shù)據文件(實例講解)

    下面小編就為大家?guī)硪黄狿ython讀取和處理文件后綴為.sqlite的數(shù)據文件(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • python中with語句結合上下文管理器操作詳解

    python中with語句結合上下文管理器操作詳解

    這篇文章主要給大家介紹了關于python中with語句結合上下文管理器操作的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用python具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-12-12
  • 68行Python代碼實現(xiàn)帶難度升級的貪吃蛇

    68行Python代碼實現(xiàn)帶難度升級的貪吃蛇

    本文主要介紹了Python代碼實現(xiàn)帶難度升級的貪吃蛇,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • python解析xml文件實例分析

    python解析xml文件實例分析

    這篇文章主要介紹了python解析xml文件的方法,實例分析了Python針對XML文件節(jié)點及字段的獲取技巧,非常簡單實用,需要的朋友可以參考下
    2015-05-05
  • python3實現(xiàn)語音轉文字(語音識別)和文字轉語音(語音合成)

    python3實現(xiàn)語音轉文字(語音識別)和文字轉語音(語音合成)

    這篇文章主要介紹了python3實現(xiàn)語音轉文字(語音識別)和文字轉語音(語音合成),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10

最新評論