• python 3.x 学习笔记14 (socket_ssh and socket_文件传输)


    ssh服务端

    import socket,os
    
    server = socket.socket()
    server.bind(('localhost',6666))
    
    server.listen()
    conn, addr = server.accept()
    while True:
        print('等待新数据!')
        cmd = conn.recv(1024)
        
        if len(cmd) == 0:
            break
            
        data = os.popen(cmd.decode()).read()
        cmd_size = len(data.encode('utf-8'))
        print('检测到数据大小',cmd_size)
        
        if len(data) == 0:
            data = '没有此命令!!'
            
        conn.send(str(len(data.encode('utf-8'))).encode())
        order = conn.recv(1024)
    
        conn.send(data.encode('utf-8'))
        print('传送完成!')
    
    server.close()

    ssh客户端

    import socket
    
    client = socket.socket()
    client.connect(('localhost',6666))
    while True:
        cmd = input('>>>:')
        
        if cmd == 0:
            continue
            
        client.send(cmd.encode('utf-8'))
        cmd_size = client.recv(1024)
        print('服务端检测到数据大小:', cmd_size)
        
        if len(cmd_size) !=0:
            client.send('可以发送数据了'.encode(encoding='utf-8'))
            
        receive_size = 0
        receive_cmd = b''
        
        while receive_size < int(cmd_size.decode()):
            data = client.recv(1024)
            receive_size += len(data)
            receive_cmd += data
        else:
            print('接收到数据大小:',receive_size)
            print('数据接收完成!')
            print(receive_cmd.decode())

    socket文件传输并校验

    服务端

    import socket,os,hashlib
    
    server = socket.socket()
    server.bind(('localhost',6666))
    server.listen()
    conn, addr = server.accept()
    while True:
        print('等待新数据!')
        cmd = conn.recv(1024)
        if len(cmd) == 0:
            break
        filename = cmd.decode().split()[1]
        print(filename)
        if os.path.isfile(filename):          #判断文件是否存在
            f = open(filename,'rb')           #打开文件
            m = hashlib.md5()
            file_size = os.stat(filename).st_size   #查询文件大小
            print(file_size)
            conn.send(str(file_size).encode())         #给客户端发送文件大小
            conn.recv(1024)                              #等待并接受客户端的确认,这一步可以解决粘包问题
            for line in f:                              #边读边循环发送文件
                m.update(line)                           #得出每一句的md5值
                conn.send(line)                           #发送给客户端
            print('file md5:',m.hexdigest())
            f.close()
            conn.recv(1024)
            conn.send(m.hexdigest().encode())
    
        print('传送完成!')
    
    server.close()

    socket文件传输并校验

    客户端

    import socket,hashlib
    
    client = socket.socket()
    client.connect(('localhost',6666))
    while True:
        cmd = input('>>>:').strip()
        if len(cmd) == 0:
            continue
        if cmd.startswith('get'):          #传输文件名要以get开头如:get var
            client.send(cmd.encode('utf-8'))
            file_size = client.recv(1024)
            print('服务端检测到文件大小:', int(file_size))
            client.send('可以发送数据了'.encode(encoding='utf-8'))
            file_total_size = int(file_size)
            receive_size = 0
            filename = cmd.split()[1]         #以空格分割然后取出文件名
            f = open('new_'+filename ,'wb')
            m = hashlib.md5()
            while receive_size < file_total_size:
                data = client.recv(1024)
                m.update(data)
                receive_size += len(data)
                f.write(data)
                print(file_total_size, receive_size)
            else:
                new_file_md5 = m.hexdigest()
                print('数据接收完成!')
                f.close()
                client.send('可以发送md5值了'.encode())
            serve_md5 = client.recv(1024)
            print('新文件md5:',new_file_md5)
            print('原文件md5:',serve_md5)
    
    client.close()
  • 相关阅读:
    Hadoop Python 调用自定义so动态库
    Golang Redigo连接Redis 简单使用
    Golang 错误 "bad file descriptor"
    Centos Git 安装与升级
    初识数据库
    MySQL介绍,下载和安装
    并发编程:协程
    并发编程:多线程
    并发编程:多进程
    操作系统,进程理论
  • 原文地址:https://www.cnblogs.com/hsj-jingyu/p/8439900.html
Copyright © 2020-2023  润新知