粘包只会出现在tcp,udp传输不会产生粘包现象。解决粘包的原理就是服务器预先向客户端发送客户端即将获取文件的大小。

第一版解决方案:

服务器:

 # Author : Kelvin
# Date : 2019/2/2 17:38
from socket import *
import subprocess ip_conf = ("127.0.0.1", 8888)
buffer_capacity = 1024
tcp_server = socket(AF_INET, SOCK_STREAM)
tcp_server.bind(ip_conf)
tcp_server.listen(5)
while True:
conn, addr = tcp_server.accept()
while True:
try:
cmd = conn.recv(buffer_capacity) # 如果强制断开连接会触发try,try正是解决强制中断连接的问题
print("收到的cmd:%s" % cmd)
if not cmd: # 如果使用quit断开连接,服务器会死循环收到空,该判断正是解决此问题
break
res = subprocess.Popen(cmd.decode("utf8"), shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE,
stderr=subprocess.PIPE)
err = res.stderr.read()
if err:
back_msg = err
else:
back_msg = res.stdout.read()
if not back_msg:
back_msg = "acute successful!".encode("gbk")
length = len(back_msg)
conn.send(str(length).encode("gbk"))
re_ready = conn.recv(buffer_capacity).decode("utf8")
if re_ready == "ready":
conn.send(back_msg)
except Exception as e:
print(e)
break
tcp_server.close()

客户端:

 # Author : Kelvin
# Date : 2019/2/2 17:38
from socket import * ip_conf = ("127.0.0.1", 8888)
buffer_capacity = 1024
tcp_client = socket(AF_INET, SOCK_STREAM)
tcp_client.connect(ip_conf)
while True:
cmd = input("Please input cmd : ")
if not cmd:
continue
if cmd == "quit":
break
tcp_client.send(cmd.encode("utf8"))
re_size = int(tcp_client.recv(buffer_capacity).decode("utf-8"))
print("大小:", re_size)
tcp_client.send("ready".encode("utf8"))
recved_size = 0
recved_data = b""
while recved_size < re_size:
recved_data += tcp_client.recv(buffer_capacity)
recved_size = len(recved_data)
back_msg = recved_data.decode("gbk")
print(back_msg)
tcp_client.close()

升级版:

服务器:

 # Author : Kelvin
# Date : 2019/2/2 17:38
from socket import *
import subprocess
import struct ip_conf = ("127.0.0.1", 8888)
buffer_capacity = 1024
tcp_server = socket(AF_INET, SOCK_STREAM)
tcp_server.bind(ip_conf)
tcp_server.listen(5)
while True:
conn, addr = tcp_server.accept()
while True:
try:
cmd = conn.recv(buffer_capacity) # 如果强制断开连接会触发try,try正是解决强制中断连接的问题
print("收到的cmd:%s" % cmd)
if not cmd: # 如果使用quit断开连接,服务器会死循环收到空,该判断正是解决此问题
break
res = subprocess.Popen(cmd.decode("utf8"), shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE,
stderr=subprocess.PIPE)
err = res.stderr.read()
if err:
back_msg = err
else:
back_msg = res.stdout.read()
if not back_msg:
back_msg = "acute successful!".encode("gbk")
length = len(back_msg)
re_length = struct.pack("i", length)
conn.send(re_length)
conn.send(back_msg)
except Exception as e:
print(e)
break
tcp_server.close()

客户端:

 # Author : Kelvin
# Date : 2019/2/2 17:38
from socket import *
import struct
ip_conf = ("127.0.0.1", 8888)
buffer_capacity = 1024
tcp_client = socket(AF_INET, SOCK_STREAM)
tcp_client.connect(ip_conf)
while True:
cmd = input("Please input cmd : ")
if not cmd:
continue
if cmd == "quit":
break
tcp_client.send(cmd.encode("utf8"))
re_size = struct.unpack("i",tcp_client.recv(4))[0]
print("大小:", re_size)
recved_size = 0
recved_data = b""
while recved_size < re_size:
recved_data += tcp_client.recv(buffer_capacity)
recved_size = len(recved_data)
back_msg = recved_data.decode("gbk")
print(back_msg)
tcp_client.close()

