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
原创粉丝点击