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执行时间的计算方法小结
Mar 17 Python
python re模块findall()函数实例解析
Jan 19 Python
python中(str,list,tuple)基础知识汇总
Feb 20 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
Jul 18 Python
使用k8s部署Django项目的方法步骤
Jan 14 Python
Pandas库之DataFrame使用的学习笔记
Jun 21 Python
Python3中的最大整数和最大浮点数实例
Jul 09 Python
Tensorflow Summary用法学习笔记
Jan 10 Python
Python3 读取Word文件方式
Feb 13 Python
python中数据库like模糊查询方式
Mar 02 Python
python + selenium 刷B站播放量的实例代码
Jun 12 Python
python自动化发送邮件实例讲解
Jan 04 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 preg_match_all结合str_replace替换内容中所有img
2008/10/11 PHP
解析PHP跨站刷票的实现代码
2013/06/18 PHP
使用phpQuery采集网页的方法
2013/11/13 PHP
php socket客户端及服务器端应用实例
2014/07/04 PHP
Yii核心组件AssetManager原理分析
2014/12/02 PHP
jquery写个checkbox——类似邮箱全选功能
2013/03/19 Javascript
动态加载js、css等文件跨iframe实现
2014/02/24 Javascript
Js实现动态添加删除Table行示例
2014/04/14 Javascript
js操作输入框中选择内容兼容IE及其他主流浏览器
2014/04/22 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
2014/05/28 Javascript
jquery实现的代替传统checkbox样式插件
2015/06/19 Javascript
jquery结婚电子请柬特效源码分享
2015/08/21 Javascript
layui导航栏实现代码
2017/05/19 Javascript
详解关于JSON.parse()和JSON.stringify()的性能小测试
2019/03/14 Javascript
vue-cli中使用高德地图的方法示例
2019/03/28 Javascript
[09:33]2015国际邀请赛第四日TOP10
2015/08/08 DOTA
跟老齐学Python之编写类之四再论继承
2014/10/11 Python
Python 查看文件的读写权限方法
2018/01/23 Python
java中两个byte数组实现合并的示例
2018/05/09 Python
Django中的ajax请求
2018/10/19 Python
Python实现查找最小的k个数示例【两种解法】
2019/01/08 Python
kafka-python 获取topic lag值方式
2019/12/23 Python
Python定义函数实现累计求和操作
2020/05/03 Python
浅谈Python 钉钉报警必备知识系统讲解
2020/08/17 Python
解决Python 写文件报错TypeError的问题
2020/10/23 Python
纯CSS实现的大小渐变、渐远效果
2014/04/15 HTML / CSS
日常奢侈品,轻松购物:Verishop
2019/08/20 全球购物
VC++笔试题
2014/10/13 面试题
LINUX下线程,GDI类的解释
2012/04/17 面试题
教师师德教育的自我评价
2013/10/31 职场文书
写给女生的道歉信
2014/01/08 职场文书
工人先锋号事迹材料
2014/12/24 职场文书
创卫工作总结2015
2015/04/22 职场文书
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
2021/06/21 Java/Android
Linux中各个目录的作用与内容
2022/06/28 Servers