Python个人学习笔记1_初识python_http服务器篇

综述:大概比较厉害的人都要写点东西吧,咱不是什么牛人,但咱总要向牛人的方向靠拢啊,不然可能会被社会淘汰了。有人说技术改变世界,在我看来学点技术也不是什么坏事。

先说说我写博客的初衷吧。我自己就是个比较懒惰和懒散的人,总是想的多、做得少,俗话说好记性不如烂笔头,就算一个人记忆力再好,也有记不住的东西。所以有必要把值得记下的东西写下来,以后看看或许还能找到当初的感觉,算是给自己一个交代吧。

最近找了个实习,由于业务需要,导师让我学学python。之前就听说过python这个语言,什么hacker的必备语言、什么代码非常简洁、什么life is short, i use python 云云... 正好我也不知道编程该从哪里开始学起,就按照导师的思路走吧。

1.我看的参考书是《dive into python》,用的环境是xshell+cenos虚拟机,翻墙用google查资料

2.第一个python程序是写一个基于socket的c/s模型,可以实现文件的上传和下载:

先附上源码:

ftp_client.py

#coding=utf-8

import socket
import os
import time
import sys

if len(sys.argv) != 2:
        print ‘\n‘,‘Using python‘,sys.argv[0],‘server_ip:port‘
        server = (‘127.0.0.1‘,8080)
else:
        server = sys.argv[1].split(‘:‘)
        server = (server[0],int(server[1]))

sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print ‘Connecting...‘
sock.connect(server)
print ‘Connected to %s:%d‘ %server
while True:
    data = raw_input(‘unload or download: u/d\t‘)
    data = data.strip()
    if not data: break
    if data == ‘u‘:
        fp = ‘‘
        sock.send(data)
        flist = os.listdir(‘.‘)
        for f in flist:
            print ‘%d.%s‘%(flist.index(f) + 1,f)
        fname = raw_input(‘\nEnter a filename to upload: ‘).strip()
        try:
            index = int(fname)
            if type(index) is int:
                fname = flist[index - 1]
        except:
            pass
        fp = open(fname,‘rb‘)
        fsize = os.path.getsize(fname)
        if not fp: continue
        sock.send(fname + ‘:‘ + str(fsize))
        print ‘Start uploading...‘
        time.sleep(0.1)
        while True:
            fsend = fp.read(1024)
            if not fsend: break
            sock.send(fsend)
        fp.close()
        print ‘Upload complete!‘,‘\n‘
    if data == ‘d‘:
        sock.send(data)
        flist = sock.recv(1024).split(‘;‘)
        fname = []
        fsize = []
        for f in flist:
            fname.append(f.split(‘:‘)[0])
            fsize.append(str(f.split(‘:‘)[1]))
        flist = fname
        for f in flist:
            print ‘%d.%s‘%(flist.index(f) + 1,f)
        fname = raw_input(‘\nEnter a filename to download: ‘).strip()
        try:
            index = int(fname)
            if type(index) is int:
                fname = flist[index - 1]
        except:
            pass
        if fname not in flist:
            print ‘File doesn\‘t exit!‘
            continue
        sock.send(fname)
        fsize = int(fsize[flist.index(fname)])
        print ‘Start downloading...‘
        if fname in os.listdir(‘.‘):
            oldfname = fname
            fname = raw_input(‘File exit, saving as [Default new_%s]:‘ %fname)
            if not fname: fname = ‘new_‘ + oldfname
            while fname in os.listdir(‘.‘): fname = ‘new_‘ + fname
        fp = open(fname,‘wb‘)
        while True:
            frecv = sock.recv(1024)
            frecvsize = len(frecv)
            fsize -= frecvsize
            fp.write(frecv)
            if fsize <= 0: break
        print fname,‘Downloaded from %s:%d‘ %server,‘\n‘
        fp.close()

ftp_server.py

#coding=utf-8
import socket,os,threading,time,sys

if len(sys.argv) != 2:
    print ‘\n‘,‘Using: python‘,sys.argv[0],‘server_ip:port‘
    server = (‘127.0.0.1‘,8080)
