Socket_SSH-3(粘包)

粘包:两次数据粘到一起了。在Windows中基本看不出来效果。

服务器端的配置:

import socket,os,time

server=socket.socket()
server.bind(('localhost',9999))
server.listen()
while True:
    conn,addr=server.accept()
    print("new connection is :",addr)
    while True:
        data=conn.recv(1024)
        if not data:
            print("客户端已经断开")
            break
        cmd_res=os.popen(data.decode('utf-8')).read()
        if len(cmd_res)==0:
            cmd_res="命令无效,没有返回值"
        conn.send(str(len(cmd_res.encode())).encode('utf-8'))
        #整数不能直接encode,需要先转成字符串,再encode.发大小给客户端
        #time.sleep(0.5) #防止粘包
        client_ack=conn.recv(1024) #wait client to confirm
        print("ack from client:",client_ack)
        conn.send(cmd_res.encode('utf-8'))
server.close()

 客户端的配置:

import socket

client=socket.socket()
client.connect(('localhost',9999))
while True:
    cmd=input(">>:").strip()
    if len(cmd)==0:
        break
    client.send(cmd.encode('utf-8'))
    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("utf-8")):
        data=client.recv(1024)
        received_size=received_size+len(data) #每次收到的有效数字,有可能小于1024
        received_data=received_data+data
    else:
        print("cmd res received done...",received_size)
        print(received_data.decode('utf-8'))
client.close()

 

posted on 2017-08-07 21:42  momo8238  阅读(123)  评论(0编辑  收藏  举报