tcp通訊易錯點羅列_續更

需求

編寫C/S架構的程序,實現遠程執行命令,思路以下
一、客戶端接收用戶輸入的命令,而後發送給服務端,
二、服務端根據傳來的數據調用subprocess模塊執行系統命令,而後將結果返回給客戶端,在客戶端打印python

錯誤實例(續更)

錯誤概括,續更,(正確示例請挪步下翻至底)shell

一、在客戶端接受到服務端發送的報頭,遺漏讀取報頭長度的錯誤:json

header_bytes = client.recv(header_size)

二、以下圖,strcut解包時,獲得結果爲元組,應當使用索引取值。服務器

struct解包獲得元組後未用索引取值

header_size = struct.unpack('i',client.recv(4))[0]

正確示例(不斷完善中)

client.py架構

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/04/20 14:51
# @Author  : MJay_Lee
# @File    : client.py
# @Contact : limengjiejj@hotmail.com

import socket
import struct
import json

client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('127.0.0.1',8080))

while True:
    cmd = input('請輸入通訊內容>>:').strip()
    client.send(cmd.encode('utf-8'))


    header_size = struct.unpack('i',client.recv(4))[0]
    header_bytes = client.recv(header_size)
    header_json = header_bytes.decode('utf-8')
    header_dic = json.loads(header_json)

    total_size = header_dic['header_len']
    recv_size = 0
    res = b''

    while recv_size < total_size:
        recv_data = client.recv(1024)
        res += recv_data
        recv_size += len(recv_data)

    print(res.decode('gbk'))

# print('來自服務器的消息:',msg.decode('gbk'))

client.close()

server.pysocket

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/04/20 14:51
# @Author  : MJay_Lee
# @File    : Sever.py
# @Contact : limengjiejj@hotmail.com

import socket
import subprocess
import json
import struct

server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(('127.0.0.1',8080))
server.listen(5)
print('start...')

# 循環鏈接
while True:
    conn,client_addr = server.accept()
    print(client_addr,'接入服務器')
    while True:
        try:
            msg = conn.recv(1024)
            print('來自客戶端的消息:', msg.decode('utf-8'))
            obj = subprocess.Popen(msg.decode('utf-8'),
                                   shell=True,
                                   stdout=subprocess.PIPE,
                                   stderr=subprocess.PIPE,
                                   )
            obj_stdout = obj.stdout.read()
            obj_stderr = obj.stderr.read()
            obj_len = len(obj_stdout) + len(obj_stderr)


            header_dic = {
                'header_len':obj_len
            }

            header_json = json.dumps(header_dic)
            header_bytes = header_json.encode('utf-8')

            # 先發送報頭長度
            header_size = len(header_bytes)
            conn.send(struct.pack('i',header_size))

            # 發送報頭
            conn.send(header_bytes)

            conn.send(obj_stdout)
            conn.send(obj_stderr)

            # conn.send(msg+b'_accept')

        except ConnectionResetError:
            print(client_addr,'客戶端停止連接')
            break
    conn.close()
server.close()
相關文章
相關標籤/搜索