else:
    server = sys.argv[1].split(‘:‘)
    server = (server[0],int(server[1]))

class MyThread(threading.Thread):

    def __init__(self,conn,addr):
        threading.Thread.__init__(self)
        self.conn = conn
        self.addr = addr

    def run(self):
        while True:
            data = self.conn.recv(1024).strip()
            if not data: break
            if data == ‘u‘:
                fhead = self.conn.recv(1024).split(‘:‘)
                fname,fsize = (fhead[0],int(fhead[1]))
                print ‘fname : %s, fsize : %d‘ %(fname,fsize)
                if not fname: continue
                while fname in os.listdir(‘.‘):
                    fname = ‘new_‘+fname
                print ‘Saving as:‘,fname
                fp = open(fname,‘wb‘)
                while True:
                    frecv = self.conn.recv(1024)
                    frecvsize = len(frecv)
                    fsize -= frecvsize
                    fp.write(frecv)
                    if fsize <= 0:break
                print fname,‘Uploaded by %s:%d‘ %self.addr,‘\n‘
                fp.close()
            if data == ‘d‘:
                flist = os.listdir(‘.‘)
                for f in flist:
                    flist[flist.index(f)] = f + ‘:‘ + str(os.path.getsize(f))
                flist = ‘;‘.join(flist)
                self.conn.send(flist)
                fname = self.conn.recv(1024).strip()
                if not fname: continue
                fp = open(fname,‘rb‘)
                while True:
                    fsend = fp.read(1024)
                    if not fsend: break
                    self.conn.send(fsend)
                fp.close()
                print fname,‘Sent to %s:%d‘ %self.addr,‘\n‘
        self.conn.close()

def main():
    sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sock.bind(server)
    print ‘Server starts: %s:%d‘ %(server[0],server[1])
    sock.listen(5)
    threads = []
    while True:
        conn,addr = sock.accept()
        print ‘Connected to %s:%d‘ %addr
        t = MyThread(conn,addr)
        t.start()
    sock.close()

if __name__ == ‘__main__‘:
    main()

3.下面是基于http协议的服务器,可以下载当前目录下的文件

http_server.py

#coding=utf-8
import socket
import os
import sys
import time
import threading

server = (‘127.0.0.1‘,80)

def printusage():
    ‘‘‘ Set server to default or user definition‘‘‘
    global server
    if len(sys.argv) != 2:
        print ‘\n‘,‘Usage: python‘,sys.argv[0],‘server_ip:port‘
        print ‘eg.       : python 192.68.0.1:80‘
        print ‘default   : 127.0.0.1:8080‘
        server = (‘127.0.0.1‘,8080)
    else:
        server = sys.argv[1].split(‘:‘)
        server = (server[0],int(server[1]))

class Http():
    ‘‘‘ My Http calss‘‘‘
    def __init__(self):
        self.html_head = ‘HTTP/1.x  200 OK\r\n‘ +                        ‘Content-Type: text/html\r\n\r\n‘
        self.html_body = ‘‘
        self.filedata = ‘‘

    def getindex(self):
        ‘‘‘ Get index.html information‘‘‘
        self.html_body = ‘‘‘
                        <html>
                            <title>Http Server Powered by Python</title>
                            <head><b>Choose a file to download</b></head>
                            <body> <br /><br />
                        ‘‘‘
        flist = os.listdir(‘.‘)
        i = 1
        for f in flist:
            self.html_body += ‘<a href=\‘http://%s:%d/%d.%s\‘ style=\"text-decoration:none\">                         <b>%d.%s</b></a><br />\n‘ %(server[0],server[1],i,f,i,f)
            i += 1
        self.html_body += ‘</body></html>‘
    
    def getfiledata(self,filename,fheadsize,readsize):
        ‘‘‘ Read file and save to Http.filedata‘‘‘
        fp = open(filename,‘rb‘)
        fsize = os.path.getsize(filename)
        if fheadsize == 0:
            code = ‘200 OK‘
            filedata_head = ‘HTTP/1.1 %s\r\n‘ %code +                        ‘Content-Type: application/octet-stream\r\n‘ +                        ‘Content-Length: %d\r\n‘ %fsize +                        ‘Connection: keep-alive\r\n‘ +                        ‘Content-Disposition: attachment; filename=\"%s\"\r\n‘ %filename +                        ‘Accept-Ranges: bytes\r\n‘ +                        ‘Content-Ranges: bytes=%d-%d/%d\r\n\r\n‘ %(fheadsize,fheadsize + readsize,fsize)
        else:
            filedata_head = ‘‘
        fp.seek(fheadsize,0)
        filedata_body = fp.read(readsize)
        fp.close()
        self.filedata = filedata_head + filedata_body

