socket解决多次输入问题-大数据接收问题-模块动态导入

客户端 多次接收发送数据

  1. socket中客户端多次接收发送数据;
  2. 服务端增加while循环,可以设置死循环,也可以设置次数;
  3. 大数据接收,可以通过循环累计后一次发送;
python 复制代码
#服务器端代码
import os
import socket

server=socket.socket()
server.bind(('localhost',7265)) #绑定需要监听的port
server.listen() #监听
while True:
    print("等待信息过来")
    conn,addr=server.accept() #等待信息发过来
    print(conn,addr)
    while True:   #数据多次发送接收
        print("msg is coming")
        data = conn.recv(1024)
        if not data:
            print("客户端已断开")
            break   #没有数据时可以跳出循环继续输出命令
        print("执行~~",data)
        cmd_res = os.popen(data.decode()).read() #接收命令在后台调用cmd命令,在控制台输出的标准输出
        if len(cmd_res) == 0:
            cmd_res = "cmd has no output..."
        conn.send(str(len(cmd_res.encode())).encode("utf-8"))  # 先发大小给客户端
        conn.send(cmd_res.encode("utf-8")) #再将数据解码后发送结果
        print("send over~~~")

server.close()
  1. 客户端代码:
python 复制代码
#客户端
import socket
client=socket.socket() #声明socket类型,以及生成连接对象
client.connect(('localhost',7265))

while True:  #while循环可持续发送
    cmd=input("请输入:").strip()
    if len(cmd)== 0: continue
    client.send(cmd.encode('utf-8')) #发送命令
    cmd_res_size=client.recv(1024)  #接收服务器结果的长度,大数据超过了1024
    print("命令结果大小:", cmd_res_size)#输出接收命令的大小
    received_size = 0  #初始化长度和数据
    received_data = b''
    while received_size < int(cmd_res_size.decode()):  #循环接收数据
        data=client.recv(1024)   #接收数据赋值到data
        received_size += len(data)  #接收数据大小循环累计
        received_data += data  #接收数据累计
    else:
        print('recv size:',received_size)   #统一一次发送
        print('recv data:',received_data.decode())

client.close()
  1. 结果展示:

模块动态导入

  1. 静态导入:import os,或者from lib import aa这种类型就是静态导入,这种情况如果没有导入程序就会报错,代码界面红色标记显示如图:----程序启动就预先找这个模块文件

  2. 动态导入:样式importlib.import_module('os')或者mod=__import__('os'),建议使用importlib.import_module('os')这种样式;----程序运行到这块时再去找这个模块文件

    需要测试的功能:

python 复制代码
__author__="ganfeimei"
class Cal:
    def __init__(self):
        self.name='ganfeimei'
        self.age=15
        print("begin~~~")
    def sum(self,a,b):
        return a+b

测试脚本:

python 复制代码
import importlib
module_name = "lib.aa"
try:
    mod=importlib.import_module(module_name)
    sum_result=mod.Cal().sum(3,5)
    print(sum_result)
except ModuleNotFoundError:
    print(f"没有找到模块{module_name},请检查配置")

finally:
    print("end~~")

测试结果:

  1. 设置没有这个模块名师:如图
相关推荐
用户3126874877201 小时前
ReentrantLock 和 synchronized 到底选哪个?源码级对比与选型
java
计算机毕设定制辅导-无忧学长1 小时前
基于Spring Boot的玄幻小说个性化推荐平台设计与实现
java·vue.js·spring boot·后端·mysql·推荐算法
码路漫漫1 小时前
LRU 真的能解决日志按业务 Key 分文件的落地瓶颈吗?
java·后端
带刺的坐椅1 小时前
不只是 Token 流:Solon AI 4.1 的语义化聊天事件
java·stream·event·solon-ai
延凡科技2 小时前
建筑节能新视角:智慧冷站的数字化实践
java·人工智能·能源·暖通
励志不掉头发的内向程序员2 小时前
【LibreCAD 2D架构】从鼠标点击到图形创建:RS_ActionDrawLine交互流程与状态机解析
开发语言·c++·qt·学习·系统架构·计算机外设·交互
www_aiyuanma_vip2 小时前
Java个人博客系统
java·开发语言
leoZ2312 小时前
第 7 篇:进阶——校验、联动、列表页
开发语言·前端·javascript·vue.js·人工智能·目标检测·ecmascript
秋名RG2 小时前
Java 集合框架完全指南:从核心接口到 JDK 21 有序集合新特性
java·windows