1. 程式人生 > >Python3常用網路程式設計模組介紹

Python3常用網路程式設計模組介紹

一、網路基礎

   網路由下往上分為:物理層、資料鏈路層、網路怪、傳輸層、會話層、表示層和應用層。
    TCP/IP協議是傳輸層協議,主要解決資料如何在網路中傳輸;socket則是對TCP/IP協議的封裝,它本身不是協議,而是一個呼叫介面;
    HTTP、FTP是應用協議,主要解決如何包裝資料;

TCP連線的三次握手:
第一次握手:客戶端傳送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也傳送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ack=k+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。

利用Socket建立網路連線的步驟(一對套接字連線過程):
    1、伺服器監聽:伺服器端套接字並不定位具體的客戶端套接字,而是處於等待連線的狀態,實時監控網路狀態,等待客戶端的連線請求。
    2、客戶端請求:指客戶端的套接字提出連線請求,要連線的目標是伺服器端的套接字。
  為此,客戶端的套接字必須首先描述它要連線的伺服器的套接字,指出伺服器端套接字的地址和埠號,然後就向伺服器端套接字提出連線請求。
  3、連線確認:當伺服器端套接字監聽到或者說接收到客戶端套接字的連線請求時,就響應客戶端套接字的請求,建立一個新的執行緒,把伺服器端套接字的描述發給客戶端,一旦客戶端確認了此描述,雙方就正式建立連線。
    而伺服器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連線請求。

TCP和UDP的區別:
    TCP是面向連線的,連線經過了三次握手,很大程度的保證了連線的可靠性;
    UDP傳送資料前並不與對方建立連線,對收到的資料也不傳送觸診訊號,因此UDP的開銷更小,資料傳輸速率更高。QQ是就採用的UPD協議傳輸,而相似的MSN採用的是TCP協議傳輸。

二、socket模組

網路服務都是建立在socket基礎之上的,socket是網路連線端點,是網路的基礎;每個socket都被繫結到指定的IP和埠上;

1、首先使用socket(family=AF_INET,type=SOCK_STREAM,proto)函式建立一個物件;

  family            地址引數,還可以有AF_INET6,AF_UNIX;

  type               socket型別;

  proto             協議型別,可選引數

建立成功後用bind('127.0.0.1',1051)繫結ip地址和埠,如果地址為空則表示本機;

2、socket物件方法:

 1     bind('127.0.0.1',1051)    繫結ip地址和埠,如果地址為空則表示本機;
 2     listen(backlog)          監聽所有socket物件建立的連線,backlog指定連線佇列數,最小為1,最大一般為5;
 3     connect(address)
 4     connect_ex(address)      兩個都可以連線到服務端,不同的是第一個返回一個錯誤,第二個返回一個異常;
 5     accept()              接收來自客戶端的資料,返回一個新的socket物件和客戶端地址;
 6     recv(bufsize,flags)      僅返回所接收的字串;bufsize指定接收緩衝區的大小,flags為可選引數,表示接收標誌;
7 recvfrom(bufsize,flags) 返回所接收的字串和地址; 8 send(string,flags)    向已經連線的socket傳送資料; 9 sendall(string,flags) 與send不同的是將會一直髮送完全部資料; 10 sendto(string,flags,address)可以向一個未連線的socket傳送資料; 11 makefile(mode,bufsize) 將socket關聯到檔案物件上,兩個引數都是可選的,mode檔案模式,bufsize緩衝區大小; 12 close()      完成通訊後,應使用close方法關閉網路連線;
 1 # 伺服器端例項
 2 import socket
