如果大家对python的socket不是很熟,或者网络通信过程不了解的话请先百度一下,我这里直接上示例了
Server 端
# -----------------------
# __Author : tyran
# __Date : 17-11-15
# -----------------------
# Server
import socket
import subprocess
# 创建套接字
listen_fd = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
# 绑定ip和port
listen_address = ('127.0.0.1', 8888)
listen_fd.bind(listen_address)
# 设置套接字是否阻塞,一般都是阻塞的,如果不写也可以,默认就是阻塞
listen_fd.setblocking(True)
# 启动监听,参数是排队数量,不包括已经连上的一个,我在linux下测试失败了。。。。一直都是5
listen_fd.listen(2)
while True:
# 开始监听,accept()如果没有客户端连上来,会阻塞
# 返回值是有两个值,第一个是通信套接字,第二个是客户端信息
connected_fd, client_address = listen_fd.accept()
print(connected_fd)
print(client_address)
print('=============================================')
"""
这里我会做一个远程命令调用,我的平台是linux
"""
while True:
# 然后接收客户端传来的命令
command_data = connected_fd.recv(1024)
# 如果客户端断开,会发送过来一个空字符串’‘
if not command_data:
# 关闭套接字
connected_fd.close()
break
# subprocess可以重启一个新的进程执行命令
command_obj = subprocess.Popen(str(command_data, encoding='utf-8'), shell=True, stdout=subprocess.PIPE)
# stdout_data就是命令执行以后的输出
stdout_data = command_obj.stdout.read()
# 先把一共发送多少个字节数据发过去
connected_fd.send(bytes(str(len(stdout_data)), encoding='utf-8'))
# 这里需要防止粘连
connected_fd.recv(1024)
# 发送命令行输出的数据
connected_fd.sendall(stdout_data)
Client 端
# -----------------------
# __Author : tyran
# __Date : 17-11-15
# -----------------------
# Client
import socket
connect_fd = socket.socket()
connect_fd.connect(('127.0.0.1', 8888))
while True:
cmd = input('>>>>')
if cmd == 'exit':
connect_fd.close()
break
# 发送命令
connect_fd.send(bytes(cmd, encoding='utf-8'))
# 获取字节数
data_len = int(str(connect_fd.recv(1024),encoding='utf-8'))
# 防止粘连
connect_fd.send(bytes('ok', encoding='utf-8'))
# 显示数据
data = ''
while len(data) < data_len:
data += str(str(connect_fd.recv(1024),encoding='utf-8'))
print(data)