>  기사  >  백엔드 개발  >  Python으로 작성된 클라이언트는 해당 명령을 실행하고 결과를 반환하라는 명령을 서버에 보냅니다.

Python으로 작성된 클라이언트는 해당 명령을 실행하고 결과를 반환하라는 명령을 서버에 보냅니다.

大家讲道理
大家讲道理원래의
2016-11-09 11:02:291444검색

아무것도 없이 Python을 사용하여 클라이언트와 서버 응답을 위한 프로그램을 작성합니다. 주요 원칙은 클라이언트가 tcp 프로토콜을 통해 서버와 통신하고, 서버가 이를 실행하는 것입니다. 지시사항을 전달하고 해당 결과를 클라이언트로 보내면 클라이언트가 결과를 인쇄합니다. 코드는 비교적 간단하므로 자세히 소개하지 않습니다. 단지 오락을 위해서입니다.

  1. 서버측 코드, server_tcp.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
# #执行客户端发送过来的命令,并把执行结果返回给客户端
import socket, traceback, subprocess
 
host = ''
port = 51888
 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
 
s.bind((host, port))
s.listen(1)
 
while 1:
    try:
        client_socket, client_addr = s.accept()
    except Exception, e:
        traceback.print_exc()
        continue
 
    try:
        print 'From host:', client_socket.getpeername()
        while 1:
            command = client_socket.recv(4096)
            if not len(command):
                break
            print client_socket.getpeername()[0] + ':' + str(command)
 
            # 执行客户端传递过来的命令
            handler = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
            output = handler.stdout.readlines()
            if output is None:
                output = []
 
            for one_line in output:
                client_socket.sendall(one_line)
                client_socket.sendall("\n")
 
            client_socket.sendall("ok")
 
 
    except Exception, e:
        traceback.print_exc()
 
    try:
        client_socket.close()
    except Exception, e:
        traceback.print_exc()

2. 클라이언트측 코드 client_tcp.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
# #给server端发送命令
import socket, sys, traceback
 
host = '127.0.0.1'
port = 51888
 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    s.connect((host, port))
except Exception, e:
    msg = traceback.format_exc()
    print '连接错误:', msg
 
input_command = raw_input('Input command:')
s.send(input_command)
 
# 利用shutdown()函数使socket双向数据传输变为单向数据传输
# 该参数表示了如何关闭socket。具体为:0表示禁止将来读;1表示禁止将来写;2表示禁止将来读和写
s.shutdown(1)
print '发送完成.'
print '收到内容:\n'
while 1:
    buff = s.recv(4096)
    if not len(buff):
        break
 
    sys.stdout.write(buff)

3. server_tcp.py 스크립트를 시작하고 로컬 포트 ​​51888을 수신한 다음 client_tcp.py를 시작합니다.

(1) 클라이언트 콘텐츠:

/usr/bin/python2.7 /home/wuguowei/PycharmProjects/xplan_script/test_process/client_tcp.py
Input command:ls -l
发送完成.
收到内容:
 
总用量 20
 
-rw-r--r-- 1 root root  744  2月 10 14:44 client_tcp.py
 
-rw-r--r-- 1 root root  877  2月 10 14:18 my_sub_process.py
 
-rw-r--r-- 1 root root 1290  2月 10 14:45 server_tcp.py
 
-rw-r--r-- 1 root root  493  2月 10 10:43 tcpclient.py
 
-rw-r--r-- 1 root root 1168  2月 10 11:51 tcpserver.py
 
ok
Process finished with exit code 0

(2) 서버 정보

/usr/bin/python2.7 /home/wuguowei/PycharmProjects/xplan_script/test_process/server_tcp.py
From host: ('127.0.0.1', 46993)
127.0.0.1:ls -l


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.