一、环境说明
- Centos7.6 上测试使用
系统环境 | Python版本 | 目标 |
---|---|---|
CentOS 7.6 | python 2.7.5 | 实现文件传输 |
思路:
- 分为server端和client端,client端发送,server端接收
- client端发送文件名,文件数据;server端接收文件名和文件数据
不足:
- 未实现加密传输
- 没有加入校验机制,需要文件传输完成后手动校验文件是否一致
二、代码
socket_client.py
#!/usr/bin/python
# _*_ coding: UTF-8 _*_
import socket
import time, os, base64, os.path
import argparse
def SendFile(s, filename):
print('Sending %s' % filename)
s.sendall('filename:%s::::' % filename)
f = open(dirname + filename, 'rb')
while True:
chunk = f.read(chunksize)
if not chunk:
f.close()
print('%s Successfully Sent %s\n' %(time.ctime(), filename))
break
s.sendall(chunk)
time.sleep(1)
s.sendall('EOF')
s.close()
def main(dirname, IP, Port, MB = 16):
print('main function is start!')
for filename in os.listdir(dirname):
if os.path.isfile(dirname + filename):
print filename
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((IP, Port))
SendFile(s, filename)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Manual to the script')
parser.add_argument('-d',type=str,default='/opt/test/',help='input directory')
parser.add_argument('--host',type=str,required=True,help='input connecting host\'s ip')
parser.add_argument('-p',type=int,required=True,help='input host port')
args = parser.parse_args()
dirname = args.d
IP = args.host
Port = args.p
MB = 16
chunksize = int(MB*1024*1024)
main(dirname, IP, Port, MB)
socket_server.py
#!/usr/bin/python
# _*_ coding: UTF-8 _*_
import socket, time, os, base64, re
import argparse
def main(IP, Port, log):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((IP, Port))
s.listen(12)
print 'Listened on ', IP, Port
reg = re.compile('filename:(.*?)::::')
while True:
conn, addr = s.accept()
print(time.ctime(), 'Connected from ', addr)
recvd = conn.recv(1024)
if recvd:
ss = reg.findall(recvd)
filename = ss[0]
f = open(filename, 'wb')
while True:
data = conn.recv(1024)
if not data:
break
if data == 'EOF':
f.close()
log.write('%s Received %s\n'%(time.ctime(), filename))
log.flush()
else:
f.write(data)
f.flush()
conn.close()
s.close()
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Manual to the script')
parser.add_argument('--host',type=str,default='localhost',help='input listening host')
parser.add_argument('-p',type=int,required=True,help='input listening host\'s port')
args = parser.parse_args()
IP = args.host
Port =args.p
log = open('log.txt','w+')
main(IP, Port, log)
三、测试
两台机器:192.168.0.21 和 192.168.0.27
21作client端,27作server端
27上监听:
python socket_server.py --host '192.168.0.27' -p 12345
21上连接:
python socket_client.py -d '/root/test/' --host '192.168.0.27' -p 12345