博客
关于我
【Python】网络编程--解决粘包问题--简单版:
阅读量:366 次
发布时间:2019-03-04

本文共 1883 字,大约阅读时间需要 6 分钟。

网络编程–解决粘包问题–简单版:

客户端:

import structimport socketphone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)phone.connect(('127.0.0.1',9909))while True:    # 1:发命令    cmd=input('>>:').strip()#dir    if not cmd:continue    phone.send(cmd.encode('utf-8'))    # 2:拿命令的结果,并打印    #第一步:先收报头    header=phone.recv(4)    # 第二步:从报头中解析出来对真实数据的描述信息(数据的长度)    total_size=struct.unpack('i',header)[0]    #第三步:接收真实的数据    recv_size=0    recv_data=b''     #循环接收数据,直到接收完全部数据跳出循环    while recv_size 

服务端:

import socketimport subprocessimport structphone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)phone.bind(('127.0.0.1',9909))phone.listen(5)print('starting..')while True:#链接循环    conn,client_addr=phone.accept()    print(client_addr)    while True:         try:             #1:收命令             cmd=conn.recv(8096)                 if not cmd:break#适用于linux操作系统                 # 2:执行命令,拿到结果             # subprocess.Popen通过它可以来创建进程,并与其进行复杂的交互             # cmd:标准像子进程传入需要执行的shell命令,如:ls - al             #             # subprocess.PIPE:在创建Popen对象时,subprocess.PIPE可以初始化为stdin, stdout或stderr的参数,表示与子进程通信的标准输入流,标准输出流以及标准错误。             #             # subprocess.STDOUT:作为Popen对象的stderr的参数,表示将标准错误通过标准输出流输出。                 obj=subprocess.Popen(cmd.decode('utf-8'),shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)             stdout=obj.stdout.read()             stderr=obj.stderr.read()                 # 3:把命令的结果返回给客户端             # 第一步:制作固定长度的报头             total_size=len(stdout)+len(stderr)             header=struct.pack('i',total_size)                          # 第二步:把报头发送给客户端             conn.send(header)                          # 第三步:在发送真实的数据             conn.send(stdout)             conn.send(stdout)         # 适用于Windows操作系统         except ConnectionResetError:             break                 conn.close()phone.close()

1:先启动服务端,在从客户端传入数据:

服务端:
在这里插入图片描述
客户端:
在这里插入图片描述:
2:传入数据后,在客户端输入命令或者数据:
客户端:
在这里插入图片描述
服务端:
在这里插入图片描述

转载地址:http://fpyg.baihongyu.com/

你可能感兴趣的文章
Mysql学习总结(62)——MySQL连接com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link问题
查看>>
Mysql学习总结(63)——Mysql数据库架构方案选择与分析
查看>>
Mysql学习总结(64)——Mysql配置文件my.cnf各项参数解读
查看>>
Mysql学习总结(65)——项目实战中常用SQL实践总结
查看>>
Mysql学习总结(66)——设置MYSQL数据库编码为UTF-8
查看>>
Mysql学习总结(67)——MYSQL慢查询日志
查看>>
Mysql学习总结(68)——MYSQL统计每天、每周、每月、每年数据 SQL 总结
查看>>
Mysql学习总结(69)——Mysql EXPLAIN 命令使用总结
查看>>
Mysql学习总结(6)——MySql之ALTER命令用法详细解读
查看>>
Mysql学习总结(70)——MySQL 优化实施方案
查看>>
Mysql学习总结(71)——MySQL 重复记录查询与删除总结
查看>>
Mysql学习总结(71)——数据库介绍(MySQL安装 体系结构、基本管理)再回顾
查看>>
Mysql学习总结(73)——MySQL 查询A表存在B表不存在的数据SQL总结
查看>>
Mysql学习总结(76)——MySQL执行计划(explain)结果含义总结
查看>>
Mysql学习总结(77)——温故Mysql数据库开发核心原则与规范
查看>>
Mysql学习总结(78)——MySQL各版本差异整理
查看>>
Mysql学习总结(79)——MySQL常用函数总结
查看>>
Mysql学习总结(7)——MySql索引原理与使用大全
查看>>
Mysql学习总结(80)——统计数据库的总记录数和库中各个表的数据量
查看>>
Mysql学习总结(81)——为什么MySQL不推荐使用uuid或者雪花id作为主键?
查看>>