3 sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 4 sock.bind('127.0.0.1',20178) 5 sock.listen(5) 6 conn,address = sock.accept() 7 print('connect by ',address) 8 while True: 9 data = conn.recv(100) 10 if not data:break 11 print(data) 12 conn.send("anydata") 13 sock.close()
1 #客戶端例項
2 import socket
3 sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #與服務端相同 4 sock.connect('127.0.0.1',20178) 5 sock.send("data") 6 data = sock.recv(98) 7 print('recieved ',data) 8 sock.close()

 可用select模組來實現多個併發的互動

 1 # 服務端例項
 2 import socket
 3 import select
 4 import queue
 5 
 6 sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 7 sock.setblocking(False)   #設定為非阻塞服務
 8 sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
 9 sock.bind('127.0.0.1',20178)
10 sock.listen(10)
11 rlists = [sock]
12 wlists = []
13 msg_que = {}
14 timeout = 20
15 
16 while rlists:
17     rs,ws,es = select.select(rlists,wlists,rlists,timeout)
18     if not (rs or ws or es):
19         print('timeout...')
20         break
21     for s in rs:
22         if s is sock:
23             conn,address = s.accept()
24             conn.setblocking(False)
25             rlists.append(conn)
26             msg_que[conn] = queue.Queue()
27         else:
28             data = s.recv(1024)
29             if data:
30                 print(data)
31                 msg_que[s].put(data)
32                 if s not in wlists:
33                     wlists.append(s)
34             else:
35                 if s in wlists:
36                     wlists.remove(s)
37                 rlists.remove(s)
38                 s.close()
39                 del msg_que[s]
40     for s in ws:
41         try:
42             msg = msg_que[s].get_nowait()
43         except queue.Empty:
44             wlists.remove(s)
45     for s in es:
46         print('except ',s.getpeername())
47         if s in rlists:
48             rlists.remove(s)
49         if s in wlists:
50             wlists.remove(s)
51         s.close()
52         del msg_que[s]

三、httplib模組

(一)httplib模組內提供了HTTPConnection物件和HTTPRresponse物件;

當建立一個HTTPConnection物件時可用方法有:

1、request(method,url,body,headers)     向伺服器傳送請求;

       method  方法,有"GET","POST"等待連線

       body       傳送的資料

       headers  傳送的HTTP頭

2、getresponse() 返回一個HTTPResponse物件;

3、close()            關閉與伺服器的連線;

4、send(data)     傳送資料;

5、putrequest(request,selector,skip_host,skip_accep_encoding) 向伺服器傳送請求;

         request          所傳送的操作;

         selector          進行操作的URL;

         skip_host       若為True則禁止自動傳送"POST";

         skip_accep_encoding 若為True則禁止自動傳送"Accept-Encoding:headers"

6、putheader(headers,argument,...)

         headers         傳送的HTTP頭;

         argument      傳送的引數;

7、endheaders()

(二)HTTPResponse   物件方法:

 1、read()                   獲得伺服器的響應主體;

 2、getheader(name,default)  獲取伺服器響應的HTTP頭;

 3、version()               檢視HTTP協議的版本;

 4、status()                 檢視HTTP協議的狀態;

 5、reason()

四、ftp模組

1、FTP(host,user,passwd,acct)  建立一個FTP連線物件,此物件的方法有:     

FTP(host,user,passwd,acct)    建立一個FTP連線物件
    getwelcome()             獲得FTP伺服器的歡迎資訊
    abort()                   中斷檔案傳輸
    sendcmd(command)          傳送命令,command為一個字串
    voidcmd(command)          傳送命令,但沒有返回值
    retrbinary(command,callback,maxblocksize,rest) 下載檔案(二進位制)
        command            由"RETR 檔名  組成"
        callback          回撥函式
        maxblocksize      每次傳輸最大位元組數
        rest              檔案續傳位置
    retrlines(command,callback)下載檔案(ASCII)
    storbinary(command,file,blocksize)    以二進位制上傳檔案;
    storlines(command,file)    以ASCII形式上傳檔案;
    dir()                   獲取當前目錄的內容列表;
    rename(fromname,toname)    重新命名
    delete(filename)        刪除檔案
    cwd(pathname)            改變當前目錄
    mkd(pathname)            建立目錄
    rmd(dirname)            刪除伺服器上的目錄
    size(filename)           獲取檔案大小
    set_pasv(boolean)        設定傳輸模式
    quit()                
    close()                  關閉伺服器的連線
