黏包现象之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),它是内存空间的一部分.也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区,显然缓冲区是具有一定大小的 ...
随机推荐
- 探索ASP.NET Core中的IStartupFilter
原文:Exploring IStartupFilter in ASP.NET Core 作者:Andrew Lock 译者:Lamond Lu 在本篇博客中,我将介绍一下IStartupFilter, ...
- sql server 性能调优之 死锁排查
一.概述 记得以前客户在使用软件时,有偶发出现死锁问题,因为发生的时间不确定,不好做问题的重现,当时解决问题有点棘手了.现总结下查看死锁的常用二种方式. 1.1 第一种是图形化监听: sqlserve ...
- #5 Python面向对象(四)
前言 本节将是Python面向对象的最后一篇博文了,这节将记录类的特殊方法.特殊成员方法.旧类和新类的不同,以及一些其他知识.Go! 一.类的特殊方法 Python有三种特殊方法:实例方法.静态方法. ...
- django中url路由配置及渲染方式
今天我们学习如何配置url.如何传参.如何命名.以及渲染的方式,内容大致有以下几个方面. 创建视图函数并访问 创建app django中url规则 捕获参数 路径转换器 正则表达式 额外参数 渲染方式 ...
- Docker中安装WordPress
前言 虚拟化技术风靡一时,还不层在生产环境中实践.只能是闭门造车,自己玩一玩了,接触了一下docker最简单的命令,这才自己搭建一个wordpress玩一玩. 安装wordpress之前先把本机的do ...
- C语言之递归
递归例子如下: #include <stdio.h> /*函数声明*/ void digui(int n); int main() { ; digui(n); ; } void digui ...
- iOS 字典实现原理
在目前的开发中,NSDictionary是经常被使用,不过很少人会研究字典NSDictionary底层的实现,下面我们来一起看一下NSDictionary的实现原理. 一.字典原理 字典通过使用- ( ...
- .NET Core整理之配置EFCore
1.新建ASP.NET Core Web应用程序 2.从NuGet下载安装以下工具包 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCo ...
- web中的——作者也不知道这里面写的啥
1.使用超链接<a href="/Default/Index">添加</a><a href="#">返回显示信息</a ...
- [MySQL] 联合索引与using index condition
1.测试联合索引的最左原则的时候, 发现了5.6版本后的新特性Index Condition Pushdown 2.含义就是存储引擎层根据索引尽可能的过滤数据,然后在返回给服务器层根据where其他条 ...