tcp套接字粘包解决办法
粘包只会出现在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套接字粘包解决办法的更多相关文章
- django在启动时抛出Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试 解决办法
1.适用场景 在启动某个服务的时候,比如python中django启动的时候8000端口被占用,导致无法启动服务. 2.解决办法 通过命令行找出端口对应的PID进程 C:\Users\micha> ...
- Python之路(第三十一篇) 网络编程:简单的tcp套接字通信、粘包现象
一.简单的tcp套接字通信 套接字通信的一般流程 服务端 server = socket() #创建服务器套接字 server.bind() #把地址绑定到套接字,网络地址加端口 server.lis ...
- python中TCP协议中的粘包问题
TCP协议中的粘包问题 1.粘包现象 基于TCP实现一个简易远程cmd功能 #服务端 import socket import subprocess sever = socket.socket() s ...
- TCP套接字端口复用SO_REUSEADDR
下面建立的套接字都是tcp套接字 1.进程创建监听套接字socket1,邦定一个指定端口,并接受了若干连接.那么进程创建另外一个套接口socket2,并试图邦定同一个端口时候,bind错误返回“Add ...
- LINUX TCP套接字详细配置
提高服务器的负载能力,是一个永恒的话题.在一台服务器CPU和内存资源额定有限的情况下,最大的压榨服务器的性能,是最终的目的.要提高 Linux系统下的负载能力,可以先启用Apache的Worker模式 ...
- 套接字编程相关函数(2:TCP套接字编程相关函数)
本文摘录自<UNIX网络编程 卷1>. 基本套接字函数 socket函数 为了执行网络I/O,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型.其定义如下: #in ...
- TCP套接字编程模型及实例
摘要: 本文讲述了TCP套接字编程模块,包括服务器端的创建套接字.绑定.监听.接受.读/写.终止连接,客户端的创建套接字.连接.读/写.终止连接.先给出实例,进而结合代码分析. PS:本文权当 ...
- Python进阶----粘包,解决粘包(旗舰版)
Python进阶----粘包,解决粘包(旗舰版) 一丶粘包 只有TCP有粘包现象,UDP永远不会粘包 什么是粘包 存在于客户端接收数据时,不能一次性收取全部缓冲区中的数据.当下一次再有数据来时 ...
- TCP套接字编程
一.套接字(socket)函数 图1给出了在一个TCP客户与服务器通信的流程.服务器首先启动,稍后某个客户启动,它试图连接到服务器.假设客户给服务器发送一个请求,服务器处理该请求,并且给客户发回一个相 ...
随机推荐
- Ocelot中文文档-服务发现
Ocelot允许您指定服务发现提供程序,并使用它来查找Ocelot正在将请求转发给下游服务的主机和端口.目前,这仅在GlobalConfiguration部分中受支持,这意味着所有ReRoute将使用 ...
- Python 3 利用 Dlib 19.7 实现摄像头人脸识别
0.引言 利用python开发,借助Dlib库捕获摄像头中的人脸,提取人脸特征,通过计算欧氏距离来和预存的人脸特征进行对比,达到人脸识别的目的: 可以自动从摄像头中抠取人脸图片存储到本地: 根据抠取的 ...
- hive 分组排序,topN
hive 分组排序,topN 语法格式:row_number() OVER (partition by COL1 order by COL2 desc ) rankpartition by:类似hiv ...
- 如何更好的编写async函数
2018年已经到了5月份,node的4.x版本也已经停止了维护 我司的某个服务也已经切到了8.x,目前正在做koa2.x的迁移 将之前的generator全部替换为async 但是,在替换的过程中,发 ...
- 【ASP.NET MVC系列】浅谈ASP.NET MVC八大类扩展(上篇)
lASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操 ...
- Spring Security 集成 CAS(基于HTTP协议版本)
Spring Security 集成 CAS(基于HTTP协议版本) 近段时间一直研究Spring Security 集成 CAS,网上资料相关资料也很多,不过大都是基于Https的安全认证;使用ht ...
- https://doc.opensuse.org/projects/kiwi/doc/
KIWI 是用于创建操作系统映像的系统.映像是带有一个文件的目录,该文件包含操作系统.其应用程序与配置.操作系统的文件系统结构.可能的附加元数据,以及(取决于映像类型)磁盘几何属性和分区表数据.通过 ...
- PHP之cookies小练习
//5-1.php 1 <? error_reporting(E_ALL ^ E_NOTICE); if ($_COOKIE['username']!="") { echo ...
- 在Linux上使用PGP签名验证文件完整性
文件在下载及存储过程中可能由于传输错误.硬件故障.文件系统错误等网络.硬件和软件方面的原因导致文件损坏,也可能在传输过程中受到攻击(如"中间人攻击")导致下载的文件被篡改或者下载到 ...
- Docker for windows on VMware
工作环境 操作系统:Windows 10 Pro x64 Hyper-V:已卸载. VMware:已安装. Virtual Box:无安装. 前言 鉴于Hyper-V在Windows桌面系统下的&qu ...