python 3.x 学习笔记13 (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()

原文地址:https://www.cnblogs.com/hsj-jingyu/p/8439900.html

时间: 2024-11-05 21:57:03

python 3.x 学习笔记13 (socket_ssh and socket_文件传输)的相关文章

python 3.x 学习笔记13 (网络编程socket)

1.协议http.smtp.dns.ftp.ssh.snmp.icmp.dhcp....等具体自查 2.OSI七层应用.表示.会话.传输.网络.数据链路.物理 3.socket: 对所有上层协议的封装 4.socket常用功能1)sk.bind(address) s.bind(address) 将套接字绑定到地址.address地址的格式取决于地址族.在AF_INET下,以元组(host,port)的形式表示地址. 2)sk.listen(backlog) 开始监听传入连接.backlog指定在

python 学习笔记 13 -- 常用的时间模块之time

Python 没有包含对应日期和时间的内置类型,不过提供了3个相应的模块,可以采用多种表示管理日期和时间值: *    time 模块由底层C库提供与时间相关的函数.它包含一些函数用于获取时钟时间和处理器的运行时间,还提供了基本解析和字符串格式化工具 *    datetime 模块为日期.时间以及日期时间值提供一个更高层接口.datetime 中的类支持算术.比较和时区配置. *    calendar 模块可以创建周.月和年的格式化表示.它还可以用来计算重复事件.给定日期是星期几,以及其他基

python基础教程_学习笔记13:标准库:一些最爱——sys

标准库:一些最爱 sys sys这个模块让你能够访问与python解释器联系紧密的变量和函数. sys模块中一些重要的函数和变量 函数/变量 描述 argv 命令行参数,包括脚本名称 exit([arg]) 退出当前程序,可选参数为给定的返回值或者错误信息 modules 映射模块名字到载入模块的字典 path 查找模块所在目录的目录名列表 platform 类似sunos5或者win32的平台标识符 stdin 标准输入流--一个类文件对象 stdout 标准输出流--一个类文件对象 stde

HTML&CSS基础学习笔记13—无序列表

无序列表 有时我们的工作繁忙,杂事很多,怕忘记,就会把事情一件件列出来,防止忘记. 它们的排列顺序对于我们来说并不重要,可以随意调换,我们将它称为无序列表,HTML里用<ul>标签来表示无序列表,列表里的项目则用<li>标签来表示: 1 2 3 4 5 <ul>     <li></li>     <li></li>     ... </ul> 看一段实例代码: 对于的浏览器显示结果是这样的: 更多内容学习,请

Swift学习笔记(13)--属性 (Properties)

普通属性用var和let即可,本文不做详述 1.延迟存储属性 延迟存储属性是指当第一次被调用的时候才会计算其初始值的属性.在属性声明前使用@lazy来标示一个延迟存储属性. class DataImporter { /* DataImporter 是一个将外部文件中的数据导入的类. 这个类的初始化会消耗不少时间. */ var fileName = "data.txt" // 这是提供数据导入功能 } class DataManager { @lazy var importer = D

springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定

springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定 springmvc学习笔记13-springmvc注解开发之集合类型參数绑定 数组绑定 需求 表现层实现 list绑定 需求 表现层实现 map绑定 本文主要介绍注解开发的集合类型參数绑定,包含数组绑定,list绑定以及map绑定 数组绑定 需求 商品批量删除,用户在页面选择多个商品.批量删除. 表现层实现 关键:将页面选择(多选)的商品id,传到controller方法的形參,方法形參使用数组接收页面请求的多个商

Ext.Net学习笔记13:Ext.Net GridPanel Sorter用法

Ext.Net学习笔记13:Ext.Net GridPanel Sorter用法 这篇笔记将介绍如何使用Ext.Net GridPanel 中使用Sorter. 默认情况下,Ext.Net GridPanel中的列都具有排序功能,效果如下: 如果要禁用列排序,需要在列模型中添加一个属性Sortable="false" 客户端排序 排序是对Store的操作.如果我们要在一个Store中加入排序,可以使用下面的配置: <Sorters> <ext:DataSorter P

mybatis学习笔记(13)-查询缓存之二级缓存

mybatis学习笔记(13)-查询缓存之二级缓存 mybatis学习笔记13-查询缓存之二级缓存 二级缓存原理 开启二级缓存 调用pojo类实现序列化接口 测试方法 useCache配置 刷新缓存就是清空缓存 应用场景和局限性 本文主要讲mybatis的二级缓存,二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的. 二级缓存原理 首先开启mybatis的二级缓存. sqlS

springmvc学习笔记(13)-springmvc注解开发之集合类型参数绑定

springmvc学习笔记(13)-springmvc注解开发之集合类型参数绑定 springmvc学习笔记13-springmvc注解开发之集合类型参数绑定 数组绑定 需求 表现层实现 list绑定 需求 表现层实现 map绑定 本文主要介绍注解开发的集合类型参数绑定,包括数组绑定,list绑定以及map绑定 数组绑定 需求 商品批量删除,用户在页面选择多个商品,批量删除. 表现层实现 关键:将页面选择(多选)的商品id,传到controller方法的形参,方法形参使用数组接收页面请求的多个商