tcp套接字粘包解决办法的更多相关文章

  1. django在启动时抛出Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试 解决办法

    1.适用场景 在启动某个服务的时候,比如python中django启动的时候8000端口被占用,导致无法启动服务. 2.解决办法 通过命令行找出端口对应的PID进程 C:\Users\micha> ...

  2. Python之路(第三十一篇) 网络编程:简单的tcp套接字通信、粘包现象

    一.简单的tcp套接字通信 套接字通信的一般流程 服务端 server = socket() #创建服务器套接字 server.bind() #把地址绑定到套接字,网络地址加端口 server.lis ...

  3. python中TCP协议中的粘包问题

    TCP协议中的粘包问题 1.粘包现象 基于TCP实现一个简易远程cmd功能 #服务端 import socket import subprocess sever = socket.socket() s ...

  4. TCP套接字端口复用SO_REUSEADDR

    下面建立的套接字都是tcp套接字 1.进程创建监听套接字socket1,邦定一个指定端口,并接受了若干连接.那么进程创建另外一个套接口socket2,并试图邦定同一个端口时候,bind错误返回“Add ...

  5. LINUX TCP套接字详细配置

    提高服务器的负载能力,是一个永恒的话题.在一台服务器CPU和内存资源额定有限的情况下,最大的压榨服务器的性能,是最终的目的.要提高 Linux系统下的负载能力,可以先启用Apache的Worker模式 ...

  6. 套接字编程相关函数(2:TCP套接字编程相关函数)

    本文摘录自<UNIX网络编程 卷1>. 基本套接字函数 socket函数 为了执行网络I/O,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型.其定义如下: #in ...

  7. TCP套接字编程模型及实例

    摘要:     本文讲述了TCP套接字编程模块,包括服务器端的创建套接字.绑定.监听.接受.读/写.终止连接,客户端的创建套接字.连接.读/写.终止连接.先给出实例,进而结合代码分析. PS:本文权当 ...

  8. Python进阶----粘包,解决粘包(旗舰版)

    Python进阶----粘包,解决粘包(旗舰版) 一丶粘包 只有TCP有粘包现象,UDP永远不会粘包 什么是粘包     存在于客户端接收数据时,不能一次性收取全部缓冲区中的数据.当下一次再有数据来时 ...

  9. TCP套接字编程

    一.套接字(socket)函数 图1给出了在一个TCP客户与服务器通信的流程.服务器首先启动,稍后某个客户启动,它试图连接到服务器.假设客户给服务器发送一个请求,服务器处理该请求,并且给客户发回一个相 ...

随机推荐

  1. Codable实现json转Model,是时候干掉HandyJSON了!

    自从开始使用Swift做项目,一直都在使用HandyJSON,不可否认,HandyJSON在Swift4.0是个好东西,也尝试过其它json转mode的工具,最终发现还是HandyJSON最好用. 去 ...

  2. java8完全解读二

    继续着上次的java完全解读一 继续着上次的java完全解读一1.强大的Stream API1.1什么是Stream1.2 Stream操作的三大步骤1.2.1 创建Stream1.2.2 Strea ...

  3. memcached command

    http://lzone.de/cheat-sheet/memcached memcached Cheat Sheet Telnet Interface How To Connect Use &quo ...

  4. JS 小技巧整理

    一.javascript中调用函数并不一定严格执行指定的参数个数.(函数定义时的参数个数和调时指定的参数个数并不一定要相等) function showInfo(arg1) { var defindl ...

  5. MySQL技术内幕 InnoDB存储引擎(笔记)

    1. InnoDB 体系架构 其中,后台程序主要负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据. 此外将已经修改的数据刷新到磁盘文件,同时保证在数据库发生异常的时候Innodb能恢复正常 ...

  6. python库pandas简介

    pandas是基于numpy的数据分析模块,提供了大量标准模型和高效操作大型数据集所需要的工具. pandas主要提供了3种数据结构:1.Series,带标签的一维数组:2.DataFrame,带标签 ...

  7. 1、学习笔记之——html

    这篇学习笔记是在看一些教学视频学习时所记,可能比较乱,就当是自己以后复习的资料好了. <!doctype html> <html> <head> <meta ...

  8. 杨老师课堂之JavaScript定时器_农夫山泉限时秒杀案例

    预览效果图: 使用到的知识点: 定时器 setInterval(函数,毫秒):在指定的毫秒数后调用函数或执行一段代码 取消定时器 clearInterval:取消由setInterval设置的定时器 ...

  9. 高质量的内容是SEO的关键

    内容是最有效的SEO策略,但也是最难执行的 正确的目录对SEO(搜索引擎优化:search engine optimization)关乎重大.根据Ascend2在2014年4月对全球营销专业人士做的调 ...

  10. Python高级教程

    关键字is 和 == 的区别 a = 'hello world' b = 'hello world' a == b #返回True a is b #返回False 注意:is 判断是否是一个ID, = ...