zoukankan      html  css  js  c++  java
  • Python 3.x--Socket实现简单的ssh和文件下载功能

    *****************SSH*********************

    ---------------服务器端----------------

     1 import os,socket
     2 
     3 server = socket.socket()
     4 server.bind(('127.0.0.1',6666))
     5 server.listen()
     6 
     7 while True:
     8     conn, addr = server.accept()
     9     print("new addr:",addr)
    10     while True:
    11         data = conn.recv(1024)
    12         if not data:
    13             print("客户端已断开。。。")
    14             break
    15         print("执行指令。。。",data)
    16         res = os.popen(data.decode()).read()   #接受命令,并返回结果
    17         if len(res)==0:
    18             res = "cmd has no output..."
    19         conn.send(str(len(res.encode('utf-8'))).encode('utf-8'))               #发送输出结果的大小
    20         sleep_recv = conn.recv(1024)
    21         print("缓冲...",sleep_recv.decode())    #两条send命令可能会出现粘包的情况
    22         conn.send(res.encode('utf-8'))
    23 
    24 server.close()

    ---------------客户端----------------

     1 import socket
     2 
     3 client = socket.socket()
     4 client.connect(('127.0.0.1',6666))
     5 
     6 while True:
     7     cmd = input(">>>:").strip()
     8     if len(cmd)==0:
     9         continue
    10     client.send(cmd.encode('utf-8'))   #发送命令
    11     res_size = client.recv(1024)          #接收第一个结果:字节长度
    12     print("命令结果大小:",res_size)
    13     client.send("已准备好接收命令结果。。。".encode("utf-8"))
    14     res_size_init = 0
    15     res_data = b''
    16     while res_size_init != int(res_size.decode()):
    17         data = client.recv(1024)   #不一定能接收到正好1024字节的数据
    18         print(len(data))
    19         res_size_init += len(data)
    20         res_data += data
    21     else:
    22         print("res_data receive done...",res_size_init)
    23         print(res_data.decode())
    24 
    25 client.close()

    运行结果:

     ---------------服务器端----------------

     ---------------客户端----------------

     *****************文件下载*********************

    ---------------服务器端----------------

    import os,socket,hashlib
    
    server = socket.socket()
    server.bind(('localhost',6666))
    server.listen()
    
    while True:
        conn, addr = server.accept()
        print("new addr:",addr)
        while True:
            data = conn.recv(1024)
            if not data:
                print("客户端已断开。。。")
                break
            cmd, filename = data.decode().split()
            print(filename)
            if os.path.isfile(filename):
                f = open(filename,"rb")
                m = hashlib.md5()
                file_size = os.stat(filename).st_size
                conn.send(str(file_size).encode("utf-8"))   #发送文件大小
                conn.recv(1024)   #等待回复
                for line in f:
                    m.update(line)
                    conn.send(line)
                print("file md5:",m.hexdigest())
                f.close()
                conn.send(m.hexdigest().encode("utf-8"))   #发送MD5,与上面的“conn.send(line)”可能出现粘包
            print("send done...")
    
    server.close()

    ---------------客户端----------------

    import socket,hashlib
    
    client = socket.socket()
    client.connect(('localhost', 6666))
    
    while True:
        cmd = input(">>>:").strip()
        if len(cmd)==0:
            continue
        if cmd.startswith("get"):
            filename = cmd.split()[1]   #获取文件名
            client.send(cmd.encode("utf-8"))
            server_resp_size = client.recv(1024)   #接收文件总的大小
            file_total_size = int(server_resp_size.decode())
            print("file size:", server_resp_size)
            client.send(b"ready to recv file...")
            f = open(filename+".new","wb")
            recv_size = 0
            m = hashlib.md5()
            while recv_size < file_total_size:
                if file_total_size - recv_size > 1024:   #判断最后一次,之前接收大小设置为1024
                    size = 1024
                else:                                    #最后一次不足1024,则只接收文件剩余的部分,不包含MD5
                    size = file_total_size - recv_size
                    print("the last size:",size)
                data = client.recv(size)
                recv_size += len(data)
                f.write(data)
                m.update(data)
            else:
                client_md5 = m.hexdigest()
                print("recv done...")
                print("total size:", file_total_size, "had been received:", recv_size)
                server_md5 = client.recv(1024)
                print("server md5:", client_md5, "server md5:", server_md5.decode())
                f.close()
    
    client.close()

    运行结果:

  • 相关阅读:
    DevExpress 最最最基础踩坑(如何设置控件属性)
    Oracle如何创建数据库(使用图形化界面,顺便提一下UTF-8和ZB16GB字符集的问题)
    ElementUI el-dialog中嵌套子页面
    Oracle详细教程(触发器,事务,存储过程,锁,游标)
    和人事交谈下来的几点感悟
    Oracle Groupby分组缺少表达式解决方法
    leetcode973. 最接近原点的 K 个点(谈谈C#中的Icomparer,ComParer,IComparable)
    APP的闪退和无响应
    APP测试的主要内容
    python数据结构
  • 原文地址:https://www.cnblogs.com/rainowl-ymj/p/7221668.html
Copyright © 2011-2022 走看看