class HttpThread(threading.Thread):
    ‘‘‘ Http threads, to deal with file-downloads‘‘‘
    def __init__(self,conn,addr,filename):
        threading.Thread.__init__(self)
        self.conn = conn
        self.addr = addr
        self.filename = filename

    def run(self):
        ‘‘‘ Threads‘ function‘‘‘
        if self.filename in os.listdir(‘.‘):
            ‘‘‘ Deal with client request /filename resource‘‘‘
            myhttp = Http()
            buffsize = 1024
            fsize = os.path.getsize(self.filename)
            fheadsize = 0     
            while True:
                if fsize - fheadsize > buffsize:
                    readsize = buffsize
                if fsize - fheadsize <= buffsize:
                    readsize = fsize - fheadsize
                if fheadsize >= fsize:
                    break
                myhttp.getfiledata(self.filename,fheadsize,readsize)
                fheadsize += readsize
                try:
                    self.conn.send(myhttp.filedata)
                except socket.error:
                    print ‘Client closed connection!‘
                    self.conn.close()
                    return
            self.conn.close()
            print ‘Send %s to %s:%d done!\n‘ %(self.filename,self.addr[0],self.addr[1])
        self.conn.close()

def createsock():
    ‘‘‘ Create socket and return sock‘‘‘
    sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sock.bind(server)
    print ‘Server starts: %s:%d‘ %server
    sock.listen(5)
    return sock

def readfile(filename):
    ‘‘‘ Read file‘‘‘
    if filename == ‘index.html‘:
        myhttp = Http()
        myhttp.getindex()
        return myhttp.html_head + myhttp.html_body

def getfilename(conn):
    ‘‘‘ Get filename from client‘‘‘
    data = conn.recv(1024)
    filename = ‘‘
    try:
        data = data.split(‘ ‘)[1]
        filename = data.split(‘.‘,1)[1]
    except:
        pass
    if not filename:
        filename = ‘index.html‘
    return filename 

def main():
    ‘‘‘ Deal with client request‘‘‘
    printusage()
    sock = createsock()
    while True:
        conn,addr = sock.accept()
        print ‘Connected to %s:%d‘ %addr
        filename = getfilename(conn)
        if filename == ‘index.html‘:
            ‘‘‘ Deal with client request / resource‘‘‘
            conn.sendall(readfile(filename))
            conn.close()
            continue
        if filename in os.listdir(‘.‘):
            ‘‘‘ Deal with client request /filename resource
            Open a new thread to read file and send data
            ‘‘‘
            myhttpthread = HttpThread(conn,addr,filename)
            myhttpthread.start()
            continue
    sock.close()

if __name__ == ‘__main__‘:
    main()
时间: 2024-09-28 22:34:54

Python个人学习笔记1_初识python_http服务器篇的相关文章

2. 蛤蟆Python脚本学习笔记二基本命令畅玩

2. 蛤蟆Python脚本学习笔记二基本命令畅玩 本篇名言:"成功源于发现细节,没有细节就没有机遇,留心细节意味着创造机遇.一件司空见惯的小事或许就可能是打开机遇宝库的钥匙!" 下班回家,咱先来看下一些常用的基本命令. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/48092873 1.  数字和表达式 看下图1一就能说明很多问题: 加法,整除,浮点除,取模,幂乘方等.是不是很直接也很粗暴. 关于上限,蛤蟆不太清楚

