ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

socket__服务端于客户端

2021-05-20 18:05:43  阅读:152  来源: 互联网

标签:__ socket phone header conn total recv 服务端 size


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/8/23 15:33
# @Author  : Mr_zhang
# @Site    : 
# @File    : 服务端.py
# @Software: PyCharm

from socket import *
import subprocess,struct,json
phone = socket(AF_INET,SOCK_STREAM)
phone.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
phone.bind(('127.0.0.1',8080))
phone.listen(7)

print('startting....')       #程序运行
while True:
    conn,client_addr = phone.accept()       #等待链接,返回链接消息和客户端的IP和端口
    print(conn,client_addr)              #查看打印信息
    print('---------->',conn,client_addr)

    while True:
        try:
            cmd = conn.recv(1024)
            if not cmd:break
            res = subprocess.Popen(cmd.decode('utf-8'),shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
            stdout = res.stdout.read()
            stderr = res.stderr.read()

            header_dic = {'total_size':len(stdout)+len(stderr),'filename':None,'md5':None}    #制作报头
            header_json = json.dumps(header_dic)        #序列化报头
            header_bytes = header_json.encode('utf-8')      #序列化转码
            conn.send(struct.pack('i',len(header_bytes)))
            conn.send(header_bytes)
            conn.send(stdout)
            conn.send(stderr)
        except Exception:
            break
    conn.close()
phone.close()

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/8/23 15:34
# @Author  : Mr_zhang
# @Site    : 
# @File    : 客户端.py
# @Software: PyCharm

from socket import *
import struct,json
phone = socket(AF_INET,SOCK_STREAM)
phone.connect(('127.0.0.1',8080))

while True:
    cmd = input('>>>:').strip()
    if not cmd:continue
    phone.send(cmd.encode('utf-8'))        #发送出去的消息需要转码
    header_len = struct.unpack('i',phone.recv(4))[0]       #接收到的消息解包   ([0]表示元组中的第一个值(报头))

    header_bytes = phone.recv(header_len)       #接收到的后续包
    header_json = header_bytes.decode('utf-8')     #基于上一行进行转码
    header_dic = json.loads(header_json)       #饭序列化
    total_size = header_dic['total_size']        #反序列化之后得到的header_dic中的total_size大小
    recv_size = 0
    total_data = b''
    while recv_size < total_size:
        recv_data = phone.recv(1024)
        recv_size+=len(recv_data)
        total_data+=recv_data
    print(total_data.decode('gbk'))
phone.close()

  

 

标签:__,socket,phone,header,conn,total,recv,服务端,size
来源: https://blog.51cto.com/52770825/2795042

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有