Python socket編程實(shí)例詳解
本文實(shí)例形式較為詳細(xì)的講述了Python socket編程。分享給大家供大家參考。具體如下:
上面的代碼創(chuàng)建了一個(gè)socket對(duì)象。type參數(shù)代表套接字類(lèi)型,可為SOCK_STREAM(流套接字)和SOCK_DGRAM(數(shù)據(jù)報(bào)套接字)。AF_INET表示創(chuàng)建的是ip v4的類(lèi)型。
上面三個(gè)參數(shù)的含義是:
address_family指明要建立哪一類(lèi)socket。最常用的當(dāng)然是ip協(xié)議,AF_INET。在unix系統(tǒng)中,AF_UNIX也是比較常用的,用于建立unix系統(tǒng)中的進(jìn)程間通信。
type用于指定通信類(lèi)型。通常是建立面向連接的流通信。SOCKET_DGRAM是報(bào)文通信。如果address_family設(shè)置的是AF_INET,那么對(duì)應(yīng)的是TCP和UDP。
protocol用于指定協(xié)議類(lèi)型。這個(gè)參數(shù)是可選的。在建立tcp或者是udp連接的時(shí)候他們通常都是0。如果第一個(gè)參數(shù)是AF_INET,那么這個(gè)參數(shù)表示是ip包中的protocol字段。
【UDP本來(lái)就不區(qū)分server和client。所有節(jié)點(diǎn)都是對(duì)等的】
第二步是將socket綁定到指定的地址:
第三步是使用listen方法監(jiān)聽(tīng)請(qǐng)求:【listen方法中的參數(shù)指明可接受的最大連接數(shù)】
第四步是不斷接收請(qǐng)求:收到連接請(qǐng)求后,這些請(qǐng)求需要排隊(duì),如果隊(duì)列滿(mǎn),就拒絕請(qǐng)求。
accept方法返回一個(gè)含有兩個(gè)元素的 元組(connection,address)。第一個(gè)元素connection是新的socket對(duì)象,服務(wù)器必須通過(guò)它與客戶(hù)通信;第二個(gè)元素 address是客戶(hù)的Internet地址。
第五步是處理階段,服務(wù)器和客戶(hù)端通過(guò)send和recv方法通信(傳輸數(shù)據(jù))。
如果send成功了,那么對(duì)方的緩沖區(qū)已經(jīng)有你發(fā)送的數(shù)據(jù)了。
#調(diào)用recv 時(shí),服務(wù)器必須指定一個(gè)整數(shù),它對(duì)應(yīng)于可通過(guò)本次方法調(diào)用來(lái)接收的最大數(shù)據(jù)量。recv方法在接收數(shù)據(jù)時(shí)會(huì)進(jìn)入“blocked”狀態(tài),最后返回一個(gè)字符 串,用它表示收到的數(shù)據(jù)。如果發(fā)送的數(shù)據(jù)量超過(guò)了recv所允許的,數(shù)據(jù)會(huì)被截短。多余的數(shù)據(jù)將緩沖于接收端。以后調(diào)用recv時(shí),多余的數(shù)據(jù)會(huì)從緩沖區(qū) 刪除(以及自上次調(diào)用recv以來(lái),客戶(hù)可能發(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ù)給客戶(hù)端??蛻?hù)端使用recv來(lái)接收數(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()
這就是整個(gè)通信過(guò)程了。
全部代碼如下:
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使用完畢之后要關(guān)閉。【上面的代碼,server端忘記關(guān)閉socket了】
當(dāng)然,在socket連接的過(guò)程中,最好使用try except來(lái)做一下錯(cuò)誤處理。
注意,accept函數(shù)和recv函數(shù)都是阻塞式的。也就是說(shuō),他們一直在等待,直到有客戶(hù)端連接過(guò)來(lái)或者是后者的有數(shù)據(jù)可以接收。
下面是一個(gè)FTP的小例子。
使用了多線(xiàn)程來(lái)處理每一個(gè)請(qǐng)求。
示例代碼點(diǎn)擊此處本站下載。
如果傳輸路徑不存在則建立。
希望本文所述對(duì)大家的Python程序設(shè)計(jì)有所幫助。
- Python 網(wǎng)絡(luò)編程起步(Socket發(fā)送消息)
- 最基礎(chǔ)的Python的socket編程入門(mén)教程
- python多線(xiàn)程socket編程之多客戶(hù)端接入
- Python Socket編程入門(mén)教程
- 詳解Python Socket網(wǎng)絡(luò)編程
- python之Socket網(wǎng)絡(luò)編程詳解
- python網(wǎng)絡(luò)編程學(xué)習(xí)筆記(五):socket的一些補(bǔ)充
- Python Socket編程詳細(xì)介紹
- 關(guān)于Python Socket編程的要點(diǎn)詳解
相關(guān)文章
gearman的安裝啟動(dòng)及python API使用實(shí)例
這篇文章主要介紹了gearman的安裝啟動(dòng)及python API使用,需要的朋友可以參考下2014-07-07
tensorflow求導(dǎo)和梯度計(jì)算實(shí)例
今天小編就為大家分享一篇tensorflow求導(dǎo)和梯度計(jì)算實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
Python實(shí)現(xiàn)為圖片批量添加隨機(jī)水印
這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)為圖片批量添加隨機(jī)水印,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11
python支持多線(xiàn)程的爬蟲(chóng)實(shí)例
今天小編就為大家分享一篇python支持多線(xiàn)程的爬蟲(chóng)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
Python中flatten( ),matrix.A用法說(shuō)明
這篇文章主要介紹了Python中flatten( ),matrix.A用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07
200行python代碼實(shí)現(xiàn)2048游戲
這篇文章主要為大家詳細(xì)介紹了200行Python代碼實(shí)現(xiàn)2048游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
python實(shí)現(xiàn)爬取圖書(shū)封面
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)爬取圖書(shū)封面的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
基于Python編寫(xiě)一個(gè)IP地址存活檢查器
這篇文章主要為大家詳細(xì)介紹了如何基于Python編寫(xiě)一個(gè)IP地址存活檢查器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2024-11-11

