python模塊——socket (實現簡單的C/S架構端通信操作CMD)


# 服務端代碼
#
!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = "loki" import socket import subprocess server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) ip_port = ('127.0.0.1', 8011) server.bind(ip_port) server.listen(5) # 鏈接循環 while 1: print('Waiting...') conn, addr = server.accept() print('-->conn: ', conn) print('-->addr: ', addr) print('Got it...') while 1: try: cmd = conn.recv(1024) res = subprocess.Popen(cmd.decode('utf-8'), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) conn.send(res.stdout.read()) conn.send(res.stderr.read()) except Exception: break conn.close() # server.close()

 

 

客戶端
#
!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = "loki" import socket client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ip_port = ('127.0.0.1', 8011) client.connect(ip_port) # 通信循環 while 1: # 發消息 cmd = input('>>: ').strip() if not cmd: continue client.send(bytes(cmd, encoding='utf-8')) # 收消息 data = client.recv(8196) print(data.decode('gbk')) # client.close()

 

以上代碼是基於TCP 流的方式進行C/S控制,注意編碼Linux適用於utf-8,Windows適用於gbk

已知BUG:

1.在接受的信息大於8196(或者你自己定義的值的時候)可能會出現粘包問題

2.執行可執行程序或者需要交互的cmd命令,client會宕住,需要重新開客戶端

3.如果是作為純py腳本使用還需要進行sys.platform的系統判斷,如果是win采用編碼gbk,linux采用編碼utf-8

4.以上代碼僅供學習參考使用

 

 

# 解決粘包問題的TCP版本 —— server

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "loki"
import socket
import subprocess
import struct
user_input = input('Please input server_ip: ').strip()

ip_port = ('%s' % user_input, 9991)
buff_size = 1024

stick_pack_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
stick_pack_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

stick_pack_server.bind(ip_port)
stick_pack_server.listen(5)

while 1:
    print('Waiting...')
    msg, address = stick_pack_server.accept()
    print("msg-->: ", msg)
    print("addr-->: ", address)
    while 1:
        try:
            cmd = msg.recv(buff_size)
            if not msg:
                break
            res = subprocess.Popen(cmd.decode("utf-8"), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                                   stdin=subprocess.PIPE)
            stderr = res.stderr.read()
            stdout = res.stdout.read()

            data_size = len(stderr) + len(stdout)


            # send header
            msg.send(struct.pack("i", data_size))

            # send real data
            msg.send(stderr)
            msg.send(stdout)
        except Exception as e:
            print('---->', e)
            break
    msg.close()
# phone.close()

 

 

# 解決粘包問題的TCP版本 —— client

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "loki"
import socket
import struct

user_input = input("Please input client_ip: ").strip()

ip_port = ('%s' % user_input, 9991)
buff_size = 1024

stick_pack_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
stick_pack_client.connect(ip_port)


while 1:
    # send message
    cmd = input('>>: ').strip()
    if not cmd:
        continue
    stick_pack_client.send(cmd.encode("utf-8"))

    # receive header
    baotou = stick_pack_client.recv(4)
    data_size = struct.unpack("i", baotou)[0]

    # receive data
    receive_size = 0
    receive_data = b''
    while receive_size < data_size:
        data = stick_pack_client.recv(1024)
        receive_size += len(data)
        receive_data += data

    print(receive_data.decode("gbk"))

# stick_pack_client.close()

 

 

Wrap-up

1.注意tcp客戶端需要使用 xx.connect()

2.注意tcp服務端發送消息是使用的accept,以及發送消息使用的是conn

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM