刚开始学习socket编程,还不是特熟练,码了好长时间,中间遇到许多问题,记录一下用socketserver写ftp

server端:

  1. #!/usr/bin/env python
  2.  
  3. import socketserver,os
  4.  
  5. class FTP(socketserver.BaseRequestHandler):
  6. def handle(self):
  7. def clientsend(filename):
  8. f = open('/ftp/%s' %filename,'w')
  9. # while 1:
  10. data = self.request.recv(4096).decode("utf-8")
  11. # if not data:break
  12. f.write(data)
  13. f.close()
  14. print('File %s receive done!' % filename)
  15. def clientdownload(filename):
  16. f = open('/ftp/%s' %filename,'r')
  17. data = f.read()
  18. f.close()
  19. self.request.sendall(data.encode("utf-8"))
  20. print('listening connect from:',self.client_address)
  21. listmsg = 'list:\n1.help\t\t\tdispaly the list\n2.send file\t\tsend + filename\n3.download file\t\tdownload + filename\n4.ls\t\t\tShow files and permissions\n5.exit\n'
  22. self.request.sendall("Welcome my ftp,input \033[34;1m'help'\033[0m dispaly meun".encode("utf-8"))
  23. while 1:
  24. try:
  25. re_msg = self.request.recv(1024).decode("utf-8")
  26. if not re_msg:break
  27. if re_msg == 'help' or re_msg == '?':
  28. self.request.sendall(listmsg.encode("utf-8"))
  29. elif re_msg.split()[0] == 'send':
  30. filename = re_msg.split()[1]
  31. clientsend(filename)
  32. elif re_msg.split()[0] == 'ls':
  33. ls_list = os.popen('ls -l /ftp').read().encode("utf-8")
  34. self.request.sendall(ls_list)
  35. elif re_msg.split()[0] == 'download':
  36. filename = re_msg.split()[1]
  37. clientdownload(filename)
  38. else:
  39. self.request.sendall('Invalid value'.encode("utf-8"))
  40. finally:
  41. pass
  42. if __name__ == '__main__': #只有程序执行时才会触发下面的语句,程序被导入调用时,下面的语句不会触发
  43. host = '192.168.101.128'
  44. port = 2222
  45. server = socketserver.ThreadingTCPServer((host,port),FTP)
  46. server.serve_forever()

client端:

  1. #!/usr/bin/env python
  2. import socket,sys
  3.  
  4. host = '192.168.101.128'
  5. port = 2222
  6.  
  7. s = socket.socket()
  8. s.connect((host,port))
  9. info = s.recv(8096).decode("utf-8")
  10. print(info)
  11. while 1:
  12. INPUT = str(input('input:'))
  13. if INPUT.split()[0] == 'send':
  14. s.send(INPUT.encode("utf-8"))
  15. filename = INPUT.split()[1]
  16. f = open(filename,'r')
  17. file_data = f.read()
  18. f.close()
  19. s.sendall(file_data.encode("utf-8"))
  20. print('file sent finished!')
  21. elif INPUT.split()[0] == 'download':
  22. s.send(INPUT.encode("utf-8"))
  23. filename = INPUT.split()[1]
  24. f = open(filename,'w')
  25. data = s.recv(8096).decode("utf-8")
  26. f.write(data)
  27. f.close()
  28. print('%s has been download!' %filename)
  29. elif INPUT.split()[0] == 'exit':
  30. sys.exit()
  31. else:
  32. s.send(INPUT.encode("utf-8"))
  33. data = s.recv(8096).decode("utf-8")
  34. print(data)
  35. s.close()

socket 仅支持单线程,socketserver 支持多线程

socketserver(支持多线程!):

定义请求处理类时,需要继承socketserver.BaseRequestHandler,并且需要创建新的handle()函数来处理请求

python中的socketserver模块已经为我们初始化好了,直接调用即可

self.request.recv(bufsize).decode("utf-8")  读取请求数据

self.request.sendall().encode("utf-8")    发送数据

self.client_address            客户端请求的地址

server = socketserver.ThreadingTCPServer((Host,Port),FTP)  多线程!!!

server = socketserver.TCPServer((Host,Port),FTP)        单线程

server.serve_forever()           持续监听,服务端一直运行,知道收到shutdown信号

socket(仅支持单线程):

socket.AF_UNIX      只能用于单一的Unix系统进程通信

socket.AF_INET      服务器之间网络通信

socket.AF_INET6       IPv6

socket.SOCK_STREAM    流式socket,for TCP

socket.SOCK_DGRAM   数据报式socket,for UDP

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.bind((Host,Port))

s.listen()

s.connect((Host,Port))

