@以字符串名称形式引入外部模块:同级文件lib里面有个函数a打印66

1.解释器内部使用

m=__import__('lib')
print(m.a())

结果:

66

None

  1. 官方推荐用户使用

import importlib
m=importlib.import_module('lib')
print(m.a())

@类

F()()#执行类下面的__call__方法

__metaclass__暂时用不到

@@上周提到?

Fligh.status

Status.setter

Status.delter

__call__方法(没用过)

__mataclass__(没用过,以后可能用)

断言

@assert m is int#AssertionError

@ socket复习

博客里的Day7

@socket

tcp/ip  send, recv

udp

family address

AF.INET  ipv4

AF.INET6

AF.UNIX  。local

socket protocol type

sock.SOCK_STREAM  tcp/ip

socket.SOCK_DGRAM   数据报式socket , for UDP

服务端

server = socket.socket(AF.INET,sock.SOCK_STREAM)

server.bind(localhost,9999)

server.listen()

while True:

conn,addr = server.accept() #阻塞?

while True:

print("new conn",addr)

data = conn.recv(1024) #8192最多,1024的整数  #recv默认是阻塞的

if not data:

break #客户端已断开, conn.recv收到的就都是空数据,

print(data)

conn.send(data.upper())

@判断一条程序是否被执行了,前后都print一句话。

@@@socket实现简单的ssh客户端

博客园Day8

@b”xxx”,xxx必须是ASCII码里面的内容才能转,中文转不了。

@send的时候如果服务器端允许接受的小于客户端发送量,剩余的进入缓冲区,第二次发的时候不发新的,而先发缓冲区里面的。系统默认最多buffer就8k,缓冲区满了发、超时也发,send相当于强制超时。

@整数不能encode,需要先转成字符串。

@8-4中问题,直接看截图就行,主要是调试一下错误。

同样的代码在unix和windows里面不一样,问题原因:不应该直接判断文件长度(字符数),而应该先encode再判断多少byte。

@socket判断信息长度版

  1. client端

import socket
client=socket.socket()
client.connect(('localhost',9999))
while True:
    cmd=input('>>:').strip()
    if len(cmd)==0:continue
    client.send(cmd.encode('utf-8'))#必须是byte类型
    cmd_res_size=client.recv(1024)
    print("命令结果大小:",cmd_res_size)

client.send('准备好接受,可以发了'.encode('utf-8'))
    received_size=0
    received_data=b''
    while received_size<int(cmd_res_size.decode()):
        data=client.recv(1024)
        received_size+=len(data)#每次收到的有可能小于1024,用len判断
        received_data+=data
    else:
        print("cmd res receive done...",received_size)
        print(received_data.decode())

client.close()

ssh端

import socket,os
server=socket.socket()#实例化,默认不填参数
server.bind(('localhost',9999))
server.listen()
while True:
    conn,addr=server.accept()#conn是新的套接字对象,用来接收和发送数据。addr是连接客户端的地址。接收TCP 客户的连接(阻塞式)等待连接的到来
    print('new conn:',addr)
    while True:
        print('等待新指令')
        data=conn.recv(1024)
        if not data:
            print('客户端已断开')
            break
        print('执行指令:',data)
        cmd_res=os.popen(data.decode()).read()#接收了字符串,执行结果也是
        print('before send',len(cmd_res))
        if len(cmd_res)==0:
            cmd_res='none is output'#字符串前面加b就不能encode了
        conn.send(str(len(cmd_res.encode())).encode('utf-8'))

client_ack = conn.recv(1024)#等客户端回复,防止粘包
    conn.send(cmd_res.encode('utf-8'))#发送数据不可为空
    print('send done')
server.close()

@男生着装:优衣库、zara、HM、tiger鞋;

@socket 粘包,两块数据一起发,如两次send,系统会从缓冲区将两者并成一条发出去。

sleep(0.25)还是有可能粘住

@8-7-4-30’’

