黏包现象之TCP
老师的博客:http://www.cnblogs.com/Eva-J/articles/8244551.html#_label5
server
#_*_coding:gbk*_
from socket import *
import subprocess ip_port=('192.168.43.155',8888)
BUFSIZE=1024 tcp_socket_server=socket(AF_INET,SOCK_STREAM)
tcp_socket_server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
tcp_socket_server.bind(ip_port)
tcp_socket_server.listen(1) while True:
conn,addr=tcp_socket_server.accept()
print('客户端',addr) while True:
cmd=conn.recv(BUFSIZE)
print(cmd.decode('gbk'))
if len(cmd) == 0:break
res=subprocess.Popen(cmd.decode('gbk'),shell=True,bufsize=1,
stdout=subprocess.PIPE, #标准输出
stdin=subprocess.PIPE,#标准输入
stderr=subprocess.PIPE) #标准错误 stderr=res.stderr.read()
print(stderr)
stdout=res.stdout.read()
print(stderr)
conn.send(stderr)
conn.send(stdout)
conn.close()
client
#_*_coding:gbk*_
import socket
BUFSIZE=10240
ip_port=('192.168.43.155',8888) s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect_ex(ip_port) while True:
msg=input('>>: ').strip()
if len(msg) == 0:continue
if msg == 'quit':break s.send(msg.encode('gbk'))
act_res=s.recv(BUFSIZE) print(act_res.decode('gbk'),end='')
不知道怎么回事。clientd端运行 ipconfig/all , python 这样的文件时收不到返回值,而随便输入的错误的代码却能够正常的返回错误的的信息。
找到原因了
原因是因为TCP的算法优化,出现了黏包现象,当我两次发送的字节没有1024时候,由于算法的优化,所以一次接受了,然后第二次就没有东西可以接受了,就一直等待然后就开在哪里,把接受方的改为以一次接受就好。
PIPE相当队列和迭代器只能用一次。
但是新的问题又来了,下面请看代码
server
import socket
import subprocess
server=socket.socket()
ip_port=('192.168.43.155',8890)
server.bind(ip_port)
server.listen()
client,address=server.accept()
while 1:
ret= client.recv(1024).decode('gbk')
if ret=='bye':break
get= subprocess.Popen(ret,shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
get_out=get.stdout.read()#默认gbk
get_err=get.stderr.read()
client.send(get_out)
print(get_out)
client.send(get_err)
print(get_err)
server.close()
client
import socket
client=socket.socket()
ip_port=('192.168.43.155',8890)
client.connect(ip_port)
while 1:
conformation=bytes(input('<<:').encode('gbk'))
if conformation=='bye':break
client.send(conformation)
message=client.recv(1024).decode('gbk')
# message2=client.recv(1024).decode('gbk')#不能这么写,因为接受了大约两条信息,如果前面发送
# 信息小于1024,便会一直等待,结果便会一直等带接受消息,而server端又没有发送消息,便会一直等待,
# 不会执行后面的代码而卡在这里
print('server out:',message)
client.close()
在执行代码时,竟然出现编码错误的现象,不知道是怎么回事,在接受方出现以下报错
UnicodeDecodeError: 'gbk' codec can't decode byte 0xd2 in position 1023: incomplete multibyte sequence
按理说:windows的cmd的默认编码方式就是jbk 但是再接解码的时候1023个字节竟然出下了报错,意思是gbk解码方式尽然不能解码。我也不知道为什么。
现在知道了解决方法,就是把1024改为2048或者4096都可以正常的运行。
但是我还是不知道原因是什么,难带排序错误了?
黏包现象之TCP的更多相关文章
- Python网络编程基础 ❷ 基于upd的socket服务 TCP黏包现象
TCP的长连接 基于upd的socket服务 TCP黏包现象
- 铁乐学Python_Day34_Socket模块2和黏包现象
铁乐学Python_Day34_Socket模块2和黏包现象 套接字 套接字是计算机网络数据结构,它体现了C/S结构中"通信端点"的概念. 在任何类型的通信开始之前,网络应用程序必 ...
- python黏包现象
#黏包:发送端发送数据,接收端不知道应如何去接收造成的一种数据混乱现象. #关于分包和黏包: #黏包:发送端发送两个字符串"hello"和"word",接收方却 ...
- python中黏包现象
#黏包:发送端发送数据,接收端不知道应如何去接收造成的一种数据混乱现象. #关于分包和黏包: #黏包:发送端发送两个字符串"hello"和"word",接收方却 ...
- python 黏包现象
一.黏包 1.tcp有黏包现象 表现两种情况 发送的数据过小且下面还有一个发送数据,这两个数据会一起发送 发送的数据过大,超过最大缓存空间,超出的部分在下一次发送的时候发送 原因: tcp是面向流的, ...
- Python 之网络编程之socket(2)黏包现象和socketserver并发
一:黏包 ###tcp协议在发送数据时,会出现黏包现象. (1)数据粘包是因为在客户端/服务器端都会有一个数据缓冲区, 缓冲区用来临时保存数据,为了保证能够完整的接收到数据,因此缓冲区 ...
- Py-解决粘包现象,tcp实现并发,tcp实现传输文件的程序,校验思路,线程与进程
黏包现象 TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾,出现粘包的原因是多方面的,可能是来自发送方,也可能是来自接收方TCP接收到 ...
- socket套接字模块及黏包现象
一.socket套接字模块 socket概念 socket层 理解socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模 ...
- python 黏包现象及其解决方案
一.数据缓冲区 缓冲区(buffer),它是内存空间的一部分.也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区,显然缓冲区是具有一定大小的 ...
随机推荐
- 【Maven】---Linux搭建Nexus3.X私服
Linux搭建Nexus3.X私服 备注:linux版本: ubuntu 同时已经部署好JDK8环境 一.linux安装nexus 1.创建文件夹并进入该目录 cd /usr/local && ...
- C++版 - 剑指offer面试题14: 调整数组顺序使奇数位于偶数前面
题目: 调整数组顺序使奇数位于偶数前面 热度指数:11843 时间限制:1秒 空间限制:32768K 本题知识点: 数组 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇 ...
- IntelliJ IDEA中创建Web聚合项目(Maven多模块项目)
Eclipse用多了,IntelliJ中创建Maven聚合项目可能有小伙伴还不太熟悉,我们今天就来看看. IntelliJ中创建普通的Java聚合项目相对来说比较容易,不会涉及到web操作,涉及到we ...
- 什么是Web Server
WebService到底是什么? 一言以蔽之:WebService是一种跨编程语言和跨操作系统平台的远程调用技术. WebService平台技术 XML+XSD,SOAP和WSDL就是构成WebSer ...
- 带着萌新看springboot源码8(spring ioc源码 完)
上一节说到实例化了所有的单实例Bean,后面还有一步遍历 12.完成容器刷新(finishRefresh();) 那个和生命周期有关的后置处理器类型是LifecycleProcessor:监听器原理我 ...
- OAuth2.0 原理简介
写在前面: 在正式介绍OAuth2.0之前我们先来看一个场景:小李是一个文艺小青年, 经常喜欢出去旅游并且把自己旅行中的美景照片分享到各大社交网站上,比如朋友圈,新浪微博.小李马上要向女朋友求婚了,他 ...
- PHP大法
Topic Link http://ctf5.shiyanbar.com/DUTCTF/index.php Notes: 1) 进去发现 根据提示查看是否存在.txt文件,打开之后发现有东西 2)分析 ...
- Oracle学习笔记二
多表查询: 笛卡尔积: 实际上是两张表的乘积,但是在实际开发中没有太大意义 格式: select * from 表1,表2 select * from emp; select * from dept; ...
- 程序员十大热门flag,有你的吗?
2018的尾声,南方人期盼已久的下雪天终于到了,实在是太鸡冻了! 而赏雪的喜悦也伴随着寒冷的忧伤 早上起床越来越难,衣服怎么裹都还是冷 这时,穿搭届的神话般的人物——程序员们,可能又要引起轰动了吧! ...
- Magicodes.NET框架之路——V0.0.0.5 Beta版发布
最近写代码的时间实在不多,而且今年又打算业余学习下Unity3D以及NodeJs(用于开发游戏后台),因此完善框架的时间更不多了.不过我会一直坚持下去的,同时我也希望有兴趣的同学可以加入Push你的代 ...