欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python實(shí)現(xiàn)的簡(jiǎn)單文件傳輸服務(wù)器和客戶端

 更新時(shí)間:2015年04月08日 08:51:27   投稿:junjie  
這篇文章主要介紹了Python實(shí)現(xiàn)的簡(jiǎn)單文件傳輸服務(wù)器和客戶端,本文直接給出Server和Client端的實(shí)現(xiàn)代碼,需要的朋友可以參考下

還是那個(gè)題目(題目和流程見(jiàn)java版本),感覺(jué)光用java寫一點(diǎn)新意也沒(méi)有,恰巧剛學(xué)習(xí)了python,何不拿來(lái)一用,呵呵:
服務(wù)器端:

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()       


說(shuō)明:
line-55到line-58的作用就相當(dāng)于java中某個(gè)類里面的main函數(shù),即一個(gè)類的入口。
python中SocketServer module里提供了好多實(shí)用的現(xiàn)成的類,BaseRequestHandler就是一個(gè),它的作用是為每一個(gè)請(qǐng)求fork一個(gè)線程,只要繼承它,就有這個(gè)能力了,哈哈,真是美事。
當(dāng)然,我們繼承了BaseRequestHandler,就是override它的handle方法,就像java中繼承了Thread后要實(shí)現(xiàn)run方法一樣。實(shí)際上這個(gè)handle方法的內(nèi)容和我們的java版本的run函數(shù)實(shí)現(xiàn)的完全一樣。
line-30到line-43就是處理文件下載的主要內(nèi)容了??粗纪ρ凼斓暮牵海?br /> 這里在文件發(fā)送完后發(fā)了一個(gè)“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”信號(hào)后,就知道文件傳完了。
最后需要說(shuō)明一下python的文件,由于是內(nèi)置類型,所以不想java那樣有那么多的reader,writer,input,ouput啊。python中,在打開(kāi)或建立一個(gè)文件時(shí),主要是通過(guò)模式(mode)來(lái)區(qū)別的。
python的網(wǎng)絡(luò)編程確實(shí)簡(jiǎn)單,因?yàn)樗峁┝烁鞣N功能的已經(jīng)寫好的類,直接繼承就Ok了。
python還在學(xué)習(xí)中,上面的例子跑通是沒(méi)問(wèn)題,但寫得肯定不夠好,還得學(xué)習(xí)啊

相關(guān)文章

  • Python實(shí)現(xiàn)將JSON格式文件導(dǎo)入redis

    Python實(shí)現(xiàn)將JSON格式文件導(dǎo)入redis

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)將JSON格式文件導(dǎo)入redis的多種方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-01-01
  • 使用pycharm設(shè)置控制臺(tái)不換行的操作方法

    使用pycharm設(shè)置控制臺(tái)不換行的操作方法

    今天小編就為大家分享一篇使用pycharm設(shè)置控制臺(tái)不換行的操作方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • Python譜減法語(yǔ)音降噪實(shí)例

    Python譜減法語(yǔ)音降噪實(shí)例

    今天小編就為大家分享一篇Python譜減法語(yǔ)音降噪實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • 詳細(xì)解讀Python字符串的使用與f-string

    詳細(xì)解讀Python字符串的使用與f-string

    這篇文章主要介紹了詳細(xì)解讀Python字符串的使用與f-string,在?Python?中,引號(hào)內(nèi)的任何內(nèi)容都是字符串,但是字符串也有很多的用法,需要的朋友一起來(lái)看看吧
    2023-04-04
  • Python的Flask站點(diǎn)中集成xhEditor文本編輯器的教程

    Python的Flask站點(diǎn)中集成xhEditor文本編輯器的教程

    xhEditor是基于jQuery的Web端文本編輯器,基本的圖片上傳等功能也都帶有,這里我們就來(lái)看一下Python的Flask站點(diǎn)中集成xhEditor文本編輯器的教程
    2016-06-06
  • Python中requests.session()的用法小結(jié)

    Python中requests.session()的用法小結(jié)

    這篇文章主要介紹了Python中requests.session()的用法小結(jié),可能大家對(duì)?session?已經(jīng)比較熟悉了,也大概了解了session的機(jī)制和原理,但是我們?cè)谧雠老x(chóng)時(shí)如何會(huì)運(yùn)用到session呢,接下來(lái)要講到會(huì)話保持,需要的朋友可以參考下
    2022-11-11
  • python生成xml時(shí)規(guī)定dtd實(shí)例方法

    python生成xml時(shí)規(guī)定dtd實(shí)例方法

    在本篇文章里小編給大家整理的是關(guān)于python生成xml時(shí)規(guī)定dtd實(shí)例方法,需要的朋友們學(xué)習(xí)參考下。
    2020-09-09
  • Python中的數(shù)據(jù)分析詳解

    Python中的數(shù)據(jù)分析詳解

    這篇文章主要介紹了Python中的數(shù)據(jù)分析詳解,對(duì)數(shù)據(jù)進(jìn)行分析,數(shù)據(jù)分析是指根據(jù)分析目的,用適當(dāng)?shù)慕y(tǒng)計(jì)分析方法及工具,對(duì)收集來(lái)的數(shù)據(jù)進(jìn)行處理與分析,提取有價(jià)值的信息,發(fā)揮數(shù)據(jù)的作用,需要的朋友可以參考下
    2023-07-07
  • Django自定義User模型、認(rèn)證、權(quán)限控制的操作

    Django自定義User模型、認(rèn)證、權(quán)限控制的操作

    這篇文章主要介紹了Django自定義User模型、認(rèn)證、權(quán)限控制的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Python中的變量和數(shù)據(jù)類型詳情

    Python中的變量和數(shù)據(jù)類型詳情

    這篇文章主要介紹了Python中的變量和數(shù)據(jù)類型詳情,變量不需要聲明即可使用,向變量賦值即定義變量,python中的數(shù)據(jù)類型包括數(shù)值類型、列表、元組等內(nèi)容,下面文章的詳細(xì)介紹,需要的小伙伴可以參考一下
    2022-03-03

最新評(píng)論