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

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

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

  tcpserver.py

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

  tcpclient.py

# client接收服务端命令

import socket
import subprocess sk = socket.socket() sk.connect(('127.0.0.1', 8080)) while True:
cmd = sk.recv(1024).decode('utf-8')
res = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout = 'stdout : ' + res.stdout.read().decode('gbk')
stderr = 'stderr : ' + res.stderr.read().decode('gbk')
#print(stdout)
#print(stderr)
# res.stdout.read() 为cmd命令执行后返回的结果,返回的是bytes类型数据
sk.send(stdout.encode('utf-8'))
sk.send(stderr.encode('utf-8')) sk.close()

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

  udpserver.py

# 测试结果,udp不会黏包,但udp会丢包,数据发送出去后,一旦另一端接收的缓存不够大,而发送的数据很大时,未接收的数据,会丢弃掉。同时udp大了缓存限制会丢弃包

import socket

sk = socket.socket(type=socket.SOCK_DGRAM)

#sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) # 避免服务重启的时候报address already in use。加上这个解决
sk.bind(('127.0.0.1', 8081)) msg, addr = sk.recvfrom(1024) while True:
cmd = input('输入想要客户端windows系统想要执行的命令:')
if cmd == 'q':
break
sk.sendto(cmd.encode('utf-8'), addr)
msg, addr = sk.recvfrom(1024)
print(msg.decode('utf-8')) sk.close()

  udpclient.py

# client接收服务端命令

import socket
import subprocess sk = socket.socket(type=socket.SOCK_DGRAM) ip_port = ('127.0.0.1', 8081)
sk.sendto(b'hello', ip_port) while True:
cmd, addr= sk.recvfrom(1024)
res = subprocess.Popen(cmd.decode('utf-8'), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout = 'stdout : ' + res.stdout.read().decode('gbk')
stderr = 'stderr : ' + res.stderr.read().decode('gbk')
#print(stdout)
#print(stderr)
# res.stdout.read() 为cmd命令执行后返回的结果,返回的是bytes类型数据
sk.sendto(stdout.encode('utf-8'), ip_port)
sk.sendto(stderr.encode('utf-8'), ip_port) 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. MVC登录

    前言 最近没什么好写的,准备把MVC的登录再写一下,巩固一下 HTML @{ Layout = null; } <!DOCTYPE html> <html> <head& ...

  2. 微信小程序学习心得

    我们写小程序时都要跳转页面的,也会有底部导航来进行切换 这个时候就要介绍下窗口是怎样配置的 要在app.json文件里写一个tabBer对象 里面在定义一个list数组里面放我们定义的几个需要切换的页 ...

  3. 自学Python可以吗?怎样从入门到大师?我写这篇文章告诉你

    前言 很多粉丝朋友问我该如何去学习爬虫.学习Python.自学能找到工作吗?等一系列的问题.今天我就来回答一下大家. 第一点 确定好方向与目标 当决定踏入这个行业那一刻起,我想每一个人都爱已经准备投身 ...

  4. oracle 1day

    1.主流数据库: 2.项目选择数据库的原则: 3.oracle 常用用户sys (sysdba系统管理员),system(sysoper系统操作员),scott(密码tiger) sys login: ...

  5. jenkins自动拉取git分支构建项目

    一,创建jenkins项目 new item ->freestyle project, 自定义一个项目名称 二,配置项目 1,Source Code Management 选择 git,输入gi ...

  6. Foundation 用于开发响应

    Foundation 用于开发响应式的 HTML, CSS and JavaScript 框架. Foundation 是一个易用.强大而且灵活的框架,用于构建基于任何设备上的 Web 应用. Fou ...

  7. 【论文阅读】An Empirical Study of Architectural Decay in Open-Source Software

    2020-06-19这篇文章是我学习 软件架构与中间件 课程时分享的论文.可以说,这篇文章塑造了我基本的科研观,也养成了我如今看论文的习惯.感谢老师们,也感谢恒恒对我的帮助. 论文地址: https: ...

  8. K8S的StorageClass实战(NFS)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. Serilog 源码解析——总览

    背景 大家好,考虑到在最近这些天,闲来无事,找了个类库好好研究下别人写的高质量代码,颇有收获,打算和大家分享下.考虑到最近在自学 ASP.NET Core 的相关开发,对 Serilog 这个日志记录 ...

  10. UbuntuStudio20.04安装教程(双系统安装,windows10已安装)

    硬件和系统: acer4750(原i3换i7,加固态硬盘200多G,原机械硬盘500G由光驱改装,内存由2G增加为6G)2010年购买3300,性价比高,硬件升级后2020年不过时 windows10 ...