1.先说下subprocess模块的用法,为了举个黏包的例子

  1. # 通过一个例子 来认识网络编程中的一个重要的概念
  2. # 所有的客户端执行server端下发的指令,执行完毕后,客户端将执行结果给返回给服务端
  3.  
  4. import subprocess # 这个模块其实并不好用,这里为了举例子。调用操作系统的命令模块
  5.  
  6. res = subprocess.Popen('dir', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 执行dir命令,并将标准输出和错误内容装到了管道中
  7. print('stdout : ', res.stdout.read().decode('gbk')) # 从管道中获取控制台的内容,windows控制台执行完毕后,得到的是bytes类型的,需要解码成gbk才可不乱码显示,windows控制台返回的是gbk的,所以这里要gbk解码
  8. print('stderror: ', res.stderr.read().decode('gbk'))

  2.写一个tcp的server端和client,模拟黏包的现象,tcp端发送windows的命令给client,client接收后执行该命令后,将控制台返回的内容传输到server端

  tcpserver.py

  1. # 通过一个例子 来认识网络编程中的一个重要的概念
  2. # 所有的客户端执行server端下发的指令,执行完毕后,客户端将执行结果给返回给服务端
  3. # 基于tcp实现远程执行命令
  4.  
  5. # 在server下发windows操作系统命令给client,client执行完毕后返回给sercer
  6.  
  7. # 出现了黏包现象
  8. # 数据乱了,数据没有接收完,下次接收接收到了未接收到的数据等现象
  9.  
  10. # tcp不会丢包,会黏包。
  11. # 当传输的包很大的时候,tcp协议会将其拆分开进行传输。
  12.  
  13. import socket
  14.  
  15. sk = socket.socket()
  16.  
  17. sk.bind(('127.0.0.1', 8080))
  18.  
  19. sk.listen()
  20.  
  21. conn, addr = sk.accept()
  22.  
  23. while True:
  24. cmd = input('输入想要客户端windows系统想要执行的命令:')
  25. conn.send(cmd.encode('utf-8'))
  26. msg = conn.recv(1024).decode('utf-8')
  27. print(msg)
  28.  
  29. conn.close()
  30. sk.close()

  tcpclient.py

  1. # client接收服务端命令
  2.  
  3. import socket
  4. import subprocess
  5.  
  6. sk = socket.socket()
  7.  
  8. sk.connect(('127.0.0.1', 8080))
  9.  
  10. while True:
  11. cmd = sk.recv(1024).decode('utf-8')
  12. res = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  13. stdout = 'stdout : ' + res.stdout.read().decode('gbk')
  14. stderr = 'stderr : ' + res.stderr.read().decode('gbk')
  15. #print(stdout)
  16. #print(stderr)
  17. # res.stdout.read() 为cmd命令执行后返回的结果,返回的是bytes类型数据
  18. sk.send(stdout.encode('utf-8'))
  19. sk.send(stderr.encode('utf-8'))
  20.  
  21. sk.close()

  3.udp不黏包,但会丢包例子,与上类似

  udpserver.py

  1. # 测试结果,udp不会黏包,但udp会丢包,数据发送出去后,一旦另一端接收的缓存不够大,而发送的数据很大时,未接收的数据,会丢弃掉。同时udp大了缓存限制会丢弃包
  2.  
  3. import socket
  4.  
  5. sk = socket.socket(type=socket.SOCK_DGRAM)
  6.  
  7. #sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) # 避免服务重启的时候报address already in use。加上这个解决
  8. sk.bind(('127.0.0.1', 8081))
  9.  
  10. msg, addr = sk.recvfrom(1024)
  11.  
  12. while True:
  13. cmd = input('输入想要客户端windows系统想要执行的命令:')
  14. if cmd == 'q':
  15. break
  16. sk.sendto(cmd.encode('utf-8'), addr)
  17. msg, addr = sk.recvfrom(1024)
  18. print(msg.decode('utf-8'))
  19.  
  20. sk.close()

  udpclient.py

  1. # client接收服务端命令
  2.  
  3. import socket
  4. import subprocess
  5.  
  6. sk = socket.socket(type=socket.SOCK_DGRAM)
  7.  
  8. ip_port = ('127.0.0.1', 8081)
  9. sk.sendto(b'hello', ip_port)
  10.  
  11. while True:
  12. cmd, addr= sk.recvfrom(1024)
  13. res = subprocess.Popen(cmd.decode('utf-8'), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  14. stdout = 'stdout : ' + res.stdout.read().decode('gbk')
  15. stderr = 'stderr : ' + res.stderr.read().decode('gbk')
  16. #print(stdout)
  17. #print(stderr)
  18. # res.stdout.read() 为cmd命令执行后返回的结果,返回的是bytes类型数据
  19. sk.sendto(stdout.encode('utf-8'), ip_port)
  20. sk.sendto(stderr.encode('utf-8'), ip_port)
  21.  
  22. sk.close()

  4.tcp为什么会黏包

  黏包是这样出现的

  tcp的拆包机制是类似这样的

  5.udp为什么不会黏包

tcp黏包问题与udp为什么不黏包的更多相关文章

  1. Python—TCP的黏包问题以及UDP的分片问题

    TCP协议与UDP协议 TCP(transport control protocol,传输控制协议)是面向连接的,面向流的,提供高可靠性服务.收发两端(客户端和服务器端)都要有一一成对的socket, ...

  2. TCP与UDP的不同接包处理方式

    TCP与UDP的不同接包处理方式 1.UDP发包的问题问:udp 发送两次数据,第一次 100字节 ,第二次200字节, 接包方一次recvfrom( 1000 ), 收到是 100,还是200,还是 ...

  3. 黏包现象之udp

    老师的博客:http://www.cnblogs.com/Eva-J/articles/8244551.html server端 import socket import subprocess ser ...

  4. TCP和UDP 协议发送数据包的大小

    在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好? 当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,这里仅对像ICQ一类的发送聊天消息的情况作分 ...

  5. ETHERNET数据包格式( IP & UDP & ICMP & ARP )

    ETHERNET数据包格式( IP & UDP & ICMP & ARP ) ETHERNET数据包格式 一.ETHERNET 数据包的协议类型 TYPE 的值为 0x0800 ...

  6. Tcp/Ip协议族简单解读及网络数据包/报/帧数据格式及封装及解包;

    http://www.creseek.cn/products-install/install_on_bsd_linux/ 中文检索 离线cloudera ecosystem components: h ...

  7. 网络编程基础之粘包现象与UDP协议

    一.粘包现象原理分析 1.我们先来看几行代码,从现象来分析: 测试程序分为两部分,分别是服务端和客户端 服务端.py #!/usr/bin/env python3 #-*- coding:utf-8 ...

  8. UDP收/发广播包原理及步骤

    原文链接地址:http://www.2cto.com/net/201311/254834.html UDP收/发广播包原理及步骤 如果网络中两个主机上的应用程序要相互通信,其一要知道彼此的IP,其二要 ...

  9. TCP的流模式与UDP的报文模式对比

    1       案例背景 在学习TCP-IP协议详解卷一时,读到介绍TCP协议的部分,发现TCP的首部是没有报文总长度字段的,而在UDP中是有的,对这个问题的思考引出了两者之间的区别. 2    案例 ...

随机推荐

  1. 《我想进大厂》之Dubbo普普通通9问

    这是面试专题系列第四篇,Dubbo系列.Dubbo本身并不复杂,而且官方文档写的非常清楚详细,面试中dubbo的问题一般不会很多,从分层到工作原理.负载均衡策略.容错机制.SPI机制基本就差不多了,最 ...

  2. spring boot:多个filter/多个interceptor/多个aop时设置调用的先后顺序(spring boot 2.3.1)

    一,filter/interceptor/aop生效的先后顺序? 1,filter即过滤器,基于servlet容器,处于最外层, 所以它会最先起作用,最后才停止 说明:filter对所有访问到serv ...

  3. linux(centos8):用sort对文本内容排序

    一,sort的用途 1,作用: sort命令用于将文本文件内容加以排序. 它能够以行为单位来排序 2,sort常与uniq搭配使用,原因: 用uniq命令去重时, 需要相同的每行位置相邻才能生效, 所 ...

  4. 智能DNS的实现

    网络路径远,导致用户访问延迟 各个运营商之间的带宽有阀口. GSLB 就近的返回服务器的地址 CDN网络 内容分发网络 Content Delivery Network CND服务商 阿里 腾讯 蓝汛 ...

  5. 使用Pytorch搭建模型

    本来是只用Tenorflow的,但是因为TF有些Numpy特性并不支持,比如对数组使用列表进行切片,所以只能转战Pytorch了(pytorch是支持的).还好Pytorch比较容易上手,几乎完美复制 ...

  6. RestTemplate+Ribbon实现服务调用

    一,通过LoadBalancerClient取得uri,然后RestTemplate 调用 1, 注入LoadBalancerClient @Autowired LoadBalancerClient ...

  7. mininet实践应用

    目录 mininet的安装和基本指令的了解 安装过程 拓扑类型和基本指令 mininet拓扑实战 拓扑的创建和编辑 对自定义拓扑一些简单的测试. 测试总结 mininet的安装和基本指令的了解 安装过 ...

  8. Glide缓存图片

    是用Glide加载网络图片可以自动缓存到磁盘 添加依赖: implementation 'com.github.bumptech.glide:glide:4.9.0' implementation ' ...

  9. 第二十七章 ansible变量介绍

    一.ansible变量介绍 1.概念 变量提供了便捷的方式来管理Ansible playbook的每一个项目中的动态值,比如nginx-1.6.3这个软件包的版本,在其它地方或许会反复使用,那么如果讲 ...

  10. Linux服务器部署redis常见问题处理

    redis开启和禁用登陆密码校验 1. 开启登陆密码校验 在redis-cli命令行工具中执行如下命令: config set requirepass yourpassword2. 禁用登陆密码校验 ...