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内置数据结构与操作符的练习题集锦
Jul 01 Python
Python中音频处理库pydub的使用教程
Jun 07 Python
利用python编写一个图片主色转换的脚本
Dec 07 Python
一行代码让 Python 的运行速度提高100倍
Oct 08 Python
Python中正则表达式的用法总结
Feb 22 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
Jun 04 Python
对python 调用类属性的方法详解
Jul 02 Python
详解python tkinter模块安装过程
Jan 06 Python
DjangoWeb使用Datatable进行后端分页的实现
May 18 Python
几款好用的python工具库(小结)
Oct 20 Python
Matlab如何实现矩阵复制扩充
Jun 02 Python
聊聊基于pytorch实现Resnet对本地数据集的训练问题
Mar 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
Discuz板块横排显示图片的实现方法
2007/05/28 PHP
php trim 去除空字符的定义与语法介绍
2010/05/31 PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
2014/05/10 PHP
PHP实现获取中英文首字母
2015/06/19 PHP
php实现word转html的方法
2016/01/22 PHP
编写针对IE的JS代码两种编写方法
2013/01/30 Javascript
解决javascript:window.close()在chrome,Firefox下失效的问题
2013/05/07 Javascript
div失去焦点事件实现思路
2014/04/22 Javascript
JavaScript中string转换成number介绍
2014/12/31 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
JS+JSP通过img标签调用实现静态页面访问次数统计的方法
2015/12/14 Javascript
javascript实现保留两位小数的多种方法
2015/12/18 Javascript
javascript实现九宫格相加数值相等
2020/05/28 Javascript
js表单元素checked、radio被选中的几种方法(详解)
2016/08/22 Javascript
AJAX和jQuery动态加载数据的实现方法
2016/12/05 Javascript
快速实现JS图片懒加载(可视区域加载)示例代码
2017/01/04 Javascript
Node.js 实现简单的无侵入式缓存框架的方法
2019/07/21 Javascript
JavaScript对象原型链原理详解
2020/02/05 Javascript
JS实现百度搜索框关键字推荐
2020/02/17 Javascript
vue 调用 RESTful风格接口操作
2020/08/11 Javascript
js实现简单的点名器随机色实例代码
2020/09/20 Javascript
JS如何实现在弹出窗口中加载页面
2020/12/03 Javascript
centos下更新Python版本的步骤
2013/02/12 Python
Python机器学习logistic回归代码解析
2018/01/17 Python
python负载均衡的简单实现方法
2018/02/04 Python
python random从集合中随机选择元素的方法
2019/01/23 Python
python实现的自动发送消息功能详解
2019/08/15 Python
python中round函数如何使用
2020/06/19 Python
python opencv实现图像配准与比较
2021/02/09 Python
使用CSS3的::selection改变选中文本颜色的方法
2015/09/29 HTML / CSS
机电专业个人自荐信格式模板
2013/09/23 职场文书
我们的节日端午节活动方案
2014/03/02 职场文书
禁毒宣传标语
2014/06/19 职场文书
导游词之徐州云龙湖
2019/11/19 职场文书
深度学习详解之初试机器学习
2021/04/14 Python
SONY AN-LP1 短波有源天线放大器
2021/04/22 无线电