python-day8socket、粘包、并发、多用户ftp的更多相关文章

  1. Python之粘包

    Python之粘包 让我们基于tcp先制作一个远程执行命令的程序(1:执行错误命令 2:执行ls 3:执行ifconfig) 注意注意注意: res=subprocess.Popen(cmd.deco ...

  2. Python进阶----粘包,解决粘包(旗舰版)

    Python进阶----粘包,解决粘包(旗舰版) 一丶粘包 只有TCP有粘包现象,UDP永远不会粘包 什么是粘包     存在于客户端接收数据时,不能一次性收取全部缓冲区中的数据.当下一次再有数据来时 ...

  3. python 网络编程粘包解决方案2 + ftp上传 + socketserver

    一.struct 神奇的打包工具 struct 代码: import struct num = 156 #将int类型的数据打包成4个字节的数据 num_stru = struct.pack('i', ...

  4. 一小时学会用Python Socket 开发可并发的FTP服务器!!

    socket是什么 什么是socket所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求 ...

  5. Python socket 粘包

    目录 1 TCP的三次握手四次挥手 0 1.1 三次握手 1 1.2 四次挥手 2 2 粘包现象 3 2.1 基于TCP制作远程执行命令操作(win服务端) 4 2.1 基于TCP制作远程执行命令操作 ...

  6. python 解决粘包问题

    客户端发送hello,如果服务端 recv(1) ,那只能接收到 h 这一个字符,然后再recv(1) 一下,可以再接收一个 e , 因为客户端发送的结果长,所以只能把其他的先缓存下来,下次recv的 ...

  7. Python socket粘包解决

    socket粘包: socket 交互send时,连续处理多个send时会出现粘包,soket会把两条send作为一条send强制发送,会粘在一起. send发送会根据recv定义的数值发送一个固定的 ...

  8. Python socket粘包问题(最终解决办法)

    套接字: 就是将传输层以下的协议封装成子接口 对于应用程序来说只需调用套接字的接口,写出的程序自然是遵循tcp或udp协议的 实现第一个功能个:实现:通过客户端向服务端发送命令,调取windows下面 ...

  9. Python socket粘包问题(初级解决办法)

    server端配置: import socket,subprocess,struct from socket import * server=socket(AF_INET,SOCK_STREAM) s ...

  10. python socket粘包及实例

    1.在linux中经常出现粘包的出现(因为两个send近靠着,造成接受到的数据是在一起的.)解决方法: 在服务端两send的中间中再添加一个recv(),客户端添加一个send(),服务端收到信息确认 ...

随机推荐

  1. introduce of servlet and filter

    servlet简介: Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中 ...

  2. Python基础:三、Python的解释器

    当我们编写python代码的时候,我们得到的是一个包含python代码的以.py为拓展名的文本文件,要运行代码,就需要python解释器去执行.py文件. 由于整个python语言从规范到解释器都是开 ...

  3. Netty 工具类 —— HashedWheelTimer 讲解

    一.前言 首先有一篇超时任务的实战分析,文章简短精炼明了,阐述了,为什么要用HashedWheelTimer. https://chuansongme.com/n/1650380646616 看完后, ...

  4. flagr a/b 测试特性开关&&微服务动态配置工具

    flagr a/b 测试特性开关&&微服务动态配置工具 简单运行 docker docker run -it -p 18000:18000 checkr/flagr 运行界面 说明 参 ...

  5. php商品对比功能代码分享

    商品对比调用的JS文件(包含了商品对比框浮动JS): /*浮动窗口*/ (function(){     var n=10;   var obj=document.getElementById(&qu ...

  6. MPU9250九轴陀螺仪--读接口数据

    1.使用i2c链接到树莓派的scl , sda 接口vcc给3v引脚,gnd接树莓派gnd就ok. 2.要操作mpu必须使用mpu的寄存器实现对参数的设定以及读取,取官方下载资料看了一下,在githu ...

  7. .NET Remoting、WebService、WCF、WebApi一些简单描述

    1. .NET Remoting是传输层协议TCP封装的,速度非常快,.NET Remoting基于.net反射机制,只方便.net使用,因此它有平台限制.(.NET Remoting的工作原理:服务 ...

  8. MapperScan和ComponentScan同时使用问题

    @MapperScan:1.首先了解@Mapper    在接口上添加了@Mapper,在编译之后就会生成相应的接口实现类.    不过需要在每个接口上面进行配置,为了简化开发,就有了 @Mapper ...

  9. [蓝桥杯]PREV-13.历届试题_网络寻路

    题目描述: 代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #define LEN ...

  10. 浏览器渲染页面的时候,不同的script块之间的关系

    浏览器渲染页面时,当读到script元素的时候,浏览器中的js引擎会分多个script代码块来读取,不同的script代码出错互不影响,但是由于script中的变量作用域是全局,所以前面代码块声明的变 ...