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

server端:

 #!/usr/bin/env python

 import socketserver,os

 class FTP(socketserver.BaseRequestHandler):
def handle(self):
def clientsend(filename):
f = open('/ftp/%s' %filename,'w')
# while 1:
data = self.request.recv(4096).decode("utf-8")
# if not data:break
f.write(data)
f.close()
print('File %s receive done!' % filename)
def clientdownload(filename):
f = open('/ftp/%s' %filename,'r')
data = f.read()
f.close()
self.request.sendall(data.encode("utf-8"))
print('listening connect from:',self.client_address)
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'
self.request.sendall("Welcome my ftp,input \033[34;1m'help'\033[0m dispaly meun".encode("utf-8"))
while 1:
try:
re_msg = self.request.recv(1024).decode("utf-8")
if not re_msg:break
if re_msg == 'help' or re_msg == '?':
self.request.sendall(listmsg.encode("utf-8"))
elif re_msg.split()[0] == 'send':
filename = re_msg.split()[1]
clientsend(filename)
elif re_msg.split()[0] == 'ls':
ls_list = os.popen('ls -l /ftp').read().encode("utf-8")
self.request.sendall(ls_list)
elif re_msg.split()[0] == 'download':
filename = re_msg.split()[1]
clientdownload(filename)
else:
self.request.sendall('Invalid value'.encode("utf-8"))
finally:
pass
if __name__ == '__main__': #只有程序执行时才会触发下面的语句,程序被导入调用时,下面的语句不会触发
host = '192.168.101.128'
port = 2222
server = socketserver.ThreadingTCPServer((host,port),FTP)
server.serve_forever()

client端:

 #!/usr/bin/env python
import socket,sys host = '192.168.101.128'
port = 2222 s = socket.socket()
s.connect((host,port))
info = s.recv(8096).decode("utf-8")
print(info)
while 1:
INPUT = str(input('input:'))
if INPUT.split()[0] == 'send':
s.send(INPUT.encode("utf-8"))
filename = INPUT.split()[1]
f = open(filename,'r')
file_data = f.read()
f.close()
s.sendall(file_data.encode("utf-8"))
print('file sent finished!')
elif INPUT.split()[0] == 'download':
s.send(INPUT.encode("utf-8"))
filename = INPUT.split()[1]
f = open(filename,'w')
data = s.recv(8096).decode("utf-8")
f.write(data)
f.close()
print('%s has been download!' %filename)
elif INPUT.split()[0] == 'exit':
sys.exit()
else:
s.send(INPUT.encode("utf-8"))
data = s.recv(8096).decode("utf-8")
print(data)
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. E20180305-hm-xa

    raw adj. 生的,未加工的; 无经验的; 新近完成的; 发炎的,疼痛的; payload n. 有效载荷; (航天器.卫星的) 装备; (车辆等的) 装载货物; (炸弹.导弹的) 爆炸力;

  2. bzoj 1180: [CROATIAN2009]OTOCI【LCT】

    一道几乎是板子的LCT,但是沉迷数学很久时候突然1A了这道题还是挺开心的 #include<iostream> #include<cstdio> using namespace ...

  3. VMware 12安装Mac OS X 10.11&解决上网的问题

    近日想在Win10上安装Mac OS 玩玩,于是上网搜了相关资源,查看了相关经验分享,开始着手安装.系统很快成功安装,但最大问题是虚拟机中的Mac OS无法上网.费了很长时间,最终看到Ping通结果, ...

  4. 洛谷 P1966 火柴排队

    题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:∑(ai​−bi​)2 其中ai​ 表示 ...

  5. java 学习书籍

    <Effective java> <深入理解java虚拟机> <Java并发编程实践> <Java Performance> <java解惑> ...

  6. poj 1511 Invitation Cards spfa 邻接矩阵

    题目链接: http://poj.org/problem?id=1511 题目大意: 这道题目比较难理解,我读了好长时间,最后还是在队友的帮助下理解了题意,大意就是,以一为起点,求从一到其他各点的最短 ...

  7. 牛客网暑期ACM多校训练营(第五场)

    J-plan(贪心) 题目描述 There are n students going to travel. And hotel has two types room:double room and t ...

  8. 2018年全国多校算法寒假训练营练习比赛(第五场):A题:逆序数(树状数组or归并排序)

    题目描述 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数.比如一个序列为4 5 1 3 2, 那么这个序列 ...

  9. 递归查找无效的符号链接 分类: linux c/c++ 2014-06-02 00:14 345人阅读 评论(0) 收藏

    本程序实现在指定目录下递归查找无效的符号链接. 1.设计思路 逐个读取给定目录中的目录项,判断类型 (1)若为目录,则读取该目录中的目录项并判断类型: (2)若为链接文件,则读取出其指向文件的名称(绝 ...

  10. 5 月编程语言排行榜:Java第一,R跌出Top20

    我们都知道,最近,TIOBE 发布了 5 月份编程语言排行榜.其中,前三名依然健稳不变,他们分别是 Java.C.C++,第四则为: Python ,第五则为 VB .NET. 下面两张图,我们可以看 ...