TCP文件传输脚本

TCP文件传输发送端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#coding=utf-8

import os
import socket
import struct
import time

def showinfo():
#清屏
i = os.system('cls||clear')
print('+----------------------------------------------------+')
print('| |')
print('| TCP文件传输脚本(客户端) |')
print('| |')
print('| 1.传输文件请输入绝对路径或相对路径 |')
print('| |')
print('| 2.退出请输入Q/q |')
print('| |')
print('| 3.使用前请打开服务端 |')
print('| --xysafe.tk |')
print('+----------------------------------------------------+')
#打印脚本信息
showinfo()
while True:
try:
#设置目标地址
ipAddr = input('目标地址:')
#退出命令
if ipAddr.lower() == 'q':
quit()
#创建TCP连接套接字
tcpclient = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#提示信息
print('正在尝试连接......')
#连接目标IP和端口
tcpclient.connect((ipAddr,7777))
#提示信息
print('连接成功!!!')
break
except ConnectionRefusedError:
print('连接失败!!!')
print('目标主机服务端未开启!!!')
except socket.gaierror:
print('连接失败!!!')
print('IP地址错误,请重新输入!')
#使用while循环不断监听是否有新指令
while True:
#接受上传文件路径
filepath = input('filepath=')
#输入Q退出程序
if filepath.lower()=='q':
break
try:
#获取文件大小
filesize = os.path.getsize(filepath)
#以二进制方式打开文件
file = open(filepath,'rb')
#读取文件数据
data = file.read()
#关闭文件调用
file.close()
except:
if filepath:
print('警告:请输入正确文件路径!')
else:
pass
continue
#将数据分片发送,每个数据包有效载荷为3900
for num in range(int(filesize/3900)+1):
txts = b''
#输出提示信息
showinfo()
print('一共要发: %d 个包'%(int(filesize/3900)+1))
#运行过程提示信息
print('剩余发包数: %d 个'%(int(filesize/3900)-num))
#格式化文件路径,用空格填充长度至124
if len(filepath)<124:
for n in range(123-len(filepath)):
txts = b' '+txts
#将格式化后的文件路径编码成二进制形式
for p in filepath :
txts += struct.pack('b',ord(p))
txts += b' '
#文件路径后面两字节为数据包大小,载荷为3900时大小设置为4096,其他情况为实际大小
if num != int(filesize/3900):
txts += struct.pack('b',40)
txts += struct.pack('b',96)
else:
txts += struct.pack('b',int((filesize%3900)/100))
txts += struct.pack('b',int((filesize%3900)%100))
#将数据放入缓冲区
txts += data[num*3900:(num+1)*3900]
#发送拼接好的数据
tcpclient.sendall(txts)
time.sleep(0.05)
#输出提示信息
print('文件成功上传!!!')

#TCP文件传输发送端

TCP文件传输接收端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#coding=utf-8

import os
import socket
import struct
import time

def showinfo():
#清屏
i = os.system('cls||clear')
print('+----------------------------------------------------+')
print('| |')
print('| TCP文件传输脚本(服务端) |')
print('| |')
print('| 服务端正在运行中...... |')
print('| --xysafe.tk |')
print('+----------------------------------------------------+')

#创建TCP套接字
tcpserver = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定本机IP和端口
tcpserver.bind(('',7777))
#设置最大连接数量
tcpserver.listen(5)
showinfo()
#监听连接
conn,addr = tcpserver.accept()
#显示连接主机IP
print(addr[0]+'已连接!!!')
#循环接受TCP数据报文
while True:
text = conn.recv(4096)
#当传输数据为空时退出程序
if text == b'':
break
#提取文件名
filepath = str(text[0:124])[2:-1]
filepath = filepath.strip()
filepath = filepath.replace('/','\\')
filepath = filepath.split('\\')[-1]
#设置文件保存路径
filepath = './(TCP_'+str(int(time.time()))+')'+filepath
#以二进制追加写方式打开文件
file = open(filepath,'ab')
data = b''
num = 1
while True:
#输出提示信息
showinfo()
print('正在接收文件: %s'%str(text[0:124])[2:-1].strip().replace('/','\\').split('\\')[-1])
#输出进程提示
print('已接收 %d 个数据包'%num)
num += 1
#从数据包中提取有效载荷大小
filesize = ord(bytes(text[124:125]).decode())*100+ord(bytes(text[125:126]).decode())
if filesize == 4096 and len(text)==4026:
#将有效载荷写入文件
data = text[126:]
file.write(data)
text = conn.recv(4096)
#这种情况是针对linux端接收数据包时会发生一个数据包分片的情况
elif filesize == 4096 and len(text)!=4026:
#将有效载荷写入文件
data = text[126:]
file.write(data)
text = conn.recv(4096)
data = text
file.write(data)
text = conn.recv(4096)
else:
break
#将有效载荷写入文件
data = text[126:]
file.write(data)
#关闭文件调用
file.close()
#输出提示信息
print('文件接收成功,保存路径为:\n'+os.getcwd()+'\\'+filepath[2:])

#TCP文件传输接收端