摘要:正確示例不斷完善中請輸入通信內容來自服務器的消息循環連接接入服務器來自客戶端的消息先發送報頭長度發送報頭客戶端中止鏈接
需求:
編寫C/S架構的程序,實現遠程執行命令,思路如下
1、客戶端接收用戶輸入的命令,然后發送給服務端,
2、服務端根據傳來的數據調用subprocess模塊執行系統命令,然后將結果返回給客戶端,在客戶端打印
錯誤歸納,續更,(正確示例請挪步下翻至底):
1、在客戶端接受到服務端發送的報頭,遺漏讀取報頭長度的錯誤:
header_bytes = client.recv(header_size)
2、如下圖,strcut解包時,得到結果為元組,應當使用索引取值。
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.py
#!/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()
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41555.html
摘要:其中,廈門市大數據安全開放平臺作為全國首個采用安全屋技術開展政務大數據安全開放應用的平臺,一經上線就吸引了大家的關注,年廈門在全國率先實現政務數據互聯互通無障礙共享,為政務大數據開放奠定堅實的基礎。作為今年新晉的五大生產要素之一,數據的地位正在蹭蹭上漲,躋身新家族,自然要憑實力說話,數據也肩負著目標KPI:雖然只有短短三句,但推進起來可不是那么容易,今天咱們就來談談數據開放共享這件事。在種類...
摘要:拷貝目錄的話,是拷貝目錄里頭的文件,不包括目錄本身原樣拷貝,不支持遠程文件設置指令只能存在一個,多個的話,執行最后的那一個。設置鏡像的元屬性指定被其他鏡像作為基礎鏡像時運行的操作指令指定確保服務出現任何問題而意外結束時,自動重新啟動。 pause docker pause可以暫時停止容器,以釋放一部分CPU出來給其他服務使用docker unpause可以解凍 docker stop ...
摘要:最近手頭上做了一個很大的后臺管理項目,前端對復雜數據的處理要求頗高,也確實讓自己發現了很多之前被忽視的細節。鳴人佐助卡卡西佐助佐助佐助但是很遺憾及更早版本也不支持。 ??最近手頭上做了一個很大的后臺管理項目,前端對復雜數據的處理要求頗高,也確實讓自己發現了很多之前被忽視的細節。在此特整理出來,希望不熟悉的朋友們們以后可以繞開我踩的這些坑。本文初衷在于幫助大家梳理一些數組操作上的重點和易...
摘要:與比較中與比較關鍵字用來在函數或其他局部作用域中使用全局變量。親自動手試后,發現使用了只會讀閉包內的變量,可以隔著多層上一哥們類比看作為步驟 這篇文章是抄抄寫寫得來的,純粹是這個編輯器比筆記的好太多,才在這兒寫。 函數參數傳遞 Python的函數參數傳遞 對于變量(與對象相對的概念),其實,python函數參數傳遞可以理解為就是變量傳值操作,用C++的方式理解,就是對void*賦值。如...
摘要:文章目錄前言一丶野指針指針的運算指針整數指針指針指針的關系運算二字符指針三指針數組與數組指針指針數組數組指針四數組名與數組名五數組參數指針參數一維數組傳參二維數組傳參一級指針傳參二級指針傳參六丶函數指針函數指針即指 ...
閱讀 2692·2023-04-25 19:13
閱讀 4010·2021-09-22 15:34
閱讀 3053·2019-08-30 14:23
閱讀 1462·2019-08-29 17:17
閱讀 1603·2019-08-29 16:05
閱讀 1538·2019-08-29 13:26
閱讀 1218·2019-08-29 13:19
閱讀 553·2019-08-29 13:16