Python实现的简单文件传输服务器和客户端


Posted in Python onApril 08, 2015

还是那个题目(题目和流程见java版本),感觉光用java写一点新意也没有,恰巧刚学习了python,何不拿来一用,呵呵:
服务器端:

import SocketServer, time 
 
class MyServer(SocketServer.BaseRequestHandler):  
  userInfo = {  
    'yangsq'  : 'yangsq',  
    'hudeyong' : 'hudeyong',  
    'mudan'   : 'mudan' }  
 
  def handle(self):  
    print 'Connected from', self.client_address  
      
    while True:  
      receivedData = self.request.recv(8192)  
      if not receivedData:  
        continue 
        
      elif receivedData == 'Hi, server':  
        self.request.sendall('hi, client')  
          
      elif receivedData.startswith('name'):  
        self.clientName = receivedData.split(':')[-1]  
        if MyServer.userInfo.has_key(self.clientName):  
          self.request.sendall('valid')  
        else:  
          self.request.sendall('invalid')  
            
      elif receivedData.startswith('pwd'):  
        self.clientPwd = receivedData.split(':')[-1]  
        if self.clientPwd == MyServer.userInfo[self.clientName]:  
          self.request.sendall('valid')  
          time.sleep(5)  
 
          sfile = open('PyNet.pdf', 'rb')  
          while True:  
            data = sfile.read(1024)  
            if not data:  
              break 
            while len(data) > 0:  
              intSent = self.request.send(data)  
              data = data[intSent:]  
 
          time.sleep(3)  
          self.request.sendall('EOF')  
        else:  
          self.request.sendall('invalid')  
            
      elif receivedData == 'bye':  
        break 
 
    self.request.close()  
      
    print 'Disconnected from', self.client_address  
    print 
 
if __name__ == '__main__':  
  print 'Server is started\nwaiting for connection...\n'  
  srv = SocketServer.ThreadingTCPServer(('localhost', 50000), MyServer)  
  srv.serve_forever()

说明:
line-55到line-58的作用就相当于java中某个类里面的main函数,即一个类的入口。
python中SocketServer module里提供了好多实用的现成的类,BaseRequestHandler就是一个,它的作用是为每一个请求fork一个线程,只要继承它,就有这个能力了,哈哈,真是美事。
当然,我们继承了BaseRequestHandler,就是override它的handle方法,就像java中继承了Thread后要实现run方法一样。实际上这个handle方法的内容和我们的java版本的run函数实现的完全一样。
line-30到line-43就是处理文件下载的主要内容了。看着都挺眼熟的呵:)
这里在文件发送完后发了一个“EOF”,告诉client文件传完了。
客户端:

import socket, time 
 
class MyClient:  
 
  def __init__(self):  
    print 'Prepare for connecting...'  
 
  def connect(self):  
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
    sock.connect(('localhost', 50000))  
 
    sock.sendall('Hi, server')  
    self.response = sock.recv(8192)  
    print 'Server:', self.response  
 
    self.s = raw_input("Server: Do you want get the 'thinking in python' file?(y/n):")  
    if self.s == 'y':  
      while True:  
        self.name = raw_input('Server: input our name:')  
        sock.sendall('name:' + self.name.strip())  
        self.response = sock.recv(8192)  
        if self.response == 'valid':  
          break 
        else:  
          print 'Server: Invalid username'  
 
      while True:  
        self.pwd = raw_input('Server: input our password:')  
        sock.sendall('pwd:' + self.pwd.strip())  
        self.response = sock.recv(8192)  
        if self.response == 'valid':  
          print 'please wait...'  
 
          f = open('b.pdf', 'wb')  
          while True:  
            data = sock.recv(1024)  
            if data == 'EOF':  
              break 
            f.write(data)  
              
          f.flush()  
          f.close()  
 
          print 'download finished'  
          break 
        else:  
          print 'Server: Invalid password'  
          
 
    sock.sendall('bye')  
    sock.close()  
    print 'Disconnected'  
 
if __name__ == '__main__':  
  client = MyClient()  
  client.connect()

