cmd_server.py

#!/usr/bin/env python3.8
# -*- coding: UTF-8 -*-
# __author:smoke
# file:cmd_server.py
# time:2021/03/15

import subprocess

import socket

# family type
sk = socket.socket()    #两个参数,family=AF_INET代表ipv4,type=SOCK_STREAM代表tcp,proto=0

print(sk)

address=('127.0.0.1',8000)     #ip和端口
sk.bind(address)    #绑定ip和端口
sk.listen(3)    #3代表tcp/udp连接数

print('waiting......')

while True:

    conn, addr = sk.accept()  # 阻塞,accept接收连接内容
    print(addr)
    while True:
        try:
            data = conn.recv(1024)
        except Exception:
            break
        if not data: break
        print('......', str(data, 'utf8'))
        obj = subprocess.Popen(str(data,'utf8'),shell=True,stdout=subprocess.PIPE)
        cmd_result = obj.stdout.read()    #bytes类型
        print(cmd_result)

        result_len = bytes(str(len(cmd_result)),'utf8')
        print('>>>>>>',result_len)
        conn.sendall(result_len)
        import time
        time.sleep(1)
        conn.sendall(cmd_result)

sk.close()

/usr/bin/python3.8 /home/smoke/PycharmProjects/pythonProject/lean_python/cmd_server.py
<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>
waiting......

cmd_client.py

#!/usr/bin/env python3.8
# -*- coding: UTF-8 -*-
# __author:smoke
# file:cmd_client.py
# time:2021/03/15

import socket

sk = socket.socket()
print(sk)

address = ('127.0.0.1',8000)
sk.connect(address)    #连接127.0.0.1:8000端口

while True:
    inp = input('>>>')
    if inp == 'exit':
        break
    sk.send(bytes(inp,'utf8'))
    result_len = int(str(sk.recv(1024),'utf8'))    #拿到数据大小
    print(result_len)
    data = bytes()    #空bytes,类似data=0
    while len(data) != result_len:
        recv = sk.recv(1024)
        data += recv

    print(str(data,'utf8'))

sk.close()    #关闭连接

/usr/bin/python3.8 /home/smoke/PycharmProjects/pythonProject/lean_python/cmd_client.py
<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>
>>>ls
1242
3menu_latest.py
3menu_new.py
3menu.py
对齐.py
格式化输出.py
日志记录
深浅拷贝.py
小重山
小重山2
assignment.py
built-in-funcation.py
calculator.py
cal.py
client
client.py
closure.py
cmd_client.py
cmd_server.py
code template.py
configparser_module.py
continue.py
decrator.py
dictionary.py
encapsulation.py
encode_py3.py
example.ini
exception_handling.py
field.py
file_operation2.py
file_operation.py
funcation_recursion.py
function_ parameter.py
function.py
function_return.py
function_scope.py
generator.py
hashlib_module.py
hello
i.cfg
inherit.py
__init__.py
iterator.py
jingdong_passwd
JSON_loads.py
json_test.py
JSON_text
JSON_text2
list_builder.py
list_lesson.py
log
logging_module.py
login.py
login_while.py
member_qualifier_character.py
menu.py
module_project
__name__.py
object_oriented.py
os_module.py
output.xml
PICKLE_load.py
PICKLE_test.py
PICKLE_text
polymorphic.py
__pycache__
random_module.py
reflex.py
re_module.py
s1.py
s2.py
serve.py
set.py
SHELVE_test
SHELVE_test.py
shopping_car_login.py
shopping_cart.py
shopping.py
Singleton_mode.py
smoke
special_members.py
String.py
sys_module.py
test
test.log
test.py
test.xml
three_level_menu
time_module.py
tuple.py
weixin_passwd
xml_test
XML_test.py
xmltest.xml

>>>ip addr show
867
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp4s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
    link/ether 44:8a:5b:f1:bd:c5 brd ff:ff:ff:ff:ff:ff
3: wlp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether d8:fc:93:0f:85:93 brd ff:ff:ff:ff:ff:ff
    inet 192.168.254.20/27 brd 192.168.254.31 scope global dynamic noprefixroute wlp5s0
       valid_lft 4134sec preferred_lft 4134sec
    inet6 fe80::65c8:65dd:a44d:f28c/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

>>>hostname
23
smoke-GS70-2PC-Stealth

>>>

cmd_server.py

#!/usr/bin/env python3.8
# -*- coding: UTF-8 -*-
# __author:smoke
# file:cmd_server.py
# time:2021/03/15

import subprocess   #subprocess通过子进程来执行外部指令,并通过input/output/error管道,获取子进程的执行的返回信息
import socket

sk = socket.socket()

print(sk)

address = ('127.0.0.1',8000)
sk.bind(address)
sk.listen(3)
print('waiting....')

