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的Tornado框架异步编程入门实例
Apr 24 Python
使用Python压缩和解压缩zip文件的教程
May 06 Python
Python实现针对给定字符串寻找最长非重复子串的方法
Apr 21 Python
基于windows下pip安装python模块时报错总结
Jun 12 Python
python3实现zabbix告警推送钉钉的示例
Feb 20 Python
python绘制已知点的坐标的直线实例
Jul 04 Python
Python爬取破解无线网络wifi密码过程解析
Sep 17 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
Dec 12 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
Mar 16 Python
Python网络爬虫四大选择器用法原理总结
Jun 01 Python
Django debug为True时,css加载失败的解决方案
Apr 24 Python
Python制作动态字符画的源码
Aug 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 Token(令牌)设计
2008/03/15 PHP
JS 网站性能优化笔记
2011/05/24 PHP
页面乱码问题的根源及其分析
2013/08/09 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
2016/11/02 PHP
phalcon model在插入或更新时会自动验证非空字段的解决办法
2016/12/29 PHP
safari下载文件自动加了html后缀问题
2018/11/09 PHP
jquery二级导航内容均分的原理及实现
2013/08/13 Javascript
js几秒以后倒计时跳转示例
2013/12/26 Javascript
Javascript 按位左移运算符使用介绍(
2014/02/04 Javascript
jquery xMarquee实现文字水平无缝滚动效果
2014/04/29 Javascript
简介AngularJS的视图功能应用
2015/06/17 Javascript
SpringMVC restful 注解之@RequestBody进行json与object转换
2015/12/10 Javascript
javascript新闻跑马灯实例代码
2020/07/29 Javascript
javascript基础知识分享之类与函数化
2016/02/13 Javascript
详解JavaScript中的事件流和事件处理程序
2016/05/20 Javascript
Vue.js使用v-show和v-if的注意事项
2016/12/13 Javascript
JS正则表达式之非捕获分组用法实例分析
2016/12/28 Javascript
JavaScript中 this 指向问题深度解析
2017/02/21 Javascript
JavaScript实现职责链模式概述
2018/01/25 Javascript
用vscode开发vue应用的方法步骤
2019/05/06 Javascript
python时间整形转标准格式的示例分享
2014/02/14 Python
python局域网ip扫描示例分享
2014/04/03 Python
Python运算符重载用法实例
2015/05/28 Python
python爬虫headers设置后无效的解决方法
2017/10/21 Python
python opencv实现运动检测
2018/07/10 Python
python实现全排列代码(回溯、深度优先搜索)
2020/02/26 Python
jupyternotebook 撤销删除的操作方式
2020/04/17 Python
python利用paramiko实现交换机巡检的示例
2020/09/22 Python
Html5 canvas画图白板踩坑
2020/06/01 HTML / CSS
军训自我鉴定
2013/12/14 职场文书
出纳员岗位职责风险
2014/03/06 职场文书
经典禁毒标语
2014/06/16 职场文书
幼儿园小班教育随笔
2015/08/14 职场文书
学生会部长竞选稿
2015/11/19 职场文书
导游词之宁夏贺兰山岩画
2019/11/08 职场文书
python编程学习使用管道Pipe编写优化代码
2021/11/20 Python