当前位置:
首页 > temp > 简明python教程 >
-
python基础(30):黏包、socket的其他方法
1. 黏包
1.1 黏包现象
让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd)
同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接收到之前执行的另外一部分结果,这种显现就是黏包。
1.1.1 基于TCP协议实现的黏包
server:
- #_*_coding:utf-8_*_
- from socket import *
- import subprocess
- ip_port=('127.0.0.1',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(5)
- while True:
- conn,addr=tcp_socket_server.accept()
- print('客户端',addr)
- while True:
- cmd=conn.recv(BUFSIZE)
- if len(cmd) == 0:break
- res=subprocess.Popen(cmd.decode('utf-8'),shell=True,
- stdout=subprocess.PIPE,
- stdin=subprocess.PIPE,
- stderr=subprocess.PIPE)
- stderr=res.stderr.read()
- stdout=res.stdout.read()
- conn.send(stderr)
- conn.send(stdout)
client:
- #_*_coding:utf-8_*_
- import socket
- BUFSIZE=1024
- ip_port=('127.0.0.1',8888)
- s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- res=s.connect_ex(ip_port)
- while True:
- msg=input('>>: ').strip()
- if len(msg) == 0:continue
- if msg == 'quit':break
- s.send(msg.encode('utf-8'))
- act_res=s.recv(BUFSIZE)
- print(act_res.decode('utf-8'),end='')
1.1.2 基于UDP协议实现的黏包
server:
- #_*_coding:utf-8_*_
- from socket import *
- import subprocess
- ip_port=('127.0.0.1',9000)
- bufsize=1024
- udp_server=socket(AF_INET,SOCK_DGRAM)
- udp_server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
- udp_server.bind(ip_port)
- while True:
- #收消息
- cmd,addr=udp_server.recvfrom(bufsize)
- print('用户命令----->',cmd)
- #逻辑处理
- res=subprocess.Popen(cmd.decode('utf-8'),shell=True,stderr=subprocess.PIPE,stdin=subprocess.PIPE,stdout=subprocess.PIPE)
- stderr=res.stderr.read()
- stdout=res.stdout.read()
- #发消息
- udp_server.sendto(stderr,addr)
- udp_server.sendto(stdout,addr)
- udp_server.close()
client:
- from socket import *
- ip_port=('127.0.0.1',9000)
- bufsize=1024
- udp_client=socket(AF_INET,SOCK_DGRAM)
- while True:
- msg=input('
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数