line-34到line-41处理文件下载,client收到server的“EOF”信号后,就知道文件传完了。
最后需要说明一下python的文件,由于是内置类型,所以不想java那样有那么多的reader,writer,input,ouput啊。python中,在打开或建立一个文件时,主要是通过模式(mode)来区别的。
python的网络编程确实简单,因为它提供了各种功能的已经写好的类,直接继承就Ok了。
python还在学习中,上面的例子跑通是没问题,但写得肯定不够好,还得学习啊

Python 相关文章推荐
使用python编写批量卸载手机中安装的android应用脚本
Jul 21 Python
python学习教程之Numpy和Pandas的使用
Sep 11 Python
django定期执行任务(实例讲解)
Nov 03 Python
tensorflow: variable的值与variable.read_value()的值区别详解
Jul 30 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
May 10 Python
Django框架搭建的简易图书信息网站案例
May 25 Python
Django文件存储 默认存储系统解析
Aug 02 Python
python socket 聊天室实例代码详解
Nov 14 Python
Python使用for生成列表实现过程解析
Sep 22 Python
Django正则URL匹配实现流程解析
Nov 13 Python
python 统计代码耗时的几种方法分享
Apr 02 Python
Python中三种花式打印的示例详解
Mar 19 Python
操作Windows注册表的简单的Python程序制作教程
Apr 07 #Python
编写简单的Python程序来判断文本的语种
Apr 07 #Python
Python实现在线程里运行scrapy的方法
Apr 07 #Python
Python实现从脚本里运行scrapy的方法
Apr 07 #Python
Python自定义scrapy中间模块避免重复采集的方法
Apr 07 #Python
Python中用memcached来减少数据库查询次数的教程
Apr 07 #Python
Python3中常用的处理时间和实现定时任务的方法的介绍
Apr 07 #Python
You might like
php 信息采集程序代码
2009/03/17 PHP
php学习笔记(三)操作符与控制结构
2011/08/06 PHP
解析用PHP实现var_export的详细介绍
2013/06/20 PHP
PHP防止刷新重复提交页面的示例代码
2015/11/11 PHP
PHP实现补齐关闭的HTML标签
2016/03/22 PHP
屏蔽PHP默认设置中的Notice警告的方法
2016/05/20 PHP
SyntaxHighlighter代码加色使用方法
2008/09/07 Javascript
js遍历td tr等html元素
2012/12/13 Javascript
用javascript关闭本窗口不弹出询问框的方法
2014/09/12 Javascript
javascript时间差插件分享
2016/07/18 Javascript
jQuery异步提交表单的两种方式
2016/09/13 Javascript
详解AngularJs中$sce与$sceDelegate上下文转义服务
2016/09/21 Javascript
微信小程序 闭包写法详细介绍
2016/12/14 Javascript
js判断手机系统是android还是ios
2017/03/07 Javascript
微信小程序中吸底按钮适配iPhone X方案
2017/11/29 Javascript
关于jquery中attr()和prop()方法的区别
2018/05/28 jQuery
vue-auto-focus: 控制自动聚焦行为的 vue 指令方法
2018/08/25 Javascript
Bootstrap4 gulp 配置详解
2019/01/06 Javascript
Vue为什么要谨慎使用$attrs与$listeners
2020/08/27 Javascript
python实现一次创建多级目录的方法
2015/05/15 Python
利用Python开发实现简单的记事本
2016/11/15 Python
对python中词典的values值的修改或新增KEY详解
2019/01/20 Python
python删除文件夹下相同文件和无法打开的图片
2019/07/16 Python
AmazeUI 点击元素显示全屏的实现
2020/08/25 HTML / CSS
Koral官方网站:女性时尚运动服
2019/04/10 全球购物
澳大利亚二手奢侈品网站:Modsie
2019/09/23 全球购物
大学生专科毕业生自我评价
2013/11/17 职场文书
环境卫生标语
2014/06/09 职场文书
安全责任书怎么写
2014/07/28 职场文书
店铺转让协议书(2014版)
2014/09/23 职场文书
股权转让协议范本
2014/12/07 职场文书
2014年酒店年度工作总结
2014/12/10 职场文书
小程序教您怎样你零成本推广获取数万用户的方法
2019/07/30 职场文书
关于感恩的作文
2019/08/26 职场文书
请学会珍惜眼前,因为人生没有下辈子!
2019/11/12 职场文书
Nginx代理同域名前后端分离项目的完整步骤
2021/03/31 Servers