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. centos8平台php7.4.2安装phpredis实现对redis的访问

    一,下载phpredis 1,官方下载地址: https://github.com/phpredis/phpredis/releases 2,wget下载 [root@yjweb source]# w ...

  2. php生成器 yield 转

    一.yield介绍  文档介绍说道:生成器函数的核心是yield关键字.它最简单的调用形式看起来像一个return申明,不同之处在于普通return会返回值并终止函数的执行,而yield会返回一个值给 ...

  3. selenium切换iframe

    from selenium import webdriver br = webdriver.Chrome() br.get("tps://study.163.com/") ifra ...

  4. 第十二章 配置vlan

    一.vlan技术简介 1.广播风暴 广播风暴(broadcast storm)简单的讲是指当广播数据充斥网络无法处理,并占用大量网络带宽,导致正常业务不能运行,甚至彻底瘫痪,这就发生了"广播 ...

  5. Vue3: 如何以 Vite 创建,以 Vue Router, Vuex, Ant Design 开始应用

    本文代码: https://github.com/ikuokuo/start-vue3 在线演示: https://ikuokuo.github.io/start-vue3/ Vite 创建 Vue ...

  6. Codeforces Round #677 (Div. 3) D/1433D Districts Connection

    https://codeforces.com/contest/1433/problem/D 找两个不同权值的节点A.B连起来,所有与A不同权值的连到A上,相同的连到B上. #include<io ...

  7. Java中的String到底占用多大的内存空间?你所了解的可能都是错误的!!

    写在前面 最近小伙伴加群时,我总是问一个问题:Java中的String类占用多大的内存空间?很多小伙伴的回答着实让我哭笑不得,有说不占空间的,有说1个字节的,有说2个字节的,有说3个字节的,有说不知道 ...

  8. java中继承和多态

    转自原文http://blog.csdn.net/xinxin19881112/article/details/2944760 若冒犯博主,请勿见怪! 1.  什么是继承,继承的特点? 子类继承父类的 ...

  9. .Net Core实现基于Quart.Net的任务管理

    前段时间给公司项目升级.net框架,把原先的任务管理平台用.net core实现,现做如下整理: 一.实现思路 之前的实现也是参考了博客园中其他文章实现的思路: 一个任务定义一个实现IJob接口的类, ...

  10. 八皇后C++版本

    emmmm~刚刚学C++,写一个八皇后,凑合看吧嘤嘤嘤 1 #include <iostream> 2 #include<cstdlib> 3 #include<cmat ...