1. 程式人生 > 其它 >python socket通訊(檔案、資料傳輸、異常處理)

python socket通訊(檔案、資料傳輸、異常處理)

技術標籤:socketsocket

如何使用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