while True:
    conn, addr = sk.accept()
    print(addr)
    while True:
        try:
            data = conn.recv(1024)
        except Exception as e:
            break
        if not data:break
        print(str(data, 'utf8'))
        obj = subprocess.Popen(str(data,'utf8'),shell=True,stdout=subprocess.PIPE)  #将一个进程的执行输出作为另一个进程的输入,data shell命令,shell=True参数会让subprocess.call接受字符串类型的变量作为命令,stdout 标准输入,subprocess.PIPE 管道输出,subprocess.PIPE:在创建Popen对象时,可以初始化为stdin, stdout或stderr的参数,表示与子进程通信的标准输入流,标准输出流以及标准错误。
        cmd_result = obj.stdout.read()  #bytes类型
        result_len = bytes(str(len(cmd_result)),'utf8')  #int无法直接转换成bytes,需要先转换成str,拿出命令输出大小
        print(result_len)
        conn.sendall(result_len)    #粘包现象,会偶尔出现result_len和comd_result同时发送导致错误
        conn.recv(1024) #使用recv做隔断
        conn.sendall(cmd_result)

sk.close()

/usr/bin/python3.8 /home/smoke/PycharmProjects/pythonProject/lean_python/cmd_server.py
<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>
waiting....

cmd_client.py

#!/usr/bin/env python3.8
# -*- coding: UTF-8 -*-
# __author:smoke
# file:cmd_client.py
# time:2021/03/15

import socket

sk = socket.socket()
print(sk)

address = ('127.0.0.1',8000)
sk.connect(address)

while True:
    inp = input('>>>')
    if inp == 'exit':   #不能发送空,发空会阻塞卡住。
        break
    sk.send(bytes(inp,'utf8'))
    result_len = int(str(sk.recv(1024),'utf8'))  #拿到数据大小
    sk.sendall(bytes('ok','utf8'))    #隔断
    print(result_len)
    data = bytes()
    while len(data) != result_len:
        recv = sk.recv(1024)
        data += recv
    print(str(data,'utf8'))
sk.close()

/usr/bin/python3.8 /home/smoke/PycharmProjects/pythonProject/lean_python/cmd_client.py
<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>
>>>dir
1511
3menu_latest.py		function_\ parameter.py        PICKLE_text
3menu_new.py		function.py		       polymorphic.py
3menu.py		function_return.py	       __pycache__
对齐.py			function_scope.py	       random_module.py
格式化输出.py		generator.py		       reflex.py
日志记录		hashlib_module.py	       re_module.py
深浅拷贝.py		hello			       s1.py
小重山			i.cfg			       s2.py
小重山2			inherit.py		       serve.py
assignment.py		__init__.py		       set.py
built-in-funcation.py	iterator.py		       SHELVE_test
calculator.py		jingdong_passwd		       SHELVE_test.py
cal.py			JSON_loads.py		       shopping_car_login.py
client			json_test.py		       shopping_cart.py
client.py		JSON_text		       shopping.py
closure.py		JSON_text2		       Singleton_mode.py
cmd_client.py		list_builder.py		       smoke
cmd_server.py		list_lesson.py		       special_members.py
code\ template.py	log			       String.py
configparser_module.py	logging_module.py	       sys_module.py
continue.py		login.py		       test
decrator.py		login_while.py		       test.log
dictionary.py		member_qualifier_character.py  test.py
encapsulation.py	menu.py			       test.xml
encode_py3.py		module_project		       three_level_menu
example.ini		__name__.py		       time_module.py
exception_handling.py	object_oriented.py	       tuple.py
field.py		os_module.py		       weixin_passwd
file_operation2.py	output.xml		       xml_test
file_operation.py	PICKLE_load.py		       XML_test.py
funcation_recursion.py	PICKLE_test.py		       xmltest.xml

>>>ls
1242
3menu_latest.py
3menu_new.py
3menu.py
对齐.py
格式化输出.py
日志记录
深浅拷贝.py
小重山
小重山2
assignment.py
built-in-funcation.py
calculator.py
cal.py
client
client.py
closure.py
cmd_client.py
cmd_server.py
code template.py
configparser_module.py
continue.py
decrator.py
dictionary.py
encapsulation.py
encode_py3.py
example.ini
exception_handling.py
field.py
file_operation2.py
file_operation.py
funcation_recursion.py
function_ parameter.py
function.py
function_return.py
function_scope.py
generator.py
hashlib_module.py
hello
i.cfg
inherit.py
__init__.py
iterator.py
jingdong_passwd
JSON_loads.py
json_test.py
JSON_text
JSON_text2
list_builder.py
list_lesson.py
log
logging_module.py
login.py
login_while.py
member_qualifier_character.py
menu.py
module_project
__name__.py
object_oriented.py
os_module.py
output.xml
PICKLE_load.py
PICKLE_test.py
PICKLE_text
polymorphic.py
__pycache__
random_module.py
reflex.py
re_module.py
s1.py
s2.py
serve.py
set.py
SHELVE_test
SHELVE_test.py
shopping_car_login.py
shopping_cart.py
shopping.py
Singleton_mode.py
smoke
special_members.py
String.py
sys_module.py
test
test.log
test.py
test.xml
three_level_menu
time_module.py
tuple.py
weixin_passwd
xml_test
XML_test.py
xmltest.xml

>>>ip addr show
867
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp4s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
    link/ether 44:8a:5b:f1:bd:c5 brd ff:ff:ff:ff:ff:ff
3: wlp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether d8:fc:93:0f:85:93 brd ff:ff:ff:ff:ff:ff
    inet 192.168.254.20/27 brd 192.168.254.31 scope global dynamic noprefixroute wlp5s0
       valid_lft 3799sec preferred_lft 3799sec
    inet6 fe80::65c8:65dd:a44d:f28c/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

>>>