set_debuglevel(level)         設定除錯級別
connect(host,port)            配置host
login(user,passwd,acct)       登入

附:可使用poplib模組和smtplib模組收發郵件

相關推薦

Python3常用網路程式設計模組介紹

一、網路基礎    網路由下往上分為:物理層、資料鏈路層、網路怪、傳輸層、會話層、表示層和應用層。    TCP/IP協議是傳輸層協議,主要解決資料如何在網路中傳輸;socket則是對TCP/IP協議的封裝,它本身不是協議,而是一個呼叫介面;    HTTP、FTP是應用協議,主要解決如何包裝資料;TC

python3 實現網路程式設計(socket)

使用方法:要先執行伺服器指令碼:server.py,再執行客戶端指令碼:client.py  server.py原始碼: #!/usr/bin/python3 import socket import sys #建立socket物件 server = socket.socket

Python3常用語句及用法介紹(二)——條件語句

條件語句 ①if elif else條件語句 n=int(input('Enter a number:')) if n>0: print('Positive number') elif n<0: print('Negative number') else:

Python3常用語句及用法介紹(一)——print/import/賦值語句

1.print語句 ①括號括起來(自python3),逗號隔開 ②輸出時,隔開的各個字串前會自動加空格 ③需要輸出的符號可包含在字串中,也可單獨輸出,使用+號則不增加空格 ④同行列印的幾種方法 2.import語句 ①輕量化:匯入某模組的某函式 ②大塊匯入:匯入某

Netty深入分析與Dubbo實戰解析(一)——網路程式設計模型介紹

