python3 解决tcp黏包方法一

-------------------------------------------tcp_server.py-------------------------------------------
# coding:utf-8import socketimport subprocess

server = socket.socket()ip_port = ("127.0.0.1", 8001)server.bind(ip_port)server.listen(5)

conn, addr = server.accept()from_client_msg = conn.recv(1024)print("来自客户端的消息:", from_client_msg.decode("utf-8"))cmd = input(">>>:").strip()res = subprocess.Popen(    cmd,    shell=True,    stdout=subprocess.PIPE,    stderr=subprocess.PIPE,)cmd_result = res.stdout.read()if res.stderr.read():    cmd_result = res.stderr.read()cmd_result_len = len(cmd_result)print(cmd_result_len)conn.send(str(cmd_result_len).encode("utf-8"))  # 先发送数据的长度from_client_msg = conn.recv(1024)if from_client_msg.decode("utf-8") == "recv_ready":    conn.sendall(cmd_result)  # 再发送真实数据

conn.close()server.close()


-------------------------------------------tcp_client.py-------------------------------------------



# coding:utf-8import socket

client = socket.socket()ip_port = ("127.0.0.1", 8001)client.connect(ip_port)

client.send("我是客户端.".encode("utf-8"))from_serve_msg = client.recv(1024)  # 接收数据长度print("来自服务端的消息:", from_serve_msg.decode("utf-8"))if from_serve_msg.decode("utf-8").isdigit():    from_serve_msg_len = int(from_serve_msg)    client.send("recv_ready".encode("utf-8"))    from_serve_msg = client.recv(from_serve_msg_len)  # 接收真实数据    recv_ready_len = len(from_serve_msg)    while from_serve_msg_len > recv_ready_len:  # 如果真实数据一次没有接收完        from_serve_msg += client.recv(from_serve_msg_len)  # 继续接收数据        recv_ready_len = len(from_serve_msg)

    print("来自客户端的消息:", from_serve_msg.decode("gbk"))

client.close() 

 

原文地址:https://www.cnblogs.com/lilyxiaoyy/p/10929947.html

时间: 2024-08-30 15:18:22

python3 解决tcp黏包方法一的相关文章

netty]--最通用TCP黏包解决方案

netty]--最通用TCP黏包解决方案:LengthFieldBasedFrameDecoder和LengthFieldPrepender 2017年02月19日 15:02:11 惜暮 阅读数:14555 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010853261/article/details/55803933 前面已经说过: TCP以流的方式进行数据传输,上层应用协议为了对消息进行区分,往往采用如下4种方式. (1)消息长度固定

Netty中LineBasedFrameDecoder解码器使用与分析:解决TCP粘包问题

[toc] Netty中LineBasedFrameDecoder解码器使用与分析:解决TCP粘包问题 上一篇文章<Netty中TCP粘包问题代码示例与分析>演示了使用了时间服务器的例子演示了TCP的粘包问题,这里使用LineBasedFrameDecoder就是用来解决这个问题的. 不过需要注意的是,LineBasedFrameDecoder见名知其义,可见其是与行相关的,而在前面演示TCP粘包问题时,作者是有意在发送的消息中都加入了换行符,目的也是为了在后面去讲解LineBasedFram

python tcp黏包和解决方法

一.TCP协议 粘包现象 和解决方案 黏包现象让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd)执行远程命令的模块 需要用到模块subprocess subprocess通过子进程来执行外部指令,并通过input/output/error管道,获取子进程的执行的返回信息. import subprocess sub_obj = subprocess.Popen( 'ls', #系统指令 shell=True, #固定 stdout=subprocess

四. 网络编程(TCP 黏包)

一 .黏包现象(TCP) 1.黏包成因 TCP协议中的数据传递 tcp协议的拆包机制 当发送端缓冲区的长度大于网卡的MTU时,tcp会将这次发送的数据拆成几个数据包发送出去. MTU是Maximum Transmission Unit的缩写.意思是网络上传送的最大数据包.MTU的单位是字节. 大部分网络设备的MTU都是1500.如果本机的MTU比网关的MTU大,大的数据包就会被拆开来传送,这样会产生很多数据包碎片,增加丢包率,降低网络速度 面向流的通信特点和Nagle算法 TCP(transpo

netty 解决TCP粘包与拆包问题(二)

TCP以流的方式进行数据传输,上层应用协议为了对消息的区分,采用了以下几种方法. 1.消息固定长度 2.第一篇讲的回车换行符形式 3.以特殊字符作为消息结束符的形式 4.通过消息头中定义长度字段来标识消息的总长度 一.采用指定分割符解决粘包与拆包问题 服务端 1 package com.ming.netty.nio.stickpack; 2 3 4 5 import java.net.InetSocketAddress; 6 7 import io.netty.bootstrap.ServerB

Netty解决TCP粘包/拆包问题 - 按行分隔字符串解码器

服务端 package org.zln.netty.five.timer; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; impo

netty解决tcp粘包拆包问题

tcp粘包拆包解决方案 1.发送定长的消息 server端:                    EventLoopGroup pGroup = new NioEventLoopGroup(); EventLoopGroup cGroup = new NioEventLoopGroup(); ServerBootstrap b = new ServerBootstrap(); b.group(pGroup, cGroup)  .channel(NioServerSocketChannel.cl

python全栈开发基础【补充】解决tcp粘包

一.什么是粘包 须知:只有TCP有粘包现象,UDP永远不会粘包 粘包不一定会发生 如果发生了:1.可能是在客户端已经粘了 2.客户端没有粘,可能是在服务端粘了 首先需要掌握一个socket收发消息的原理 应用程序所看到的数据是一个整体,或说是一个流(stream),一条消息有多少字节对应用程序是不可见的,因此TCP协议是面向流的协议,这也是容易出现粘包问题的原因.(因为TCP是流式协议,不知道啥时候开始,啥时候结束).而UDP是面向消息的协议,每个UDP段都是一条消息,应用程序必须以消息为单位提

netty 解决TCP粘包与拆包问题(三)

今天使用netty的固定长度进行解码 固定长度解码的原理就是按照指定消息的长度对消息自动解码. 在netty实现中,只需要采用FiexedLengthFrameDecoder解码器即可... 以下是服务端代码 1 package com.ming.netty.nio.stickpack; 2 3 4 5 import java.net.InetSocketAddress; 6 7 import io.netty.bootstrap.ServerBootstrap; 8 import io.net