设为首页 收藏本站
查看: 745|回复: 0

[经验分享] 用python实现的简单Server/Client文件传输

[复制链接]
发表于 2017-5-4 06:58:03 | 显示全部楼层 |阅读模式
  还是那个题目(题目和流程见java版本),感觉光用java写一点新意也没有,恰巧刚学习了python,何不拿来一用,呵呵:
  服务器端:
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文件传完了。
  客户端:
python 代码

  • 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还在学习中,上面的例子跑通是没问题,但写得肯定不够好,还得学习啊

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-372674-1-1.html 上篇帖子: python是个什么东西---python---py2exe打包后屏蔽控制台 下篇帖子: Python学习笔记二(String字符串操作)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表