欢迎您来到,李雷博客 | PHP博客        登录  |  注册

python实现TCP服务端持续接收关机、重启指令并输出结果【系列三】

更新:2025-03-08 21:25:10
人气:57
来源:本站原创
A+

python制作一个TCP服务端,可以持续接收指令并输出接收的指令和接收时间。实现远程对计算机电脑进行关机、重启等操作。

以下是一个使用 Python 编写的 TCP 服务端程序,它可以持续接收客户端发送的指令,并输出接收到的指令和接收时间。通过接收指令后进行关机、重启、打开记事本等操作,关机和重启前要进行提示确认,默认10秒不操作将继续执行。

import socket
import datetime
import subprocess
import tkinter as tk
from tkinter import messagebox


''' 
注释内容-BEGIN
    python生成exe的必要插件
    pip install pyinstaller


    .py生成exe文件,不要运行窗口,独立一个文件exe
    通过cmd命令行进入到1.py的目录,运行如下命令
    pyinstaller --noconsole --onefile 1.py 
注释内容-END
'''

#(李雷博客原创:https://www.mdaima.com)

# 定义服务器的主机和端口
PORT = 65432        # 监听的端口
# 获取本机主机名
hostname = socket.gethostname()
# 根据主机名获取 IP 地址
HOST = socket.gethostbyname(hostname)

# 创建一个 TCP 套接字
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    # 绑定主机和端口
    s.bind((HOST, PORT))
    # 开始监听连接,最大连接数为 1
    s.listen(100)

    #输出启动信息
    print(f'Server is listening on {HOST}:{PORT}')

    #关机事件
    def perform_shutdown():
        try:
            # 执行关机命令(适用于 Windows 系统)
            subprocess.run(["shutdown", "/s", "/t", "0"])
            # Linux 系统,关机命令 subprocess.run(["shutdown", "-h", "now"]);
        except Exception as e:
            print(f"关机失败: {e}")

    #重启事件
    def perform_restart():
        try:
            # 执行重启命令(适用于 Windows 系统)
            subprocess.run(["shutdown", "/r", "/t", "0"])
            # Linux 系统,重启命令 subprocess.run(["shutdown", "-r", "now"]);
        except Exception as e:
            print(f"重启失败: {e}")

    while True:
        # 接受客户端连接
        conn, addr = s.accept()
        with conn:

            #输出连接信息
            print(f'Connected by {addr}')

            while True:
                # 接收客户端发送的数据,最大接收 1024 字节
                data = conn.recv(1024)
                if not data:
                    # 如果没有数据,退出内层循环
                    break
                
                # 获取当前时间
                current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                
                # 解码接收到的数据
                command = data.decode('utf-8')
                
                # 输出接收到的指令和接收时间
                #print(f'Received command: {command} at {current_time}')

                #打开计算器
                if command == "notepad":
                    subprocess.Popen('notepad.exe')
                    back_msg='action_end'
                    conn.sendall(back_msg.encode('utf-8'))

                #关机
                elif command.lower() == "close":

                    # 创建一个 Tkinter 根窗口
                    root = tk.Tk()
                    root.withdraw()  # 隐藏主窗口

                    # 设置 10 秒后的关机定时器
                    timer_id = root.after(10000, perform_shutdown)

                    # 弹出确认对话框
                    result = messagebox.askyesno("确认关机?", "是否确认关机?如无操作,10秒后将自动关机!")
                    if result:
                        root.after_cancel(timer_id)  # 取消定时器
                        perform_shutdown()
                    elif not result:
                        root.after_cancel(timer_id)  # 取消定时器
                        #print("用户取消了关机操作")
                    back_msg='action_end'
                    conn.sendall(back_msg.encode('utf-8'))

                #重启
                elif command.lower() == 'restart':
                    # 创建一个 Tkinter 根窗口
                    root = tk.Tk()
                    root.withdraw()  # 隐藏主窗口

                    # 设置 10 秒后的重启定时器
                    timer_id = root.after(10000, perform_restart)

                    # 弹出确认对话框
                    result = messagebox.askyesno("确认重启?", "是否确认重启?如无操作,10秒后将自动重启!")
                    if result:
                        root.after_cancel(timer_id)  # 取消定时器
                        perform_restart()
                    elif not result:
                        root.after_cancel(timer_id)  # 取消定时器
                        #print("用户取消了重启操作")

                    back_msg='action_end'
                    conn.sendall(back_msg.encode('utf-8'))

                #其他
                else:
                    # 将消息编码并发送给客户端
                    response = f"message: {command} , time: {current_time}"
                    conn.sendall(response.encode('utf-8'))

运行步骤:

保存上述代码为一个 Python 文件,例如 tcp_server.py。

打开终端,进入该文件所在的目录。

运行命令 python tcp_server.py 启动服务器。

使用 TCP 客户端连接到服务器,并发送指令。服务器将持续接收指令,并输出接收到的指令和接收时间。

推荐的文章
# 发表我的评论
  /     /  
# 最近评论
暂时还没有评论,要不要说点什么?
  Ads by Google
  联系博主
Hello,本博客系统采用PHP和MySql开发,程序开发完全是因为个人爱好,是自己纯手写PHP源代码,未采用任何PHP框架!
QQ:858353007   微信号:lileihot123
网站地图
会员服务
关于我们
QQ:858353007
 
广告服务
加我微信
移动端访问
 
 
Copyright © 2014- 2025 www.mdaima.com All Rights Reserved.
李雷博客,专注PHP经验、PHP教程及PHP源代码开源下载分享的PHP博客!   ICP备案号:京ICP备10202169号-4