如何使用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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/234254.html
標籤:python
