這篇文章給大家分享的是有關(guān)python怎么使用socket通信傳輸數(shù)據(jù)的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

1.服務(wù)器端
功能:計(jì)算客戶端傳輸過來的文件個(gè)數(shù)、文件總長(zhǎng)度、字符串總次數(shù)、字符串總個(gè)數(shù)、數(shù)據(jù)總長(zhǎng)度,并且總長(zhǎng)度不大于max_len,否則服務(wù)器將斷開聯(lián)系
異常處理
import socket
server=socket.socket()
server.bind(("localhost",5555))
server.listen()
conn,address=server.accept()
file_number=0#文件個(gè)數(shù)
file_len=0#文件總字長(zhǎng)
data_number=0#字符串個(gè)數(shù)
data_len=0#數(shù)據(jù)長(zhǎng)度
recv_len=0#總字長(zhǎng)
max_len=2000000
#文件處理方法
def file_deal(data,file_number):
with open(str(file_number)+'.jpg','wb')as f:
f.write(data)
print("文件保存成功!")
while True:
try:
#傳輸數(shù)據(jù)超過max_len則斷開數(shù)據(jù)傳輸
if recv_len>max_len:
print("客戶端傳輸數(shù)據(jù)超過{}字節(jié),服務(wù)器斷開連接".format(max_len))
print("本次一共傳輸{}字節(jié)的數(shù)據(jù)那,其中字符串為{}字節(jié),傳輸{}次,文件為有{}字節(jié),傳輸{}次".format(recv_len, data_len, data_number, file_len, file_number))
#conn.send("你已經(jīng)超出傳輸范圍{},服務(wù)器斷開連接".format(max_len))
break
recv_data=conn.recv(1000)
#recv處理層!
#服務(wù)器和客戶端達(dá)成協(xié)議,客戶端向服務(wù)器端發(fā)來的指令:
# 發(fā)送文件為2,發(fā)送數(shù)據(jù)為1,結(jié)束發(fā)送為4,繼續(xù)發(fā)送為3
#send處理層:
#回復(fù)1為收到,2為未收到!
if recv_data.decode('utf-8')=='1':
print("準(zhǔn)備客戶端發(fā)送過來的字符串!")
data_recv=conn.recv(1000)
print("收到從客戶端發(fā)送過來的字符串:",data_recv.decode('utf-8'))
data_number+=1#字符串總個(gè)數(shù)
recv_len+=len(data_recv)#總字長(zhǎng)
data_len+=len(data_recv)#字符串總長(zhǎng)
elif recv_data.decode('utf-8')=='2':
print("準(zhǔn)備接受客戶端發(fā)送過來的文件")
data_recv=conn.recv(100000000)
file_deal(data_recv,file_number)
file_number+=1#文件個(gè)數(shù)
recv_len += len(data_recv)#總字長(zhǎng)
file_len+=len(data_recv)#文件總字長(zhǎng)
elif recv_data.decode('utf-8')=='3':
print("客戶端重新發(fā)送數(shù)據(jù)")
data_recv=conn.recv(10000)
continue
else:
print("客戶端已斷開聯(lián)系!我也斷開聯(lián)系吧")
data_recv=conn.recv(10000)
print("本次一共傳輸{}字節(jié)的數(shù)據(jù)那,其中字符串為{}字節(jié),傳輸{}次,文件為有{}字節(jié),傳輸{}次".format(recv_len, data_len, data_number, file__len, file_number))
break
except:
print("客戶端突然中斷")
break
server.close()2.客戶端
功能:向服務(wù)器端發(fā)送文件和字符串,并進(jìn)行異常處理
import socket,os
def isfile(filename):
result=os.path.exists(filename)
return result
def readfile(filename):
with open(filename,'rb')as f:
data=f.read()
return data
specialchar=['1','2','3','4']
client=socket.socket()
client.connect(('localhost',5555))
while True:
try:
#if client.recv(1000):
#break
data_send=input("請(qǐng)輸入您想發(fā)送的數(shù)據(jù)類型!1為字符串2為文件4為結(jié)束發(fā)送3為繼續(xù)發(fā)送:").strip()
if data_send not in specialchar:
continue
client.send(data_send.encode('utf-8'))
if data_send=='1':
while True:
data_send=input("請(qǐng)輸入您想發(fā)送的字符串:").strip()
if data_send not in specialchar:
client.send(data_send.encode('utf-8'))
break
else:
continue
elif data_send=='2':
while True:
data_filename=input("請(qǐng)您輸入你想發(fā)送的文件名:").strip()
if isfile(data_filename):
client.send(readfile(data_filename))
break
else:
print("請(qǐng)重新輸入文件!")
continue
elif data_send=='3':
client.send('3'.encode('utf-8'))
continue
elif data_send=='4':
client.send('4'.encode('utf-8'))
break
else:
print("輸入錯(cuò)誤!請(qǐng)重新輸入!")
continue
except:
print("服務(wù)器端突然中斷!")
break
client.close()實(shí)現(xiàn)功能:實(shí)時(shí)傳輸數(shù)據(jù)(包括字符串、文件),客戶端文件的保存等。
3.socket通信優(yōu)點(diǎn)
客戶端:
向服務(wù)器端發(fā)送文件和字符串,并進(jìn)行異常處理
服務(wù)器端:
計(jì)算客戶端傳輸過來的文件個(gè)數(shù)、文件總長(zhǎng)度、字符串總次數(shù)、字符串總個(gè)數(shù)、數(shù)據(jù)總長(zhǎng)度,并且總長(zhǎng)度不大于max_len,否則服務(wù)器將斷開聯(lián)系、異常處理。
感謝各位的閱讀!關(guān)于“python怎么使用socket通信傳輸數(shù)據(jù)”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
當(dāng)前題目:python怎么使用socket通信傳輸數(shù)據(jù)-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://chinadenli.net/article38/dphipp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、微信小程序、企業(yè)網(wǎng)站制作、關(guān)鍵詞優(yōu)化、網(wǎng)頁設(shè)計(jì)公司、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容