直接上代码吧
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()
server端:
-
#!/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校验,这个功能也不错,遇到网络丢包问题,可以使用
阅读(1446) | 评论(0) | 转发(0) |