Linux網路程式設計模型介紹 Linux核心將所有外部裝置都看作一個檔案來操作,對一個檔案的讀寫操作會呼叫核心提供的系統命令,返回一個file descriptor(fd,檔案描述符)。而對一個socket的讀寫也會有相應的描述符。描述符就是一個數字,它指向核心中的一個結構體(檔案路徑

python3網路程式設計的編碼問題

在學習python3網路程式設計的時候,總是出現“a bytes-like object is required,not ‘str’ ”這種提示,很苦惱,網上也百度了一波,可是還是沒有得到解決,便看了看有關編碼的知識,可是看了之後還是報同樣的問題,感覺應該是se

網路程式設計框架介紹(八, 持續更新)

自從JDK1.4中有了NIO以後,這個方面越來越活躍,也為java贏得更多開發者的支援。 做java網路程式設計需要掌握一些基本的知識和技能:套接字程式設計、阻塞/非阻塞通訊、建立HTTP伺服器與客戶程式、資料報通訊、物件的序列化與反序列化、Ja

Python3 Socket網路程式設計

Socket又稱"套接字",應用程式通常通過"套接字"向網路發出請求或者應答網路請求,使主機間或者一臺計算機上的程序間可以通訊。socket起源於UNIX,在Unix一切皆檔案哲學的思想下,socket是一種"開啟—讀/寫—關閉"模式的實現,伺服器和客戶端各自維護一個"檔案"

常用模組+面向物件+異常+網路程式設計回顧--day30

常用模組 os* 作業系統 多數是檔案操作 os.path 處理檔案路徑 shutil 高階檔案處理模組 用起來更方便 sys 直譯器相關 json* 一種序列化方式 json可以支援跨平臺 pickle 一種序列化方式 僅在python可用 re* 正則

iOS開發之網路程式設計--1、AFNetwork 3.x 的所有開發中常用基礎介紹

前言:第三方網路請求框架中AFNetwork 3.x收歡迎程度相當高的: 由於iOS 7 和 Mac OS X 10.9 Mavericks 中一個顯著的變化就是對 Foundation URL 載入系統的徹底重構。而且現在AFN 3.x版本 完全摒棄了NSURLConnection,而使用了NSURL

網路程式設計基礎【day10】:作業系統介紹

一、為什麼要有作業系統 現代的計算機系統主要是由一個或者多個處理器,主存,硬碟,鍵盤,滑鼠,顯示器,印表機,網路介面及其他輸入輸出裝置組成。 一般而言,現代計算機系統是一個複雜的系統。 其一:如果每位應用程式設計師都必須掌握該系統所有的細節,那就不可能再編寫程式碼了(嚴重影響了程式設計師的開發效率:全部

Python3 與 C# 網路程式設計之~ 網路基礎篇

最新版本檢視:https://www.cnblogs.com/dotnetcrazy/p/9919202.html 入門篇 官方文件:https://docs.python.org/3/library/ipc.html(程序間通訊和網路) 例項程式碼:https://github.com/lotapp/

PYTHON03 - re模組 網路程式設計和socket模組

一、re模組 1.1 正則表示式 1.1.1 正則表示式 1.匹配單個字元 2.匹配一組字元 3.其他元字元 附:  [ ^ ]:出現在中括號開頭表示的是取反 4.貪婪匹配 1.  *、+和?都是貪婪匹配操作符,在其後加

第四模組網路程式設計進階&資料庫開發 口述

子程序死了之後 ,父程序關閉的時候要清理掉子程序的殭屍程序(收屍),孤兒程序是指父程序先死掉了的,交給init管理。 join() 等待子程序結束後才執行主程序下面的程式碼 即使可以利用的cpu只有一個(早期的計算機確實如此),也能保證支援(偽)併發的能力。將一個單獨的cpu變成多個虛擬的cpu(多道技術

java網路程式設計常用的類

java網路程式設計中常用的類 1、InetAddress 用於封裝計算機的IP地址和DNS(Domain Name System域名系統)(沒有埠資訊) InetAddress沒有構造器,要得到物件只能通過靜態方法實現 /** * 使用getLocalHost的方法建立InetA

Python3常用資料結構及方法介紹(三)——字串

三.字串 特點:不可更改 1.基本操作(同其他序列) ①索引 >>> 'python'[2] 't' ②分片 >>> 'beauty'[0:2] 'be' >>> 'beauty'[::2] 'bat' ③相加/相乘

Python3常用資料結構及方法介紹(二)——元組

二.元組 tuple 1特點: ①元組不可更改 ②圓括號 ③可重新賦值 >>> tuple0=(1,2,3) >>> tuple0=(2,3,4,1) >>> tuple0 (2, 3, 4, 1) 2常用元組操作(與列表類

Python3常用資料結構及方法介紹(一)——列表

一.列表 list 1特點: ①列表可更改 ②方括號 [1, 2, 3] 2常用列表操作: ①索引: >>> list1 = [1,2,3,4,5,6,7,8,9,10] >>> list1[4] 5 ②分片: >>>

計算機基礎與作業系統 計算機系統簡介 計算機基礎知識 計算機的發展史及多道技術 計算機網路知識簡單介紹 Windows系統,Mac系統與Linux系統的的安裝與簡介 伺服器硬體基礎 Linux發展史 Linux伺服器遠端登入 Linux常用的150個命令彙總 在終端下寫Python程式碼

第一章:計算機系統簡介 第二章:計算機基礎知識 第三章:計算機的發展史及多道技術 第四章:計算機網路知識簡單介紹 第五章:Windows系統,Mac系統與Linux系統的的安裝與簡介 第六章:伺服器硬體基礎 第七章:Linux發展史 第八章:Linux伺服器遠端登入 第九

Ansible常用模組介紹及使用(二)--技術流ken

  Ansible模組 在上一篇部落格《Ansible基礎認識及安裝使用詳解(一)--技術流ken》中以及簡單的介紹了一下ansible的模組。ansible是基於模組工作的,所以我們必須掌握幾個常用的模組以便能夠從容應對日常的工作。 相信大家在看完上一篇部落格之後應該也已經知道可以使用ans