博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解决粘包问题-简单版
阅读量:6965 次
发布时间:2019-06-27

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

server----------------------

#!/usr/bin/env python
# encoding: utf-8  
# Date: 2018/6/5
import socket
import subprocess
import struct
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
phone.bind(('127.0.0.1', 8081))
phone.listen(5)
print('starting.......')
while True:  # 链接循环,保证客户端停止,服务端不停止,但是不支持并发
    conn, client_addr = phone.accept()
    print(client_addr)
    while True:
        try:  # window异常捕获
            # 1 接收命令
            cmd = conn.recv(1024)
            if not cmd:  # 适用于linux
                break  # 客户端断掉,发送空过来
            print('客户端的数据', cmd)
            # 2 执行命令,拿到结果
            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)
            # # print(len(stdout) + len(stderr))
            # total_size = len(stdout) + len(stderr)
            # conn.send(str(total_size).encode('utf-8'))
            # 第三步,再发送真实的数据
            conn.send(stdout)
            conn.send(stderr)
        except ConnectionResetError:
            break
    conn.close()
phone.close()
client-------------------
#!/usr/bin/env python
# encoding: utf-8  
# Date: 2018/6/5
import socket
import struct
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.connect(('127.0.0.1', 8081))
while True:
    # 1发命令
    cmd = input('>>>:').strip()
    if not cmd:continue
    phone.send(cmd.encode('utf-8')) # 应用程序发给操作系统,操作系统调用网卡
    # 那命令结果
    #  第一步:先收报头
    header = phone.recv(4)
    # 第二部:从包头中解析出对真实数据的描述信息(数据的长度)
    total_size = struct.unpack('i', header)[0]
    # 第三步:接收真实的数据
    recv_size = 0
    recv_data = b''
    while recv_size < total_size:
        res = phone.recv(1024)
        recv_data += res
        recv_size += len(res)
    print(res.decode('utf-8'))
phone.close()

转载于:https://www.cnblogs.com/fmgao-technology/p/9189443.html

你可能感兴趣的文章
C#委托(delegate)
查看>>
Android自动化测试中AccessibilityService获取控件信息(2)-三种方式对比
查看>>
设计模式汇总
查看>>
LR错误整理
查看>>
[Java web]Spring+Struts2+Hibernate整合过程
查看>>
在Linux安装MySQL
查看>>
POJ 2251-Dungeon Master (三维空间求最短路径)
查看>>
PBRT笔记(14)——光线传播2:体积渲染
查看>>
Git使用教程
查看>>
游戏蛮牛Unity 用户文档
查看>>
安装 asp.net core 出错
查看>>
【EMC】EMI滤波器
查看>>
wireshark抓包图解 TCP三次握手/四次挥手详解[转]
查看>>
第一章 数组与指针概念剖析
查看>>
知乎模拟登录 requests session
查看>>
php如何读出xml的节点内容 两个例子
查看>>
code第一部分数组:第十九题 矩阵元素为0,横列置零
查看>>
oracle小数点前零丢失解决方案
查看>>
CentOS 5.5 介绍
查看>>
Eclipse 变量高亮显示设置
查看>>