Python socket ssh接收大数据

通过socket连续接收返回数据

  • Server服务端
import socket,os
server = socket.socket()
server.bind(('localhost',9999))

server.listen()

while True:
    conn,addr = server.accept()
    print("new conn:",addr)
    while True:
        data = conn.recv(1024) #第一次没发完会放到io缓冲区
        if not data:
            print("客户端已断开")
            break
        print("执行指令",data.decode())
        cmd_res = os.popen(data.decode()).read() #接收字符串
        print("before send",len(cmd_res))
        if len(cmd_res) ==0:  #客户端断开后会,服务端收到的是空,数据为0
            cmd_res = "cmd has no output..."
        conn.send(str(len(cmd_res.encode())).encode("utf-8"))    #先发大小给客户端
        conn.send(cmd_res.encode("utf-8")) 
server.close()

 

  • Clinet客户端
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"))
    cmd_res_size = client.recv(1024)    #接收命令结果长度
    print("命令结果大小:",cmd_res_size)
    received_size = 0
    received_data = b''  #创建空的b类型文件
    while received_size < int(cmd_res_size.decode()):    #如果没传完就继续循环
        data = client.recv(1024)  #收数据
        received_size += len(data) #每次收到的有可能小于1024,所以必须用len判断。
        received_data += data    #将数据叠加到b文件内
    else:
        print("cmd res receive done",received_size)
        print(received_data.decode())
client.close()

 

#recv接收数据后,会先存到缓冲区,缓冲区满了之后会自动send。
#手动send是超时强制向客户端发送数据,不会等待recv填满缓冲区时自动发。
#send发送数据 中文字符=3字节 英文=1字节 缓冲区会多发送len()字符个数。

 

posted @ 2017-12-27 18:32  kevin.Xiang  阅读(704)  评论(0编辑  收藏  举报