python socket通訊(檔案、資料傳輸、異常處理)
阿新 • • 發佈:2020-12-13
如何使用socket模組實現客戶端與伺服器之間的資料傳輸。
直接上程式碼:
伺服器端
功能:計算客戶端傳輸過來的檔案個數、檔案總長度、字串總次數、字串總個數、資料總長度,並且總長度不大於max_len,否則伺服器將斷開聯絡
異常處理
import socket
server=socket.socket()
server.bind(("localhost",5555))
server.listen()
conn,address=server.accept()
file_number=0#檔案個數
file_len=0#檔案總字長
data_number= 0#字串個數
data_len=0#資料長度
recv_len=0#總字長
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:
#傳輸資料超過max_len則斷開資料傳輸
if recv_len>max_len:
print("客戶端傳輸資料超過{}位元組,伺服器斷開連線" .format(max_len))
print("本次一共傳輸{}位元組的資料那,其中字串為{}位元組,傳輸{}次,檔案為有{}位元組,傳輸{}次".format(recv_len, data_len, data_number, file_len, file_number))
#conn.send("你已經超出傳輸範圍{},伺服器斷開連線".format(max_len))
break
recv_data=conn.recv(1000)
#recv處理層!
#伺服器和客戶端達成協議,客戶端向伺服器端發來的指令:
# 傳送檔案為2,傳送資料為1,結束髮送為4,繼續傳送為3
#send處理層:
#回覆1為收到,2為未收到!
if recv_data.decode('utf-8')=='1':
print("準備客戶端傳送過來的字串!")
data_recv=conn.recv(1000)
print("收到從客戶端傳送過來的字串:",data_recv.decode('utf-8'))
data_number+=1#字串總個數
recv_len+=len(data_recv)#總字長
data_len+=len(data_recv)#字串總長
elif recv_data.decode('utf-8')=='2':
print("準備接受客戶端傳送過來的檔案")
data_recv=conn.recv(100000000)
file_deal(data_recv,file_number)
file_number+=1#檔案個數
recv_len += len(data_recv)#總字長
file_len+=len(data_recv)#檔案總字長
elif recv_data.decode('utf-8')=='3':
print("客戶端重新發送資料")
data_recv=conn.recv(10000)
continue
else:
print("客戶端已斷開聯絡!我也斷開聯絡吧")
data_recv=conn.recv(10000)
print("本次一共傳輸{}位元組的資料那,其中字串為{}位元組,傳輸{}次,檔案為有{}位元組,傳輸{}次".format(recv_len, data_len, data_number, file__len, file_number))
break
except:
print("客戶端突然中斷")
break
server.close()
客戶端
功能:向伺服器端傳送檔案和字串,並進行異常處理
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("請輸入您想傳送的資料型別!1為字串2為檔案4為結束髮送3為繼續傳送:").strip()
if data_send not in specialchar:
continue
client.send(data_send.encode('utf-8'))
if data_send=='1':
while True:
data_send=input("請輸入您想傳送的字串:").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("請您輸入你想傳送的檔名:").strip()
if isfile(data_filename):
client.send(readfile(data_filename))
break
else:
print("請重新輸入檔案!")
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("輸入錯誤!請重新輸入!")
continue
except:
print("伺服器端突然中斷!")
break
client.close()
``
實現功能:實時傳輸資料(包括字串、檔案),客戶端檔案的儲存等。
實現效果:
客戶端:
伺服器端:
異常處理:
伺服器端突然關閉:
客戶端突然關閉:
一個非常簡單的socket通訊就是實現了。實現功能:
客戶端:
向伺服器端傳送檔案和字串,並進行異常處理
伺服器端:
計算客戶端傳輸過來的檔案個數、檔案總長度、字串總次數、字串總個數、資料總長度,並且總長度不大於max_len,否則伺服器將斷開聯絡、異常處理
如果對我的文章感興趣,請為我點一個贊,如果有python的知識需要了解或探討,可以加本人微信:cuiliang1666457052