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中的包和模块实例
Nov 22 Python
python使用multiprocessing模块实现带回调函数的异步调用方法
Apr 18 Python
Python工程师面试题 与Python基础语法相关
Jan 14 Python
浅谈numpy数组的几种排序方式
Dec 15 Python
python实现聚类算法原理
Feb 12 Python
解读python如何实现决策树算法
Oct 11 Python
Python时间和字符串转换操作实例分析
Mar 16 Python
pycharm访问mysql数据库的方法步骤
Jun 18 Python
Python sublime安装及配置过程详解
Jun 29 Python
Python面向对象多态实现原理及代码实例
Sep 16 Python
详解Python中list[::-1]的几种用法
Nov 16 Python
Python中 range | np.arange | np.linspace三者的区别
Mar 22 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图像处理之imagecreate、imagedestroy函数介绍
2014/11/19 PHP
Yii使用Captcha验证码的方法
2015/12/28 PHP
实例讲解php数据访问
2016/05/09 PHP
PHP实现使用DOM将XML数据存入数组的方法示例
2017/09/27 PHP
JS动画效果代码3
2008/04/03 Javascript
javaScript call 函数的用法说明
2010/04/09 Javascript
深入剖析JavaScript中的枚举功能
2014/03/06 Javascript
extjs 分页使用jsp传递数据示例
2014/07/29 Javascript
jquery实现页面关键词高亮显示的方法
2015/03/12 Javascript
Jquery中基本选择器用法实例详解
2015/05/18 Javascript
理解JS事件循环
2016/01/07 Javascript
jQuery中show与hide方法用法示例
2016/09/16 Javascript
js实现各种复制到剪贴板的方法(分享)
2016/10/27 Javascript
基于JavaScript实现窗口拖动效果
2017/01/18 Javascript
简单的三步vuex入门
2018/05/20 Javascript
JS实现的碰撞检测与周期移动完整示例
2019/09/02 Javascript
Vue 中 filter 与 computed 的区别与用法解析
2019/11/21 Javascript
python函数返回多个值的示例方法
2013/12/04 Python
python打开文件并获取文件相关属性的方法
2015/04/23 Python
python正则表达式面试题解答
2020/04/28 Python
关于python写入文件自动换行的问题
2018/06/23 Python
对python实现合并两个排序链表的方法详解
2019/01/23 Python
Python第三方库face_recognition在windows上的安装过程
2019/05/03 Python
python实现获取单向链表倒数第k个结点的值示例
2019/10/24 Python
在Python中等距取出一个数组其中n个数的实现方式
2019/11/27 Python
关于tf.reverse_sequence()简述
2020/01/20 Python
flask 框架操作MySQL数据库简单示例
2020/02/02 Python
html5利用canvas绘画二级树形结构图的示例
2017/09/27 HTML / CSS
HTML5 canvas基本绘图之填充样式实现
2016/06/27 HTML / CSS
酒店led欢迎词
2014/01/09 职场文书
乡文化站暑期培训方案
2014/08/28 职场文书
学生顶撞老师的检讨书
2014/09/17 职场文书
校园安全广播稿范文
2014/09/25 职场文书
《敬重卑微》读后感3篇
2019/11/26 职场文书
详解jQuery的核心函数和事件处理
2022/02/18 jQuery
Django数据库(SQlite)基本入门使用教程
2022/07/07 Python