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的函数嵌套的使用方法
Jan 24 Python
python操作数据库之sqlite3打开数据库、删除、修改示例
Mar 13 Python
python基于multiprocessing的多进程创建方法
Jun 04 Python
python使用paramiko实现远程拷贝文件的方法
Apr 18 Python
解决python中 f.write写入中文出错的问题
Oct 31 Python
使用Python 统计高频字数的方法
Jan 31 Python
Python命令行click参数用法解析
Dec 19 Python
Anaconda配置pytorch-gpu虚拟环境的图文教程
Apr 16 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
May 18 Python
Tensorflow tensor 数学运算和逻辑运算方式
Jun 30 Python
scrapy redis配置文件setting参数详解
Nov 18 Python
Python实现学生管理系统(面向对象版)
Jun 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编写文件多服务器同步程序
2016/07/02 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
JS是否可以跨文件同时控制多个iframe页面的应用技巧
2007/12/16 Javascript
jQuery-ui中自动完成实现方法
2010/06/10 Javascript
客户端限制只能上传jpg格式图片的js代码
2010/12/09 Javascript
纯js网页画板(Graphics)类简介及实现代码
2012/12/24 Javascript
javascript中的undefined和not defined区别示例介绍
2014/02/26 Javascript
jQuery之ajax删除详解
2014/02/27 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
JS修改地址栏参数实例代码
2016/06/14 Javascript
AngularJS ng-repeat指令中使用track by子语句解决重复数据遍历错误问题
2017/01/21 Javascript
vue使用中的内存泄漏【推荐】
2018/07/10 Javascript
微信小程序中this.data与this.setData的区别详解
2018/09/17 Javascript
Nuxt升级2.0.0时出现的问题(小结)
2018/10/08 Javascript
nodejs中各种加密算法的实现详解
2019/07/11 NodeJs
原生JS实现天气预报
2020/06/16 Javascript
vue3.0 加载json的方法(非ajax)
2020/10/26 Javascript
[01:02:03]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS VG
2014/05/26 DOTA
[01:14:19]NAVI vs Mineski 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Python循环语句之break与continue的用法
2015/10/14 Python
有趣的python小程序分享
2017/12/05 Python
浅析python实现scrapy定时执行爬虫
2018/03/04 Python
Django 多语言教程的实现(i18n)
2018/07/07 Python
python的scipy实现插值的示例代码
2019/11/12 Python
Python中openpyxl实现vlookup函数的实例
2020/10/28 Python
网页布局中CSS样式无效的十个重要原因详解
2017/08/10 HTML / CSS
Java编程面试题
2016/04/04 面试题
万户网络JAVA程序员岗位招聘笔试试卷
2013/01/08 面试题
平安家庭事迹材料
2014/12/20 职场文书
前台接待岗位职责
2015/02/03 职场文书
2015年初中教师个人工作总结
2015/07/21 职场文书
公司周年庆寄语
2019/06/21 职场文书
JVM上高性能数据格式库包Apache Arrow入门和架构详解(Gkatziouras)
2021/05/26 Servers
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python
python数据处理之Pandas类型转换
2022/04/28 Python
Python可视化神器pyecharts绘制水球图
2022/07/07 Python