client端:
点击(此处)折叠或打开
- #!/usr/bin/env python
- #!/usr/bin/env python
- #-*- coding: utf-8 -*-
- import socket,os
- import tab,re
- HOST='172.15.111.80'
- PORT=9999
- s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- Match=re.compile('get|upload')
- try:
- s.connect((HOST,PORT))
- print ''' \033[32;1m 请选择你要操作的命令:
- list: 显示下载列表
- get xxx: 下载某文件
- upload xxx: 上传某文件
- \033[0m'''
- while True:
- cmd=raw_input('>>>: ').strip()
- s.sendall(cmd)
- Input = cmd.split()
- if len(Input) == 1 and Input[0] == 'list': ###目录文件展示
- s.sendall('ls -al')
- print '\033[32;1m ftp文件服务器列表:\033[0m'
- List = s.recv(4096)
- print List
- elif len(Input) == 2 and Match.match(cmd): ###下载或者上传功能实现,目前只做了下载,上传功能类似
- file_total = s.recv(1024)
- receive_size = 0
- if 'No exist' in file_total: ###通过对服务端发送的类型进行判断,如果发送的是no exist就打印错误,否则的话接收到的应该是文件字符串大小
- print file_total
- continue
- else:
- while receive_size < int(file_total): ###一行行接收
- f = open(Input[1],'wb')
- data = s.recv(1024)
- receive_size += len(data)
- f.write(data)
- f.close()
- if receive_size == int(file_total):
- print '传输完毕!'
- else:
- print '\033[31;1m 请给出两个正确的参数,例如:get abc.txt 或者upload abc.txt\033[0m'
- continue
- finally:
- s.close()
点击(此处)折叠或打开
- #!/usr/bin/env python
- import socket,os,tab
- import commands
- HOST='172.15.111.80'
- PORT=9999
- s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- s.bind((HOST,PORT))
- s.listen(5)
- while True:
- conn,addr=s.accept()
- print 'Connect address: ' , addr
- list = os.listdir(os.getcwd())
- while True:
- data = conn.recv(1024).strip()
- cwd = data.split()
- if cwd[0] == 'list': ###对传递的第一个参数进行判断,如果为list,就传回目录下的文件列表
- Command = conn.recv(1024).strip()
- data = commands.getstatusoutput(Command)
- conn.sendall(data[1])
- elif cwd[0] == 'get': ###如果第一个参数是get,再继续判断第二个参数,如果存在,就返回字符串大小,并且一行行传回字符串,client端一行行接收;
- if cwd[1] in list:
- f = open(cwd[1],'rb')
- file_size = str(os.stat(cwd[1]).st_size)
- conn.sendall(file_size)
- for line in f:
- conn.sendall(line),
- else: ###如果第二个参数不在list中,那就返回不存在
- conn.sendall('No exist this file')
- elif len(data) == 0: ###如果输入为空,重新接收,不然就卡在那不动了
- continue
- conn.close()
还有一个上传的功能没做,跟下载差不多,有一些优化也没做,例如:
1、多线程传输没做,功能点SocketServer,(data = SocketServer.ThreadingTCPServer((ip,port),类); data.serve_forever()强化记忆一下)
2、其实这个可以用函数包起来,也可以调整一下
3、我看有人用md5校验,这个功能也不错,遇到网络丢包问题,可以使用