程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> Python socket編程實例詳解

Python socket編程實例詳解

編輯:更多關於編程

       本文實例形式較為詳細的講述了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程序設計有所幫助。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved