当前位置: 首页 > news >正文

网络编程 --ftp01上传

这是一个模拟的ftp上传功能,客户端输入命令之后,在客户端执行一个命令,把输入都上传到服务端在返回,前面是一个类似练习的例子

客户端

***** 服务端的conn指的是客户端的sockt套接字的对象*****

#小试牛刀
# import socket
# kt=socket.socket() #创建socket对象
# info=("127.0.0.1",8800)
# kt.connect(info)
# while True:
#     import subprocess
#     res = subprocess.Popen("ipconfig",                #实例化Popen类  #并且接受的值是byte类型
#                            shell=True,
#                            stderr=subprocess.PIPE,
#                            stdout=subprocess.PIPE)
#     # print(len(res.stdout.read().decode("gbk")))  # 实例res通过stdout.read()方法读取数据
#     # print(">>>hello")                            # 这个地方不能写print
#     kt.send(res.stdout.read())

###########################################################################
# use=input("用户名:")
# pwd=input("密码:")
# val=("%s|%s"%(use,pwd)).encode("utf8")             #把多个变量同时传过去

############################################################################
import socket
kt=socket.socket() #创建socket对象
info=("127.0.0.1",8800)
kt.connect(info)
while True:
    import subprocess
    cmd=input(">>>请输入命令")
    res = subprocess.Popen(cmd,                #实例化Popen类  #并且接受的值是byte类型
                           shell=True,
                           stderr=subprocess.PIPE,
                           stdout=subprocess.PIPE)
    # print(len(res.stdout.read().decode("gbk")))  # 实例res通过stdout.read()方法读取数据
    # print(">>>hello")                            # 这个地方不能写print
    # out=res.stdout.read().decode("gbk")                          #写两个变量不让冲突,都在res上操作后面会出问题
    # print(len(out))
    # kt.send(res.stdout.read())

    out = res.stdout.read()
    err = res.stderr.read()
    print("out长度",len(out))
    print("err长度", len(err))

    #构建包头
    import struct
    # header_pack = struct.pack("i", len(out))   #把数据的长度打包成包头,和数据一起粘包发送过去,在服务端在解包
    #要发送的包头内容
    header_pack = struct.pack("i",len(out))      #i模式只能打包压缩整型类,打包的结果就是4个字节,可以直接发送
    #发送包头,
    kt.send(header_pack)
    #发送内容
    kt.send(out)                                 #包头和内容会作为粘包一起传过去,在对方一起解开
                                                #时间间隔特别短,两次发的就会当成一个包发过去
客户端

 

服务端

#小试牛刀
# import socket
# sock=socket.socket() #创建socket对象,后面的操作都是对这个对象进行操作
#
# info=("127.0.0.1",8800)
# sock.bind(info)
# sock.listen(5)
# while   True:
#     conn,addr=sock.accept() #开始阻塞
#     # print("接收成功!")
#     data=conn.recv(1024)             #recv的参数是固定长度
#     print(data.decode("gbk"))
#     print("接收成功!")
###########################################################################################
#conn是谁?
import socket
import struct
sock=socket.socket() #创建socket对象,后面的操作都是对这个对象进行操作

info=("127.0.0.1",8800)
sock.bind(info)
sock.listen(5)
while   True:
    conn,addr=sock.accept() #开始阻塞
    # print("接收成功!")
    data=conn.recv(4)             #recv的参数是固定长度
    data_length=struct.unpack("i",data)[0]     #对方传过来是4长度的字节,解包以后是数字表示的长度,默认在元组中,用索引取出
    print(data)
    print(data_length)
    print("接收成功!")

    recv_data_length=0
    recv_data=b""
    while recv_data_length<data_length:     #data_length的长度是对方传过来的,这个是最大的
        data=conn.recv(1024)
        recv_data_length+=len(data)
        recv_data+=data
    print(">>>>>>>%s"%type(recv_data))
    print(recv_data.decode("gbk"))
    # data_length=int(conn.recv(1024).decode("utf8"))
服务端

 

