直接上代码吧
client端:

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. #!/usr/bin/env python
  3. #-*- coding: utf-8 -*-
  4. import socket,os
  5. import tab,re

  6. HOST='172.15.111.80'
  7. PORT=9999
  8. s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  9. Match=re.compile('get|upload')
  10. try:
  11.     s.connect((HOST,PORT))
  12.     print ''' \033[32;1m 请选择你要操作的命令:
  13.         list: 显示下载列表
  14.         get xxx: 下载某文件
  15.         upload xxx: 上传某文件
  16.         \033[0m'''

  17.     while True:

  18.         cmd=raw_input('>>>: ').strip()
  19.         s.sendall(cmd)
  20.         Input = cmd.split()
  21.         if len(Input) == 1 and Input[0] == 'list':            ###目录文件展示
  22.             s.sendall('ls -al')
  23.             print '\033[32;1m ftp文件服务器列表:\033[0m'
  24.             List = s.recv(4096)
  25.             print List

  26.         elif len(Input) == 2 and Match.match(cmd):            ###下载或者上传功能实现,目前只做了下载,上传功能类似
  27.             file_total = s.recv(1024)
  28.             receive_size = 0
  29.             if 'No exist' in file_total:                      ###通过对服务端发送的类型进行判断,如果发送的是no exist就打印错误,否则的话接收到的应该是文件字符串大小
  30.                 print file_total
  31.                 continue
  32.             else:
  33.                 while receive_size < int(file_total):         ###一行行接收
  34.                     f = open(Input[1],'wb')
  35.                     data = s.recv(1024)
  36.                     receive_size += len(data)
  37.                     f.write(data)
  38.                     f.close()
  39.                 if receive_size == int(file_total):
  40.                     print '传输完毕!'

  41.         else:
  42.             print '\033[31;1m 请给出两个正确的参数,例如:get abc.txt 或者upload abc.txt\033[0m'
  43.             continue
  44. finally:
  45.     s.close()
server端:

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. import socket,os,tab
  3. import commands

  4. HOST='172.15.111.80'
  5. PORT=9999
  6. s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  7. s.bind((HOST,PORT))
  8. s.listen(5)
  9. while True:
  10.     conn,addr=s.accept()
  11.     print 'Connect address: ' , addr
  12.     list = os.listdir(os.getcwd())
  13.     while True:
  14.         data = conn.recv(1024).strip()
  15.         cwd = data.split()
  16.         if cwd[0] == 'list':                                ###对传递的第一个参数进行判断,如果为list,就传回目录下的文件列表
  17.             Command = conn.recv(1024).strip()
  18.             data = commands.getstatusoutput(Command)
  19.             conn.sendall(data[1])
  20.         elif cwd[0] == 'get':                                ###如果第一个参数是get,再继续判断第二个参数,如果存在,就返回字符串大小,并且一行行传回字符串,client端一行行接收;
  21.             if cwd[1] in list:
  22.                 f = open(cwd[1],'rb')
  23.                 file_size = str(os.stat(cwd[1]).st_size)
  24.                 conn.sendall(file_size)
  25.                 for line in f:
  26.                     conn.sendall(line),
  27.             else:                                            ###如果第二个参数不在list中,那就返回不存在
  28.                 conn.sendall('No exist this file')

  29.         elif len(data) == 0:                                  ###如果输入为空,重新接收,不然就卡在那不动了
  30.             continue
  31. conn.close()


还有一个上传的功能没做,跟下载差不多,有一些优化也没做,例如:
1、多线程传输没做,功能点SocketServer,(data = SocketServer.ThreadingTCPServer((ip,port),类);   data.serve_forever()强化记忆一下)
2、其实这个可以用函数包起来,也可以调整一下
3、我看有人用md5校验,这个功能也不错,遇到网络丢包问题,可以使用
10-02 07:33