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实现QQ游戏大家来找茬辅助工具
Sep 14 Python
Python的collections模块中namedtuple结构使用示例
Jul 07 Python
解决python2.7 查询mysql时出现中文乱码
Oct 09 Python
数据清洗--DataFrame中的空值处理方法
Jul 03 Python
Python开发最牛逼的IDE——pycharm
Aug 01 Python
python tornado微信开发入门代码
Aug 24 Python
python查看模块,对象的函数方法
Oct 16 Python
详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)
Aug 02 Python
解决Python计算矩阵乘向量,矩阵乘实数的一些小错误
Aug 26 Python
关于pytorch处理类别不平衡的问题
Dec 31 Python
django model通过字典更新数据实例
Apr 01 Python
对Keras自带Loss Function的深入研究
May 25 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中imagick函数的中文解释
2015/01/21 PHP
php简单操作mysql数据库的类
2015/04/16 PHP
Laravel框架实现的批量删除功能示例
2019/01/16 PHP
jQuery插件的写法分享
2013/06/12 Javascript
同一个网页中实现多个JavaScript特效的方法
2015/02/02 Javascript
JQuery.Ajax()的data参数类型实例详解
2015/11/20 Javascript
创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件
2016/06/02 Javascript
浅谈关于axios和session的一些事
2017/07/13 Javascript
浅析Node.js非对称加密方法
2018/01/29 Javascript
在element-ui的el-tree组件中用render函数生成el-button的实例代码
2018/11/05 Javascript
javascript实现动态时钟的启动和停止
2020/07/29 Javascript
vue实现路由懒加载的3种方法示例
2020/09/01 Javascript
Vue使用路由钩子拦截器beforeEach和afterEach监听路由
2020/11/16 Javascript
[01:03:36]Ti4 循环赛第三日DK vs Titan
2014/07/12 DOTA
[02:56]《DAC最前线》之国外战队抵达上海备战亚洲邀请赛
2015/01/28 DOTA
python进阶教程之循环对象
2014/08/30 Python
Win7下搭建python开发环境图文教程(安装Python、pip、解释器)
2016/05/17 Python
Python基础学习之常见的内建函数整理
2017/09/06 Python
Pycharm新手教程(只需要看这篇就够了)
2019/06/18 Python
基于python 微信小程序之获取已存在模板消息列表
2019/08/05 Python
wxPython实现文本框基础组件
2019/11/18 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
2020/03/30 Python
解决Python Matplotlib绘图数据点位置错乱问题
2020/05/16 Python
Python文件操作模拟用户登陆代码实例
2020/06/09 Python
Django自定义YamlField实现过程解析
2020/11/11 Python
python 实现超级玛丽游戏
2020/11/25 Python
css3 box-sizing属性使用参考指南
2013/01/08 HTML / CSS
html5 web本地存储将取代我们的cookie
2012/12/26 HTML / CSS
C#公司笔试题
2014/03/28 面试题
接口可以包含哪些成员
2012/09/30 面试题
80后职场人的职业生涯规划
2014/03/08 职场文书
工作推荐信范文
2014/05/10 职场文书
优秀学生干部事迹材料
2014/12/24 职场文书
pytest进阶教程之fixture函数详解
2021/03/29 Python
Python编程根据字典列表相同键的值进行合并
2021/10/05 Python
【海涛教你打DOTA】剑圣第一人称视角解说
2022/04/01 DOTA