文章目录

  • 1. 动态导入模块
  • 2. socket 进阶

1. 动态导入模块

文件目录如下:

aa.py 文件中:

class C(object):def __init__(self):self.name = 'yle'

现在 ‘动态导入模块.py’ 中导入 aa.py

import importlibaa = importlib.import_module('lib.aa')print(aa.C().name)

2. socket 进阶

例1:一个执行命令行通信的简易程序如下:

服务端:

import socket,os,timeserver = socket.socket()server.bind(('localhost',9999))server.listen()while True:conn,addr = server.accept()print('new conn',addr)while True:print('等待新指令')data = conn.recv(1024)if not data:print('客户端已断开')breakprint('执行指令:',data)cmd_res = os.popen(data.decode()).read() #接受字符串,执行结果也是字符串print('before send',len(cmd_res))if len(cmd_res) == 0:cmd_res = 'cmd has no output...'conn.send(str(len(cmd_res.encode())).encode('utf-8'))    #先发大小给客户端#time.sleep(0.5) #因为两条发送命令放一起,有可能发送 粘包,但会影响程序效率client_ack = conn.recv(1024) #wait client to confirm ,用这条指令来代替 sleepprint('ack from client:',client_ack.decode('utf-8'))conn.send(cmd_res.encode('utf-8'))print('send done')server.close()

客户端:

import socketclient = socket.socket()client.connect(('localhost',9999))while True:cmd = input('>>:').strip()if len(cmd) == 0:continueclient.send(cmd.encode('utf-8'))cmd_res_size = client.recv(1024) #接受命令结果的长度,byte类型print('命令结果大小:',cmd_res_size)client.send('准备好接收了,loser可以发了'.encode('utf-8')) #用于客户端的 client_ack接收received_size = 0received_data = b''while received_size < int(cmd_res_size.decode()):data = client.recv(1024)received_size += len(data) #每次收到的数据有可能小于1024,所以要用len#print(data.decode())received_data += dataelse:print('cmd res receive done...',received_size)print(received_data.decode())#print(cmd_res.decode())client.close()

运行效果:
服务端:

客户端:

例2:使用 get filename 命令传输文件与文件的 md5 加密信息

服务端:

import socket,os,time,hashlibserver = socket.socket()server.bind(('localhost',9999))server.listen()while True:conn,addr = server.accept()print('new conn',addr)while True:print('等待新指令')data = conn.recv(1024)if not data:print('客户端已断开')breakcmd,filename = data.decode().split() #默认按空格分割print('filename:',filename)if os.path.isfile(filename):m = hashlib.md5()with open(filename,'rb') as f:file_size = os.stat(filename).st_sizeconn.send( str(file_size).encode() ) #send file sizeconn.recv(1024) #wait for ackfor line in f:m.update(line)conn.send(line)print('file md5',m.hexdigest())conn.send(m.hexdigest().encode())print('send done')server.close()

客户端:

import socket,hashlibclient = socket.socket()client.connect(('localhost',9999))while True:cmd = input('>>:').strip()if len(cmd) == 0:continueif cmd.startswith('get'):client.send(cmd.encode())server_response = client.recv(1024)print('server response:',server_response)client.send(b'ready to recv file')file_totle_size = int(server_response.decode())received_size = 0filename = cmd.split()[1]f = open(filename + '.new','wb')m = hashlib.md5()while received_size < file_totle_size:#防止粘包问题if file_totle_size - received_size > 1024:  #要收不止一次size = 1024else:   #最后一次剩多少收多少size = file_totle_size - received_sizedata = client.recv(size)received_size += len(data)m.update(data)f.write(data)#print(file_totle_size,received_size)else:new_file_md5 = m.hexdigest()print('file recv done',received_size,file_totle_size)f.close()server_file_md5 = client.recv(1024)print('server file md5',server_file_md5)print('client file md5',new_file_md5)client.close()

socket 实现多并发通信:

服务端:

import socketserverclass MyTCPHandler(socketserver.BaseRequestHandler):def handle(self):while True:try:self.data = self.request.recv(1024).strip()print('{} wrote:'.format(self.client_address[0]))print(self.data)self.request.send(self.data.upper())except ConnectionResetError as e:print('err',e)breakif __name__ == '__main__':HOST,PORT = 'localhost',9999server = socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler)server.serve_forever()

例:模拟 tcp 实现文件上传功能:
服务端:

import socketserver,json,osclass MyTCPHandler(socketserver.BaseRequestHandler):def put(self,*args):'''接收客户端文件'''cmd_dic = args[0]filename = cmd_dic['filename']filesize = cmd_dic['size']if os.path.isfile(filename):f = open(filename + '.new','wb')else:f = open(filename,'wb')self.request.send(b'200 ok')received_size = 0while received_size < filesize:data = self.request.recv(1024)f.write(data)received_size += len(data)else:print('file [%s] has uploaded...'%filename)def handle(self):while True:try:self.data = self.request.recv(1024).strip()print('{} wrote:'.format(self.client_address[0]))print(self.data)cmd_dic = json.loads(self.data.decode())action = cmd_dic['action']if hasattr(self,action):func = getattr(self,action)func(cmd_dic)self.request.send(self.data.upper())except ConnectionResetError as e:print('err',e)breakif __name__ == '__main__':HOST,PORT = 'localhost',9999server = socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler)server.serve_forever()

客户端:

