socketserver tcp黏包
socket (套接字)
tcp(黏包现象原因) 传输中由于内核区缓冲机制(等待时间,文件大小),会在 发送端 缓冲区合并连续send的数据,也会出现在 接收端 缓冲区合并recv的数据给指定port.
解决办法: 引入内置模块 struct ( 这个模块可以把要发送的数据长度转换成固定长度的字节。这样客户端每次接收消息之前只要先接受这个固定长度字节的内容看一看接下来要接收的信息大小,那么最终接受的数据只要达到这个值就停止,就能刚好不多不少的接收完整的数据了。)
该模块可以把一个类型,如数字,转成固定长度的bytes (2的32次方)
-2147483648 <= number <= 2147483647 #这个是范围
# 客户端
import time,struct
import socket
sk = socket.socket() sk.connect(('127.0.0.1',9000))
time.sleep(0.5)
num = struct.unpack('i',sk.recv(4)) print(sk.recv(num[0]).decode('utf-8'))
print(sk.recv(1024))
----------------------------
# 服务端
import time,struct
import socket
sk = socket.socket() sk.connect(('127.0.0.1',9000))
time.sleep(0.5) num = struct.unpack('i',sk.recv(4))
print(sk.recv(num[0]).decode('utf-8'))
print(sk.recv(1024))
socketserver
SocketServer内部使用 IO多路复用 以及 “多线程” 和 “多进程” ,从而实现并发处理多个客户端请求的Socket服务端。
即:每个客户端请求连接到服务器时,Socket服务端都会在服务器是创建一个“线程”或者“进程” 专门负责处理当前客户端的所有请求
# socketserver模块 上层模块 基于底层socket进一步改造,实现更多功能,tcp协议的server端的并发
# socket模块 所有网络服务的最底层 socket
import socketserver
class Myserver(socketserver.BaseRequestHandler):
def handle(self):
# 必须实现haddle方法
# 在简历连接之后所有内容都在haddle中实现就可以了
# ThreadingTCPServer 多线程处理了并发
print('-->','执行我啦')
conn = self.request
while True:
msg = conn.recv(1024).decode()
print(msg)
conn.send(msg.upper().encode())
server = socketserver.ThreadingTCPServer(('127.0.0.1',9000),Myserver)
server.serve_forever() #一直在执行
server.py
import socket
import time
sk = socket.socket() time.sleep(1)
sk.connect(('127.0.0.1',9000)) while True:
sk.send(b'hello')
msg = sk.recv(1024)
print(msg) sk.close()
client.py
socketserver tcp黏包的更多相关文章
- netty]--最通用TCP黏包解决方案
netty]--最通用TCP黏包解决方案:LengthFieldBasedFrameDecoder和LengthFieldPrepender 2017年02月19日 15:02:11 惜暮 阅读数:1 ...
- Python网络编程基础 ❷ 基于upd的socket服务 TCP黏包现象
TCP的长连接 基于upd的socket服务 TCP黏包现象
- python tcp黏包和struct模块解决方法,大文件传输方法及MD5校验
一.TCP协议 粘包现象 和解决方案 黏包现象让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd)执行远程命令的模块 需要用到模块subprocess sub ...
- TCP黏包问题
什么是黏包?什么情况下会出现黏包的情况?该如何避免黏包的情况? 首先来看一个例子 #服务端 import time from socket import * server = socket(AF_IN ...
- 网路编程之socket与 socketserver、黏包
socket与socketerver才是我们学习python中网络编程的重中之重在介绍他们两个之前我先介绍一些相关知识 一.socket 概念 咱们现在ois模型中找到socket所承担的角色 soc ...
- 038.Python关于TCP黏包问题
黏包现象 1 黏包现象演示 服务端 #服务端 import socket sk = socket.socket() # 注册主机到网络 sk.bind( ("127.0.0.1", ...
- tcp黏包问题与udp为什么不黏包
1.先说下subprocess模块的用法,为了举个黏包的例子 # 通过一个例子 来认识网络编程中的一个重要的概念 # 所有的客户端执行server端下发的指令,执行完毕后,客户端将执行结果给返回给服务 ...
- Linux tcp黏包解决方案
tcpip协议使用"流式"(套接字)进行数据的传输,就是说它保证数据的可达以及数据抵达的顺序,但并不保证数据是否在你接收的时候就到达,特别是为了提高效率,充分利用带宽,底层会使用缓 ...
- tcp黏包
转载https://www.cnblogs.com/wade-luffy/p/6165671.html 无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑TCP底层的粘包/拆包机制. 回 ...
随机推荐
- oracle 启动
Oracle数据库启动过程及状态详解(nomount.mount和open) 先来简要了解一下Oracle数据库体系架构以便于后面深入理解,Oracle Server主要由实例(instance)和数 ...
- linux中的oracle数据库
安装orcal http://www.cnblogs.com/nucdy/p/5603998.html 搭建Linux操作系统+Oracle数据库的环境 https://blog.csdn.net/p ...
- Python中的模块简单认识
将自己定义的方法,变量存放在文件中,为一些脚本或者交互式的解释器实例使用,这个文件称为模块. 细说的话,模块可以分为四个通用类别: 1 使用python编写的.py文件(自定义模块) 2 已被编译为共 ...
- Python—网络通信编程之tcp非阻塞通信(socketserver)
服务端代码 import socketserver # 定义一个类 class MyServer(socketserver.BaseRequestHandler): # 如果handle方法出现报错, ...
- MySQL起别名
好处: 便于理解 连接查询的时候,如果要查询的字段有重名的情况,使用别名可以区分开来 注意: 如果别名中有特殊符号 # 空格 ... ,需要用 "双引号" 把别名引起来单引号也行, ...
- python网络编程(通过tcp或者udp协议通信)
1.基于tcp协议传送文件: 客户端: import socketimport osimport jsonimport structclient = socket.socket()client.con ...
- 第三十八篇 入门机器学习——Numpy.array的基本操作——查看向量或矩阵
No.1. 初始化状态 No.2. 通过ndim来查看数组维数,向量是一维数组,矩阵是二维数组 No.3. 通过shape来查看向量中元素的个数或矩阵中的行列数 No.4. 通过size来查看数组中的 ...
- [termux Linux] termux不用ssh远程控制shell
前言 今天想在手机上测试python代码(termux),但是手机操作确实太麻烦了,所以就想试试用ssh来用电脑操作,但是网上说似乎不能用ip链接ssh 但是配置密钥文件有很麻烦.所以,我想了一个歪招 ...
- jumpserver 常见错误解决
官方链接:https://jumpserver.readthedocs.io/zh/master/faq_install.html 重启jumpserver后台 #cd /opt#python3.6 ...
- 一段讯飞、百度等语音识别API无法识别的语音最终解决办法
最近在做语音识别.字幕扒词相关的工作,遇到了一段录音(https://download.csdn.net/download/u014220286/12169183,各位有兴趣的可以下载下来试试),音质 ...