服務端:
輸入檔案完整路徑傳送給客戶端
import struct
import json
import os
tcp_server = socket()
ip_port = (('127.0.0.1', 8080))
buffsize = 1024
# 埠的重複利用
tcp_server.bind(ip_port)
tcp_server.listen(5)
print('還沒有人鏈結')
while true:
'''鏈結迴圈'''
conn, addr = tcp_server.accept()
print('鏈結人的資訊:', addr)
while true:
if not conn:
print('客戶端鏈結中斷')
break
'''通訊迴圈'''
filemesg = input('請輸入要傳送的檔名加字尾》').strip()
filesize_bytes = os.path.getsize(filemesg) # 得到檔案的大小,位元組
dirc =
head_info = json.dumps(dirc) # 將字典轉換成字串
head_info_len = struct.pack('i', len(head_info)) # 將字串的長度打包
# 先將報頭轉換成字串(json.dumps), 再將字串的長度打包
# 傳送報頭長度,傳送報頭內容,最後放真是內容
# 報頭內容包括檔名,檔案資訊,報頭
# 接收時:先接收4個位元組的報頭長度,
# 將報頭長度解壓,得到頭部資訊的大小,在接收頭部資訊, 反序列化(json.loads)
# 最後接收真實檔案
conn.send(head_info_len) # 傳送head_info的長度
conn.send(head_info.encode('utf-8'))
# 傳送真是資訊
with open(filemesg, 'rb') as f:
data = f.read()
conn.sendall(data)
print('傳送成功')
客戶端:
接收檔案 :
import struct
import json
import os
import sys
import time
tcp_client = socket()
ip_port = (('127.0.0.1', 8080))
buffsize = 1024
tcp_client.connect_ex(ip_port)
print('等待鏈結服務端')
while true:
head_struct = tcp_client.recv(4) # 接收報頭的長度,
print(head_struct)
if head_struct:
print('已連線服務端,等待接收資料')
head_len = struct.unpack('i', head_struct)[0] # 解析出報頭的字串大小
data = tcp_client.recv(head_len) # 接收長度為head_len的報頭內容的資訊 (包含檔案大小,檔名的內容)
print(f"")
head_dir = json.loads(data.decode('utf-8'))
filesize_b = head_dir['filesize_bytes'] # 檔案位元組數
filename = head_dir['filename'] # 檔案路徑 "newc:\\\\users\\\\administrator\\\\desktop\\\\txt\\\\2.txt"
(filepath, tempfilename) = os.path.split(filename)
# filename2 檔名 extension 檔案字尾
(filename2,extension) = os.path.splitext(tempfilename)
# 接受真的檔案內容
recv_len = 0
recv_mesg = b''
f = open(f"./new", 'w')
ff = open(f"./new", 'wb')
if extension == ".txt":
while recv_len < filesize_b:
percent = recv_len / filesize_b
if filesize_b - recv_len > buffsize: # 檔案位元組數 - 接收長度 > 緩衝位元組
recv_mesg = tcp_client.recv(buffsize)
f.write(recv_mesg)
recv_len += len(recv_mesg)
else:
recv_mesg = tcp_client.recv(filesize_b - recv_len)
recv_len += len(recv_mesg)
f.write(recv_mesg.decode("gbk"))
else:
while recv_len < filesize_b:
percent = recv_len / filesize_b
if filesize_b - recv_len > buffsize: # 檔案位元組數 - 接收長度 > 緩衝位元組
recv_mesg = tcp_client.recv(buffsize)
ff.write(recv_mesg)
recv_len += len(recv_mesg)
else:
recv_mesg = tcp_client.recv(filesize_b - recv_len)
recv_len += len(recv_mesg)
ff.write(recv_mesg)
print(recv_len, filesize_b)
print(f"接收檔案成功,大小為:,")
f.close()
socket檔案傳輸
伺服器 本檔案是伺服器的 include for sockaddr in include for socket include for socket include for printf include for exit include for bzero include for time t an...
socket檔案傳輸
最近入職培訓中需要寫乙個linux下的c s網路檔案傳輸工具,在實現的過程中,遇到了一些坑,在這裡 做個總結 由於udp伺服器不需要accept 因此也沒有link id 連線的客戶端id 在伺服器檔案接收或下發檔案時需要知道當下與之通訊的客戶端的識別符號,由於udp是無連線的,並且sockfd s...
socket通訊檔案傳輸
主機傳送方 fileinfo ezonefile new fileinfo 檔案路徑 開啟檔案流 filestream ezonestream ezonefile.openread 包的大小 int packetsize 1024 包的數量 int packetcount int ezonestre...