conn,address = s.accept()  conn是新的套接字对象,可以用来接受和发送数据,address是客户端的地址

s.close()

s.recv(bufsize)       接受套接字的数据,数据以字符串的形式返回,bufsize是接收的最大数据量

s.sendall(string)       尝试发送所有数据,成功返回None,失败则抛出异常

s.getpeername()      返回连接套接字的远程地址,返回值通常为元组

s.gettimeout()        返回当前超时值,单位为秒,如果没有设置超时,则为None

Python:socket实现ftp程序的更多相关文章

  1. 用python开发简单ftp程序

    根据alex老师视频开发的简单ftp程序,只能实现简单的get功能 ftp客户端程序: #!/usr/bin/env python #_*_ coding:utf-8 _*_ import socke ...

  2. 使用socket实现FTP程序

    #-*- coding:utf-8 -*- import socketserver from module import * class server: def __init__(self,reque ...

  3. Python socket聊天室程序

    http://blog.csdn.net/calling_wisdom/article/details/42524745 今天用python的socket模块实现了一个聊天室的程序 虽然功能比较简单, ...

  4. python简单的ftp程序

    服务器端 '''1.读取文件名2.检测文件是否存在3.打开文件4.检测文件大小5.发送文件大小给客户端6.等客户端确认7.开始边读边发数据8.发送md5'''import socket,os,time ...

  5. Python开发程序:FTP程序

    作业:开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp se ...

  6. python之FTP程序(支持多用户在线)

    转发注明出处:http://www.cnblogs.com/0zcl/p/6259128.html 一.需求 1. 用户加密认证 (完成)2. 允许同时多用户登录 (完成)3. 每个用户有自己的家目录 ...

  7. python实现FTP程序

    python实现FTP程序 程序源码 上传功能 查看文件 cd功能 创建目录 程序源码 目录结构 服务端 主程序 import optparse import socketserver import ...

  8. (转)Python开发程序:支持多用户在线的FTP程序

    原文链接:http://www.itnose.net/detail/6642756.html 作业:开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ...

  9. [ python ] 项目一:FTP程序

    声明: 该项目参考学习地址: http://www.cnblogs.com/lianzhilei/p/5869205.html , 感谢博主分享,如有侵权,立即删除. 作业:开发一个支持多用户在线的F ...

随机推荐

  1. jsp标准标签库——jstl

    JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. 除了这些,它还提供 ...

  2. C语言之图像旋转

    最近用到了图像向左或者向右旋转90°的情况,纠结了好一会儿,写下来供大家参考. 1 向左旋转90° //unsigned char *pImgData: 输入图像指针 //int WidthIn, i ...

  3. Linux环境下Apache反向代理金蝶中间件Apusic集群

    操作系统:RedHat Enterprise Linux 5.6 文档参考:<金蝶Apusic应用服务器 帮助手册| IX. Apusic Http Server使用指南> 一.金蝶中间件 ...

  4. C. Hongcow Builds A Nation 并查集

    http://codeforces.com/contest/745/problem/C 把他们并查集后, 其他没有连去government的点,全部放去同一个并查集,然后选择一个节点数最多的gover ...

  5. Hibernate配置(外部配置文件方式)

    配置Hibernate有2种方式,本文讲的是通过外部配置文件配置的方式 Hibernate核心配置文件 <?xml version='1.0' encoding='UTF-8'?> < ...

  6. 使用 Java 发送邮件

    在我们的应用程序中有时需要给用户发送邮件,例如激活邮件.通知邮件等等.那么如何使用 Java 来给用户发送邮件呢? 使用 java 代码发送邮件 使用工具类发送邮件 使用Spring进行整合发送邮件 ...

  7. bootstrap框架栅格系统使用

    使用的前端框架  bootstrap框架 Bootstrap是一个响应式的框架 我们在使用的时候主要使用的是它的网格系统, 1.bootstrap布局 布局容器:.container(用于固定宽度并支 ...

  8. 桥接模式和php实现

    桥接模式(Bridge Pattern): 将抽象部分与它的实现部分分离,使它们都可以独立地变化.它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模 ...

  9. vue-webpack所构建好的项目中增加Eslint

    首先在package.json中配置eslint模块: 在终端运行命令:npm install 然后在build文件夹中web pack.base.conf.js配置eslint 接下来在在项目中新建 ...

  10. LoadRunner 11中Record无法自动生成脚本——解决办法

    [问题描述] 安装loadRunner 11, 使用IE为默认浏览器,打开一个页面进行脚本录制:录制完成后,无法生成脚本. [问题现象] 控制台输出如下: ****** Start Log Messa ...