import socket,os,jsonclass FtpClient(object):def __init__(self):self.client = socket.socket()def help(self):msg = '''lscd../..get filenameput filename'''def connect(self,ip,port):self.client.connect((ip, port))def interactive(self):#self.authenticate()  登陆验证while True:cmd = input('>>:')if len(cmd) == 0:continuecmd_str = cmd.split()[0]if hasattr(self,'cmd_%s'%cmd_str):func = getattr(self,'cmd_%s'%cmd_str)func(cmd)else:self.help()def cmd_put(self,*args):cmd_split = args[0].split()if len(cmd_split) > 1:filename = cmd_split[1]if os.path.isfile(filename):filesize = os.stat(filename).st_sizemsg_dic = {'action':'put','filename':filename,'size':filesize,'overtiden':True}self.client.send( json.dumps(msg_dic).encode('utf-8') )#防止粘包,等服务器确认server_response = self.recv(1024)f = open(filename,'rb')for line in f:self.client.send(line)else:print('file upload sucess...')f.close()else:print(filename,'is not exist')def cmd_get(self):passftp = FtpClient()
ftp.connect(('localhost',9999))
ftp.interactive()

day8 动态导入模块、socket进阶相关推荐

  1. Python Day26:多态、封装、内置函数:__str__、__del__、反射(反省)、动态导入模块...

    ## 多态 ```python OOP中标准解释:多个不同类型对象,可以响应同一个方法,并产生不同结果,即为多态 多态好处:只要知道基类使用方法即可,不需要关心具体哪一个类的对象实现的,以不变应万变, ...

  2. python动态导入检查是否存在_python动态导入模块、检查模块是否安装

    一 动态导入模块 Python的import不能接受变量,所以应该用 __import__函数来动态导入. 如下的代码无法正常导入模块 modules = ['OpenSSL', 'Crypto', ...

  3. python五十一:动态导入模块,通过字符串导入模块

    目录结构如下: # 动态导入模块方式一: byd = __import__("car.BYD") # 返回的是最顶层的模块print(byd)# byd.run() byd.BYD ...

  4. python 动态导入类_从动态导入模块中类的字符串名动态实例化?

    tl:博士 使用importlib.import_module导入根模块,并使用getattr函数按名称加载类:# Standard import import importlib # Load &q ...

  5. Python3 动态导入模块的两种方式

    动态导入模块就是只知道str类型的模块名字符串,通过这个字符串导入模块 需要导入的模块: class Ccc(object):def __init__(self,name):self.name=nam ...

  6. 动态导入模块__import__(str) importlib标准库

    解释器内部使用的为__import__('str') #!/usr/bin/env python # Author:Zhangmingdaprint('我是aa类 ') #被import的时候就执行c ...

  7. delstr函数python_Python Day26:多态、封装、内置函数:__str__、__del__、反射(反省)、动态导入模块...

    ## 多态 ```python OOP中标准解释:多个不同类型对象,可以响应同一个方法,并产生不同结果,即为多态 多态好处:只要知道基类使用方法即可,不需要关心具体哪一个类的对象实现的, 以不变应万变 ...

  8. python动态导入模块_Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析...

    本文实例讲述了Python动态导入模块:__import__.importlib.动态导入的使用场景.分享给大家供大家参考,具体如下: 相关内容: __import__ importlib 动态导入的 ...

  9. python动态调用自定义模块_python importlib动态导入模块 reload重载模块

    阅读目录 一般而言,当我们需要某些功能的模块时(无论是内置模块或自定义功能的模块),可以通过import module 或者 from * import module的方式导入,这属于静态导入,很容易 ...

最新文章

  1. MSDN 教程短片 WPF 16(Path路径)
  2. html5 input required oninvalid,为什么我的“ oninvalid”属性会让模式失败?
  3. python查找元素的下标 leetcode 392
  4. Linq to xml 示例分析
  5. pacs文件浏览工具_啥?网络攻击浏览器让你惊惶失措?这里教你防患未然
  6. visual studio输入法打不了中文_(四)让人纠结的双拼输入法,以及承载它的那些输入法们(下)...
  7. 手持终端的时候应该有数据线
  8. 如何基于Spring Boot搭建一个完整的项目
  9. matlab遗传算法工具箱及应用 pdf,MATLAB遗传算法工具箱及应用(雷英杰)
  10. plc控制伺服电机 四轴攻丝机案例 该程序为plc控制伺服电机的工程案例程序,包含伺服电机接线图,包含程序流程的详细解释说明
  11. python代码敲写英雄联盟排列
  12. 全国计算机技术与软件专业技术资格(水平)考试
  13. Make sure that `gem install libv8 -v '3.16.14.3'` succeeds before bundling.
  14. 7-FreeSwitch-mrcp-plugin-with-freeswitch(亲测可用,自我整理)
  15. 梦中香巴拉——云南游记
  16. 《汇编语言》第十章 call 和 ret 指令
  17. SharePoint 创建页面布局
  18. 利用先进先出原则统计易飞ERP呆滞库存
  19. Python 函数嵌套
  20. 日期计算器-java(含界面)

热门文章

  1. 收集的一些主流网站的GA代码
  2. DNS Serv管理与维护
  3. 什么?听说这四个概念,很多 Java 老手都说不清!
  4. 软件项目随着数据量的不断增加,有什么优化方案么?
  5. 面试官最想要的synchronized,你值得拥有
  6. 漫画谈一下Maven依赖,百分之90的同学不知道!
  7. Worktile完成新一轮融资,将发力研发管理赛道
  8. Excel数据拆分-分列
  9. ubuntu下使用串口调试终端minicom链接typec接口
  10. python随机森林筛选变量_变量重要性随机森林在R中是否有类似Python的rfpimp来分组共线变量...