其中用到的一些知识点:

struct模块


subprocess模块

下面是一个比较正式的的ftp上传的例子,客户端和服务端都有,有些知识点上面已经讲过了,
server端
import socket
import struct
sock=socket.socket() #创建socket对象,后面的操作都是对这个对象进行操作

info=("127.0.0.1",8900)
sock.bind(info)    #里面是一个元组
sock.listen(5)

while   True:
    conn,addr=sock.accept()       #开始阻塞
    # print("接收成功!")
    data=conn.recv(4)             #recv的参数是固定长度
    data_length = struct.unpack("i", data)[0]
    # print(data.decode("utf8"))
    recv_data_length = 0
    recv_data = b""
    while recv_data_length<data_length:
        data=conn.recv(1024)
        recv_data_length+=len(data)
        recv_data+=data
    print(">>>>>>>%s"%type(recv_data))
    print(recv_data.decode("utf8"))
    # data_length=int(conn.recv(1024).decode("utf8"))

client端
import socket
import os
import struct
sock=socket.socket()
info=("127.0.0.1",8900) 
file_path=input(">>>请输入文件名,如不再当前目录请输入绝对路径:")
sock.connect(info) #里面是一个元组
#文件内容
data=b""
with open(file_path,mode="rb") as  f1:
    for line in f1:
        data+=line

#构造包头
head_packge=struct.pack("i",len(data))      #构造后的结果直接是4位的字节
#发送包头
sock.send(head_packge)
#发送文件内容
sock.send(data)


# print("真实长度:",len(data))
# print("压包后的四位字节:" ,struct.pack("i",len(data)))

  

底层对粘包的启发

 

底层数据报文有包头,地址,数据内容等,都是一次发送的,这个就类似python中的粘包,一层发送过去再进行固定长度的解包

 

  

 

 







转载于:https://www.cnblogs.com/zhuhaofeng/p/9588474.html

相关文章:

  • Predicate
  • LayUI 开始日期到结束日期
  • 托福雅思
  • Wepy--小程序自定义底部tabBar
  • Alibaba Java Coding Guidelines
  • 10个确保微服务与容器安全的最佳实践
  • Java ClassLoader分析
  • linux的目录结构
  • 看懂架构设计中的服务隔离
  • vue传值
  • 交叉分析方法与实现
  • 不拥抱doucment.write
  • py 的 第 33 天
  • [Vue CLI 3] 配置解析之 css.extract
  • 如何实现360度的手游安全防护?网易云易盾专家分享最新实践
  • 11111111
  • Java小白进阶笔记(3)-初级面向对象
  • js数组之filter
  • Laravel 实践之路: 数据库迁移与数据填充
  • scrapy学习之路4(itemloder的使用)
  • Transformer-XL: Unleashing the Potential of Attention Models
  • Vue.js源码(2):初探List Rendering
  • 第2章 网络文档
  • 蓝海存储开关机注意事项总结
  • 理解在java “”i=i++;”所发生的事情
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 盘点那些不知名却常用的 Git 操作
  • 前端性能优化--懒加载和预加载
  • 软件开发学习的5大技巧,你知道吗?
  • 一、python与pycharm的安装
  • 在weex里面使用chart图表
  • puppet连载22:define用法
  • ​什么是bug?bug的源头在哪里?
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #Lua:Lua调用C++生成的DLL库
  • (4)logging(日志模块)
  • (bean配置类的注解开发)学习Spring的第十三天
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (一)VirtualBox安装增强功能
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .net core 6 集成 elasticsearch 并 使用分词器
  • ??在JSP中,java和JavaScript如何交互?
  • @Transactional 详解
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [1204 寻找子串位置] 解题报告
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [22]. 括号生成
  • [Avalon] Avalon中的Conditional Formatting.
  • [BZOJ 1032][JSOI2007]祖码Zuma(区间Dp)
  • [BZOJ 4598][Sdoi2016]模式字符串
  • [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated c
  • [Firefly-Linux] RK3568 pca9555芯片驱动详解