Python socket編程實例詳解
本文實例形式較為詳細的講述了Python socket編程。分享給大家供大家參考。具體如下:
上面的代碼創(chuàng)建了一個socket對象。type參數(shù)代表套接字類型,可為SOCK_STREAM(流套接字)和SOCK_DGRAM(數(shù)據(jù)報套接字)。AF_INET表示創(chuàng)建的是ip v4的類型。
上面三個參數(shù)的含義是:
address_family指明要建立哪一類socket。最常用的當然是ip協(xié)議,AF_INET。在unix系統(tǒng)中,AF_UNIX也是比較常用的,用于建立unix系統(tǒng)中的進程間通信。
type用于指定通信類型。通常是建立面向連接的流通信。SOCKET_DGRAM是報文通信。如果address_family設置的是AF_INET,那么對應的是TCP和UDP。
protocol用于指定協(xié)議類型。這個參數(shù)是可選的。在建立tcp或者是udp連接的時候他們通常都是0。如果第一個參數(shù)是AF_INET,那么這個參數(shù)表示是ip包中的protocol字段。
【UDP本來就不區(qū)分server和client。所有節(jié)點都是對等的】
第二步是將socket綁定到指定的地址:
第三步是使用listen方法監(jiān)聽請求:【listen方法中的參數(shù)指明可接受的最大連接數(shù)】
第四步是不斷接收請求:收到連接請求后,這些請求需要排隊,如果隊列滿,就拒絕請求。
accept方法返回一個含有兩個元素的 元組(connection,address)。第一個元素connection是新的socket對象,服務器必須通過它與客戶通信;第二個元素 address是客戶的Internet地址。
第五步是處理階段,服務器和客戶端通過send和recv方法通信(傳輸數(shù)據(jù))。
如果send成功了,那么對方的緩沖區(qū)已經(jīng)有你發(fā)送的數(shù)據(jù)了。
#調(diào)用recv 時,服務器必須指定一個整數(shù),它對應于可通過本次方法調(diào)用來接收的最大數(shù)據(jù)量。recv方法在接收數(shù)據(jù)時會進入“blocked”狀態(tài),最后返回一個字符 串,用它表示收到的數(shù)據(jù)。如果發(fā)送的數(shù)據(jù)量超過了recv所允許的,數(shù)據(jù)會被截短。多余的數(shù)據(jù)將緩沖于接收端。以后調(diào)用recv時,多余的數(shù)據(jù)會從緩沖區(qū) 刪除(以及自上次調(diào)用recv以來,客戶可能發(fā)送的其它任何數(shù)據(jù))。
connection.settimeout(5) buf = connection.recv(1024)
具體處理如下:
if buf == '1': connection.send('welcome to python server!') else: connection.send('please go out!')
使用send發(fā)送數(shù)據(jù)給客戶端??蛻舳耸褂胷ecv來接收數(shù)據(jù)。
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端:
#!/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端如下:
#!/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使用完畢之后要關閉?!旧厦娴拇a,server端忘記關閉socket了】
當然,在socket連接的過程中,最好使用try except來做一下錯誤處理。
注意,accept函數(shù)和recv函數(shù)都是阻塞式的。也就是說,他們一直在等待,直到有客戶端連接過來或者是后者的有數(shù)據(jù)可以接收。
下面是一個FTP的小例子。
使用了多線程來處理每一個請求。
示例代碼點擊此處本站下載。
如果傳輸路徑不存在則建立。
希望本文所述對大家的Python程序設計有所幫助。
相關文章
python正則表達式中匹配次數(shù)與貪心問題詳解(+??*)
正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配,下面這篇文章主要給大家介紹了關于python正則表達式中匹配次數(shù)與貪心問題(+??*)的相關資料,需要的朋友可以參考下2022-10-10網(wǎng)站滲透常用Python小腳本查詢同ip網(wǎng)站
這篇文章主要介紹了網(wǎng)站滲透常用Python小腳本查詢同ip網(wǎng)站,需要的朋友可以參考下2017-05-05python自動化測試selenium執(zhí)行js腳本實現(xiàn)示例
這篇文章主要為大家介紹了python自動化測試selenium執(zhí)行js腳本的實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2021-11-11Python實現(xiàn)一個簡單的畢業(yè)生信息管理系統(tǒng)的示例代碼
這篇文章主要介紹了Python實現(xiàn)一個簡單的畢業(yè)生信息管理系統(tǒng)的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-06-06