Python socket編程執行個體詳解

來源:互聯網
上載者:User

   本文執行個體形式較為詳細的講述了Python socket編程。分享給大家供大家參考。具體如下:

  複製代碼 代碼如下:

  sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

  上面的代碼建立了一個socket對象。type參數代表通訊端類型,可為SOCK_STREAM(流通訊端)和SOCK_DGRAM(資料通訊端)。AF_INET表示建立的是ip v4的類型。

  複製代碼 代碼如下:

  socket(address_family,type,protocol_type):

  上面三個參數的含義是:

  address_family指明要建立哪一類socket。最常用的當然是ip協議,AF_INET。在unix系統中,AF_UNIX也是比較常用的,用於建立unix系統中的處理序間通訊。

  type用於指定通訊類型。通常是建立連線導向的流通訊。SOCKET_DGRAM是報文通訊。如果address_family設定的是AF_INET,那麼對應的是TCP和UDP。

  protocol用於指定協議類型。這個參數是可選的。在建立tcp或者是udp串連的時候他們通常都是0。如果第一個參數是AF_INET,那麼這個參數表示是ip包中的protocol欄位。

  【UDP本來就不區分server和client。所有節點都是對等的】

  第二步是將socket綁定到指定的地址:

  複製代碼 代碼如下:

  sock.bind(('localhost',7556))

  第三步是使用listen方法監聽請求:【listen方法中的參數指明可接受的最大串連數】

  複製代碼 代碼如下:

  sock.listen(5)

  第四步是不斷接收請求:收到串連請求後,這些請求需要排隊,如果隊列滿,就拒絕請求。

  複製代碼 代碼如下:

  connection,address = sock.accept()

  accept方法返回一個含有兩個元素的 元組(connection,address)。第一個元素connection是新的socket對象,伺服器必須通過它與客戶通訊;第二個元素 address是客戶的Internet地址。

  第五步是處理階段,伺服器和用戶端通過send和recv方法通訊(傳輸資料)。

  如果send成功了,那麼對方的緩衝區已經有你發送的資料了。

  #調用recv 時,伺服器必須指定一個整數,它對應於可通過本次方法調用來接收的最大資料量。recv方法在接收資料時會進入“blocked”狀態,最後返回一個字元 串,用它表示收到的資料。如果發送的資料量超過了recv所允許的,資料會被截短。多餘的資料將緩衝於接收端。以後調用recv時,多餘的資料會從緩衝區 刪除(以及自上次調用recv以來,客戶可能發送的其它任何資料)。

  ?

1 2 connection.settimeout(5) buf = connection.recv(1024)

  具體處理如下:

  ?

1 2 3 4 if buf == '1': connection.send('welcome to python server!') else: connection.send('please go out!')

  使用send發送資料給用戶端。用戶端使用recv來接收資料。

  ?

1 2 3 4 5 6 7 8 import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(('localhost',7556)) import time time.sleep(2) sock.send('1') print sock.recv(1024) sock.close()

  這就是整個通訊過程了。

  全部代碼如下:

  server端:

  ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #!/usr/bin/env python import socket sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) sock.bind(('localhost',7556)) sock.listen(5) while True: connection,address = sock.accept() print "client ip is " print address try: connection.settimeout(5) buf = connection.recv(1024) if buf == '1': connection.send('welcome to python server!') else: connection.send('please go out!') except socket.timeout: print 'time out' connection.close()

  client端如下:

  ?

1 2 3 4 5 6 7 8 9 #!/usr/bin/env python import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(('localhost',7556)) import time time.sleep(2) sock.send('1') print sock.recv(1024) sock.close()

  記住,socket使用完畢之後要關閉。【上面的代碼,server端忘記關閉socket了】

  當然,在socket串連的過程中,最好使用try except來做一下錯誤處理。

  注意,accept函數和recv函數都是阻塞式的。也就是說,他們一直在等待,直到有用戶端串連過來或者是後者的有資料可以接收。

  下面是一個FTP的小例子。

  使用了多線程來處理每一個請求。

  範例程式碼點擊此處本站下載。

  如果傳輸路徑不存在則建立。

  希望本文所述對大家的Python程式設計有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.