Python实现的简单文件传输服务器和客户端

还是那个题目(题目和流程见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还在学习中,上面的例子跑通是没问题,但写得肯定不够好,还得学习啊

(0)

相关推荐

  • python 从远程服务器下载日志文件的程序

    复制代码 代码如下: import osimport sysimport ftplibimport socket ################################################################### sign in the ftp server and download the log file. # 登陆生产服务器下载日志##############################################################

  • Python实现向服务器请求压缩数据及解压缩数据的方法示例

    本文实例讲述了Python实现向服务器请求压缩数据及解压缩数据的方法.分享给大家供大家参考,具体如下: 向服务器请求压缩数据格式,并解压缩数据 #!/usr/bin/env python # encoding=utf-8 import urllib2, httplib def writeFile(fname, data): f = open(fname, "w") f.write(data) f.close() if __name__ == '__main__': httplib.HT

  • Python压缩和解压缩zip文件

    zip文件是我们经常使用的打包格式之一,python解压和压缩zip效率非凡. python解压zip文档: 复制代码 代码如下: #/usr/bin/python #coding=utf-8 import os,sys,time import zipfile filename = 'callofdutyblackopszombies_1349649132343_my.zip'  #要解压的文件 filedir = 'data/'  #解压后放入的目录 r = zipfile.is_zipfil

  • python实现的文件同步服务器实例

    本文实例讲述了python实现的文件同步服务器.分享给大家供大家参考.具体实现方法如下: 服务端使用asyncore, 收到文件后保存到本地. 客户端使用pyinotify监视目录的变化 ,把变动的文件发送到服务端. 重点: 1. 使用structs打包发送文件的信息,服务端收到后,根据文件信息来接收客户端传送过来的文件. 2. 客户端使用多线程,pyinotify监视到文件变化,放到队列中,由另外一个线程发送. 上代码: 服务端: # receive file from client and

  • python连接远程ftp服务器并列出目录下文件的方法

    本文实例讲述了python连接远程ftp服务器并列出目录下文件的方法.分享给大家供大家参考.具体如下: 这段python代码用到了pysftp模块,使用sftp协议,对数据进行加密传输 import pysftp srv = pysftp.Connection(host="your_FTP_server", username="your_username",password="your_password") # Get the directory

  • Python压缩解压缩zip文件及破解zip文件密码的方法

    python 的 zipfile 提供了非常便捷的方法来压缩和解压 zip 文件. 例如,在py脚本所在目录中,有如下文件: readability/readability.js readability/readability.txt readability/readability-print.css readability/sprite-readability.png readability/readability.css 将 readability 目录中的文件压缩到脚本所在目录的 read

  • 使用nodejs、Python写的一个简易HTTP静态文件服务器

    日常开发过程中,我们经常需要修改一些放在 CDN 上的静态文件(如 JavaScript.CSS.HTML 文件等),这个过程中,我们希望能有一种方式将线上 CDN 的目录映射为本地硬盘上的某个目录,这样,当我们在本地修改了某个文件时,不需要发布,刷新后马上能看到效果. 比如,我们的 CDN 域名是:http://a.mycdn.com,本地对应的目录是:D:\workassets,我们希望所有对 http://a.mycdn.com/* 的访问被映射到本地的 D:\workassets\* 下

  • python实现获取客户机上指定文件并传输到服务器的方法

    本文实例讲述了python实现获取客户机上指定文件并传输到服务器的方法.分享给大家供大家参考.具体分析如下: 该程序实现了,把目标机器的某个目录(可控)的所有的某种类型文件(可控)全部获取并传到己方的机器上. 1.用了base64的encode(infile,outfile)加密,以及decode(infile,outfile)解密,这是2进制加密解密 2.用zip压缩 3.socket中server.py放到自己这方python server.py,然后client.py放到目标机器,然后py

  • python服务器端收发请求的实现代码

    最近学习了python的一些服务器端编程,记录在此. 发送get/post请求 # coding:utf-8 import httplib,urllib #加载模块 #urllib可以打开网站去拿 #res = urllib.urlopen('http://baidu.com'); #print res.headers #定义需要进行发送的数据 params = urllib.urlencode({'param':'6'}); #定义一些文件头 headers = {"Content-Type&

  • python实现从ftp服务器下载文件的方法

    本文实例讲述了python实现从ftp服务器下载文件的方法.分享给大家供大家参考.具体实现方法如下: import ftplib ftp = ftblib.FTP("ftp.yourServer.com") ftp.login("username","password") filename = "index.html" ftp.storlines("STOR "+filename,open(filename

随机推荐