Python Click 学习笔记(转)

原文链接:Python Click 学习笔记 Click 是 Flask 的团队 pallets 开发的优秀开源项目,它为命令行工具的开发封装了大量方法,使开发者只需要专注于功能实现.恰好我最近在开发的一个小工具需要在命令行环境下操作,就写个学习笔记. 国际惯例,先来一段 "Hello World" 程序(假定已经安装了 Click 包). # hello.py import click @click.command() @click.option('--count', default

[简明python教程]学习笔记之编写简单备份脚本

[[email protected] 0503]# cat backup_ver3.py #!/usr/bin/python #filename:backup_ver3.py import os import time #source source=['/root/a.sh','/root/b.sh','/root/c.sh'] #source='/root/c.sh' #backup dir target_dir='/tmp/' today=target_dir+time.strftime('

3. 蛤蟆Python脚本学习笔记三字符串

3. 蛤蟆Python脚本学习笔记三字符串 本篇名言:"平静的湖面只有呆板的倒映,奔腾的激流才有美丽的浪花!幸福不是靠别人来布施,而是要自己去赢取!生命的意义在不断挑战自己,战胜自己!" 这个本来放在昨天的,由于昨晚又太晚了,所以就搁在这里了.赶紧看看吧. 字符串两边都用双引号或者单引号包起来.否则就使用转移符号来转移一下. 输入在一起可以直接拼接. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/48112507

1.蛤蟆Python脚本学习笔记一环境搭建

1.蛤蟆Python脚本学习笔记一环境搭建 蛤蟆一直在想在工作的时候能不能有一个牛逼的工具来让自己工作更加轻松和快乐.用过C, C++, C#, JAVA,  SHELL,TCL,汇编,BAT等,感觉这些都是需要的时候能发挥作用,不能和我想象的一样.突然有一天,感觉Python实在不错,那么就和小伙伴们一起乐呵乐呵呗.万事开头难,我们先来搭建环境吧. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/48058315 1. 相关

[简明python教程]学习笔记2014-05-05

今天学习了python的输入输出.异常处理和python标准库 1.文件 通过创建一个file类的对象去处理文件,方法有read.readline.write.close等 [[email protected] 0505]# cat using_file.py #!/usr/bin/python #filename:using_file.py poem='''Programing is fun when the work is done use Python! ''' f=file('poem.

SuperSocket框架学习笔记2-构建SuperWebSocket服务器程序

SuperSocket框架学习笔记2-构建SuperWebSocket服务器程序 上一节简单介绍了 基本的SuperSocket服务器 这一节我们使用 SuperWebSocket构建一个 能与Unity3D通信的(Console控制台)服务器程序 嘎嘎 先下载   需要的  DLL类库 服务端: SuperSocket1.6.1 这个必备 http://www.supersocket.net/ SuperWebSocket 服务端必备 http://superwebsocket.codeple

[Python][MachineLeaning]Python Scikit-learn学习笔记1-Datasets&amp;Estimators

Scikit-learn官网:http://scikit-learn.org/stable/index.html Datasets 标准的数据集格式为一组多维特征向量组成的集合.数据集的标准形状(shape)为二维数组(samples, features),其中samples表示数据集大小,features表示其中特征向量的维数. 使用时可使用shape方法查看数据集 >>> from sklearn import datasets >>> iris = dataset

Python scikit-learn 学习笔记—环境篇

Python scikit-learn 学习笔记-环境篇 近来闲来无事,也面临毕业季.这段时间除了做毕业设计,和同学再多吃几顿饭玩玩游戏之外.剩下的时间浪费着实可惜.想着以后研究生还要读三年,不如现在多看看书或者别的资料.正逢最近参加阿里巴巴大数据比赛,趁机学了一阵Python 数据挖掘包scikit learn,估计以后说不定会用到,所以先行记录下来,分享给大家. 先说一下这段时间对sklearn的理解.这一个数据挖掘包给我最直观的感觉就是简易.这个挖掘包的一些算法核心编码部分是借鉴别的单独算