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之编写类之三子类
Oct 11 Python
详解Python使用simplejson模块解析JSON的方法
Mar 24 Python
Python 比较两个数组的元素的异同方法
Aug 17 Python
python如何读写json数据
Mar 21 Python
python读取excel指定列数据并写入到新的excel方法
Jul 10 Python
Python/ArcPy遍历指定目录中的MDB文件方法
Oct 27 Python
python分布式编程实现过程解析
Nov 08 Python
解决django后台管理界面添加中文内容乱码问题
Nov 15 Python
python enumerate内置函数用法总结
Jan 07 Python
Python headers请求头如何实现快速添加
Nov 03 Python
Autopep8的使用(python自动编排工具)
Mar 02 Python
Python可视化学习之seaborn绘制矩阵图详解
Feb 24 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抓即时股票信息
2006/10/09 PHP
PHP 如何向 MySQL 发送数据
2006/10/09 PHP
如何使用PHP往windows中添加用户
2006/12/06 PHP
php使用file函数、fseek函数读取大文件效率对比分析
2016/11/04 PHP
Firefox getBoxObjectFor getBoundingClientRect联系
2008/10/26 Javascript
JQuery 操作Javascript对象和数组的工具函数小结
2010/01/22 Javascript
理解jQuery stop()方法
2014/11/21 Javascript
fastclick插件导致日期(input[type="date"])控件无法被触发该如何解决
2015/11/09 Javascript
jquery $.trim()去除字符串空格的实现方法【附图例】
2016/03/30 Javascript
用JS写的一个Ajax库(实例代码)
2016/08/06 Javascript
微信小程序 生命周期和页面的生命周期详细介绍
2017/01/19 Javascript
详解Vue2.X的路由管理记录之 钩子函数(切割流水线)
2017/05/02 Javascript
angularjs 获取默认选中的单选按钮的value方法
2018/02/28 Javascript
微信小程序将字符串生成二维码图片的操作方法
2018/07/17 Javascript
使用vue点击li,获取当前点击li父辈元素的属性值方法
2018/09/12 Javascript
vue elementui el-form rules动态验证的实例代码详解
2019/05/23 Javascript
微信小程序 导入图标实现过程详解
2019/10/11 Javascript
在Python的Bottle框架中使用微信API的示例
2015/04/23 Python
Python中的filter()函数的用法
2015/04/27 Python
Python判断直线和矩形是否相交的方法
2015/07/14 Python
Python3 assert断言实现原理解析
2020/03/02 Python
Python读取文件内容为字符串的方法(多种方法详解)
2020/03/04 Python
Python实现从N个数中找到最大的K个数
2020/04/02 Python
CSS3实现内凹圆角的实例代码
2017/05/04 HTML / CSS
利用html5 canvas破解简单验证码及getImageData接口应用
2013/01/25 HTML / CSS
加拿大最大的体育用品、鞋类和服装零售商:Sport Chek
2018/11/29 全球购物
生产管理的三大手法
2013/11/11 职场文书
某同学的自我鉴定范文
2013/12/26 职场文书
大学生军训感想
2014/02/16 职场文书
安全标准化实施方案
2014/02/20 职场文书
行政助理工作职责范本
2014/03/04 职场文书
舞蹈教育学专业求职信
2014/06/29 职场文书
2014年司机工作总结
2014/11/21 职场文书
宝宝满月祝酒词
2015/08/10 职场文书
MySQL官方导出工具mysqlpump的使用
2021/05/21 MySQL
中国古风插画师排行榜:夏达第一,第三是阴阳师姑获鸟皮肤创作者
2022/03/18 国漫