小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

python 網(wǎng)絡(luò)編程基礎(chǔ)實例

 看風景D人 2014-01-23

腳本學堂----網(wǎng)站   

  python實在是太方便,太易用了,三方庫的支持又全,語法又簡單,對開發(fā)人員來說,實在是居家旅行,XXXX的必備利器。
    周末研究了下python的網(wǎng)絡(luò)支持,做一下記錄,以備隨后翻閱。

    python支持BSD的socket進行網(wǎng)絡(luò)編程,其API跟C中的大同小異,先看看TCP方式的,說到網(wǎng)絡(luò)編程,肯定會設(shè)計到server和client,下面分別來看下。

TCP方式

server端
server端的socket一般流程是這樣:
    1.建立一個socket(可以選擇socket類型INET,UNIX等,以及連接方式TCP/UDP)
    2.使用bind公開一個端口,使得client可以方便連接
    3.設(shè)置一個listen隊列的大小
    4.進入一個無限循環(huán),在此無限循環(huán)中,使用accept函數(shù)來等待客戶連接,此函數(shù)返回一個新的socket, 對應(yīng)于客戶端的socket,建立通信信道。對socket的處理一般放5.在外部單獨的函數(shù)中(并發(fā))
    6.通過send()/recv()來對socket進行讀寫操作

下面看一下例子:
   

復制代碼 代碼如下:
def tcpServer(): 
        srvsock = socket.socket( socket.AF_INET, socket.SOCK_STREAM) 
        srvsock.bind(('', 9527)) 
        srvsock.listen(5) 
     
        while True: 
            clisock, (remoteHost, remotePort) = srvsock.accept() 
            print "[%s:%s] connected" % (remoteHost, remotePort) 
            #do something on the clisock 
            clisock.close() 
      
    if __name__ == "__main__": 
        tcpServer() 

client端
    建立一個新的socket
    使用connect函數(shù)與遠程主機獲得連接
    在此socket上進行I/O操作
   

復制代碼 代碼如下:
def tcpClient(): 
        clisock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
        clisock.connect(('localhost', 9527)) 
         
        #I/O on this clisock 
        #clisock.send("") 
        #dat = clisock.recv(len) 
         
        print dat 
         
    if __name__ == "__main__": 
        tcpClient() 

 由代碼量可見python之簡單,想要將這個例子改造成一個文件傳輸器,估計只需要增加不到20行代碼即可。

UDP方式

UDP號稱無連接傳輸,全然沒有TCP那么復雜,三次握手,錯誤重傳之類的機制都沒有,發(fā)的只管發(fā),收得只管收,收到?jīng)]有?不知道,順序不對怎么辦?不管!就是這樣,但是速度就要比TCP高得多了。在對數(shù)據(jù)幀要求不是很高的地方,這確實是很好用的,比如網(wǎng)絡(luò)上的視頻傳輸,音頻傳輸?shù)取?/p>

server端
    建立數(shù)據(jù)報形式的socket
    公開一個端口,一邊客戶端連接
    開始接收數(shù)據(jù)
   

復制代碼 代碼如下:
def udpServer(): 
        address = ('', 9527) 
        srvsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
        srvsock.bind(address) 
        #data,addr = srvsock.recvfrom(2048) 
     
    if __name__ == "__main__": 
        udpServer() 

 需要注意的是,server中address元組中的引號表示可以接受任何地址來的數(shù)據(jù)報,TCP例子中的則表示可以接受任意地址發(fā)起的連接。

client端
    新建一個數(shù)據(jù)報socket
    收發(fā)數(shù)據(jù)
   

復制代碼 代碼如下:
def udpClient(): 
        address = ('localhost', 9527) 
        clisock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
        #clisock.sendto(data, address) 
         
    if __name__ == "__main__": 
        udpClient() 

    文中給出的例子已經(jīng)具有網(wǎng)絡(luò)程序的基本結(jié)構(gòu),在實際應(yīng)用中,應(yīng)該自行擴展對socket的處理,socket說到底跟文件句柄,文件描述符,管道描述符等都是一個概念,可以對其進行I/O處理,事實上,在UNIX類系統(tǒng)中,對socket的操作跟對文件句柄的操作沒有任何形式上的差異。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多