python自己动手从零开始搭建FTP服务器1 先让服务器跑起来
来源:互联网 发布:杜兰特对伦纳德数据 编辑:程序博客网 时间:2024/06/02 04:53
1 引子
记得初二刚开始接触物理学时,一下就被其中揭露出的万物之间简单的逻辑关系给迷住了。比如简单到为什么洗完澡会觉得冷,因为体表的液态水蒸发,而水蒸发是一个吸热过程。是的,物理学中的世界就是这么简单的逻辑构成的。而计算机的世界里,也是由一些基本的简单的逻辑构成的,比如CPU要把硬盘里的数据读入内存才能处理。内核大神李云华(《独辟蹊径品内核》作者)也说过,计算机的世界里,一开始都是简单的函数与代码,当随着技术的发展,简单的技术不能满足当下的需要,才有了复杂化(见《独辟蹊径品内核》中关于X86保护模式部分)。写这个系列的目的就是,不参考别人代码,自己从零构建出一个可以实现FTP协议的服务器,和客户端,加强自己对TCP/IP协议栈应用的理解,因为本人还在学习TCP/IP协议栈。当然,还有另外小一个目的,就是实现手机和电脑上文件共享(我不喜欢插USB线)。
声明一下。由于是从零开始,而且个人觉得FTP协议并不复杂,所以篇幅不会太大,不会很多。代码当然难免有不严谨的地方,我还会维护的。既然开始了,就下决心把它做完,做好。
2 零的程度
在网上看到,或者图书馆里看到许多,从零开始学习C,C++之类的教材,这类教材通常还是需要一定的基础才能学会的。当年在图书馆找到一本从零学习VC++的教材,我对里面的俄罗斯方块的游戏实现很着迷,但敲了半个学期的代码,还是没有搞出来。这里 我说的从零,也不是要你自己去编译Python,自己去写socket实现。造轮子可以学到许多(当年的Linus),但不是全都需要从原材料去先造一个轮子。我说下我现在的Python基础。基本的语法了解,面向对象的学习过一点,没有什么项目经验。这也基本上算是从零开始了。网络编程方面,一个FTP服务器算是基本的技能了。虽然可以用现有的轮子,分分钟搭建出一个服务器来,可是你真的不想知道,FTP协议是怎么实现的吗?不想自己动动手吗?程序员动手不动口。
3 思路
首先,不考虑FTP协议的具体内容。把基本服务器和客户端搭建起来。让它们能跑起来,基本的通信。可以实现文件传输。
一点点把协议的内容加入进去。完善的过程中,会描述一些协议的内容。手边有一本《TCP/IP协议详解(卷一:协议)》,很好的协议讲解参考。
4 开始了
废话少说,上代码。当然这两段代码看起来有点不入眼,这就是“零”了。以前没有用Python实现过简单的服务器,但是对socket的调用过程,还是有点印象。Python里有一些默认的参数,这个感觉太好了。差不多是傻瓜式的调用。就完成了这2段代码。可以实现基本的通信,比如发个字符串什么的。还可以把服务器运行路径下的tmp文件发送给客户端。
目前只能接收单个客户端的连接。传输文件的实现也比较低级。我只是本地测试这两个功能。
#! /usr/bin/python# -*- coding: utf-8 -*-# client sideimport socketif __name__ == '__main__': client_socket = socket.socket() client_socket.connect(('127.0.0.1', 8000)) #根据需要更改地址 print 'connected' while True: print 'sending data' in_data = raw_input('>>') if in_data == 'q': break; client_socket.send(in_data) recv_data = client_socket.recv(1024) if in_data == 'g': #获取tmp文件内容的前1024字节写入本地文件 f = open('tmp', 'w') f.write(recv_data) f.close() if recv_data: print 'from server %s' % recv_data else: break print 'end' client_socket.close()
#! /usr/bin/python# -*- coding: utf-8 -*-# server sideimport socketif __name__ == '__main__': server_socket = socket.socket() server_socket.bind(('0.0.0.0', 8000)) print 'b4 listening' server_socket.listen(2) client_socket, client_addr = server_socket.accept() print 'incoming connection' if client_socket: while True: recv_data = client_socket.recv(20) if not recv_data: break; if recv_data == 'g': print 'sending file tmp' out_file = open('tmp', 'r') send_data = out_file.read() client_socket.send(send_data) out_file.close() else: print 'receiving %s' % recv_data client_socket.send(recv_data) print 'end' server_socket.close() client_socket.close()
0 0
- python自己动手从零开始搭建FTP服务器1 先让服务器跑起来
- python自己动手从零开始搭建FTP服务器2 FTP初步框架
- 自己动手搭建VPN服务器
- python基础 -- 01FTP服务器搭建
- 从零开始搭建svn服务器
- 让Tiny服务器运行起来
- 自己动手搭建免费VoIP服务器
- 自己动手一步步搭建repo服务器
- win2008服务器 搭建 FTP服务器
- 局域网搭建FTP服务器
- centos 搭建 ftp服务器
- Centos 搭建ftp服务器
- win7 搭建ftp服务器
- Ubuntu 搭建FTP服务器
- ftp服务器搭建
- FTP服务器的搭建
- ubuntu ftp服务器搭建
- Windows2003搭建FTP服务器
- postgresql 10 分区探密
- 在Windows上打造出自己的Linux开发环境
- Android基础第九天
- Markdown学习总结(1)
- 重构-改善既有代码的设计读书笔记(七)
- python自己动手从零开始搭建FTP服务器1 先让服务器跑起来
- dfs n皇后问题
- NOIP2016 Day1t2 天天爱跑步
- TODO:小程序开发过程之体验者
- 统计ul下li个数在ul为class或id
- 栈的进栈和出栈
- bzoj4719 [Noip2016]天天爱跑步
- Spark SQL Hive数据源复杂综合案例实战
- Android基础第十天