zoukankan      html  css  js  c++  java
  • Socket_SSH-2(大文件的一次传输)

    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)
            if not data:
                print("客户端已断,请重新输入")
                break
            cmd_res=os.popen(data.decode('utf-8')).read()
            if len(cmd_res)==0:
                cmd_res='无效命令,没有返回值'
            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:
            continue
        client.send(cmd.encode('utf-8'))
        cmd_res=client.recv(1024)
        print(cmd_res.decode('utf-8'))
    client.close()
    

    服务器端的输出

    new conn: ('127.0.0.1', 61966)
    'pwd' is not recognized as an internal or external command,
    operable program or batch file.
    

    客户端的输出

    >>:pwd
    无效命令,没有返回值
    >>:dir
     Volume in drive C is OSDisk
     Volume Serial Number is 002E-D604
    
     Directory of C:abccdxdddOldboyPy_ExerciseDay8
    
    08/07/2017  03:54 PM    <DIR>          .
    08/07/2017  03:54 PM    <DIR>          ..
    08/07/2017  03:52 PM               280 client_ch.py
    08/07/2017  03:54 PM               509 server_ch.py
    08/03/2017  11:17 AM               650 socket_ssh_server.py
    08/03/2017  11:26 AM               259 sock_ssh_client.py
    08/03/2017  03:56 PM               133 ssh_client.py
    08/03/2017  03:54 PM               415 ssh_server.py
    08/03/2017  04:55 PM               259 ????.py
    08/07/2017  10:27 AM               146 ????.py
                   8 File(s)          2,651 bytes
                   2 Dir(s)  145,735,159,808 bytes free
    

    让超过1024大小的数据的一次返回,先在服务器端计算大小,把需要接受的次数传给客户端。

    服务器端:

    import socket,os
    
    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('utf-8'))
            #整数不能直接encode,需要先转成字符串,再encode.发大小给客户端
            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)
        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()
    

    实现收到的数据大小跟要传输的数据大小相一致。

    import socket,os
    
    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.发大小给客户端
            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)
        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()
    

     关于字符长度:

    aa="人"
    print(len(aa))
    print(len(aa.encode('utf-8')))
    

     结果输出:

    1
    3
    
  • 相关阅读:
    selenium 等待时间
    将博客搬至CSDN
    关于科研和工作的几点思考
    窥探观察者模式
    泛型编程拾遗
    【opencv入门篇】 10个程序快速上手opencv【下】
    【opencv入门篇】 10个程序快速上手opencv【上】
    【opencv入门篇】快速在VS上配置opencv
    【MFC系列】MFC快速设置控件文本字体、大小、颜色、背景
    如何用Qt Creator输出helloworld
  • 原文地址:https://www.cnblogs.com/momo8238/p/7300350.html
Copyright © 2011-2022 走看看