当前位置: 代码网 > it编程>前端脚本>Python > Python实现Windows端口监听程序

Python实现Windows端口监听程序

2025年05月09日 Python 我要评论
1、安装库pip install tabulate2、代码实现#!/usr/bin/env python# -*- coding: utf-8 -*- """windows端口监听程序显示本机处于监听

1、安装库

pip install tabulate

2、代码实现

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
"""
windows端口监听程序
显示本机处于监听状态的端口,进程id和程序名称
"""
 
import subprocess
import re
import os
import sys
from tabulate import tabulate
 
def get_listening_ports():
    """
    获取所有处于监听状态的端口信息
    返回包含端口、pid和程序名称的列表
    """
    try:
        # 使用netstat命令获取所有tcp监听端口
        netstat_output = subprocess.check_output(
            'netstat -ano -p tcp | findstr "listening"',
            shell=true, 
            text=true
        )
        
        # 解析netstat输出
        port_info = []
        for line in netstat_output.splitlines():
            # 清理并分割行
            parts = re.split(r'\s+', line.strip())
            if len(parts) >= 5:
                # 提取本地地址和pid
                local_address = parts[1]
                pid = parts[4]
                
                # 从本地地址中提取端口
                if ':' in local_address:
                    port = local_address.split(':')[-1]
                    
                    # 获取进程名称
                    try:
                        process_info = subprocess.check_output(
                            f'tasklist /fi "pid eq {pid}" /fo csv /nh',
                            shell=true,
                            text=true
                        )
                        
                        # 解析进程信息
                        if process_info and '","' in process_info:
                            process_name = process_info.split('","')[0].strip('"')
                            port_info.append({
                                'port': port,
                                'pid': pid,
                                'program': process_name
                            })
                    except subprocess.subprocesserror:
                        port_info.append({
                            'port': port,
                            'pid': pid,
                            'program': 'unknown'
                        })
        
        return port_info
    
    except subprocess.subprocesserror as e:
        print(f"获取端口信息时出错: {e}")
        return []
 
def display_port_info(port_info):
    """
    以表格形式显示端口信息
    """
    if not port_info:
        print("未找到监听中的端口")
        return
    
    # 准备表格数据
    table_data = []
    for info in port_info:
        table_data.append([
            info['port'],
            info['pid'],
            info['program']
        ])
    
    # 按端口号排序
    table_data.sort(key=lambda x: int(x[0]) if x[0].isdigit() else float('inf'))
    
    # 显示表格
    headers = ["端口", "进程id", "程序名称"]
    print(tabulate(table_data, headers=headers, tablefmt="grid"))
 
def main():
    """
    主函数
    """
    print("正在获取本机监听端口信息...\n")
    port_info = get_listening_ports()
    display_port_info(port_info)
 
if __name__ == "__main__":
    try:
        main()
    except keyboardinterrupt:
        print("\n程序被用户中断")
    except exception as e:
        print(f"程序执行出错: {e}")
        sys.exit(1)

3、效果如下

4、知识延展

python监听端口并重启服务脚本

通过python运行系统命令,netstat -aon|findstr 端口号,查看端口是否占用,如果占用着,说明服务没挂,不做处理,sleep设置的时间,然后再重新运行查看端口占用命令;如果没占用,说明服务挂了,重新运行启动脚本,xxxx.bat,启动服务。

依赖包:

  • os(windows命令)
  • time(定时)

代码:

######################
# 根据端口自动重启脚本~ #
######################
import os
import time

port = input("\n>>>请输入端口: \n")
# c:/users/syp1293/desktop/configfile/center.bat
bat_path = input("\n>>>请输入bat文件路径: \n")
time_u = input("\n>>>请输入间隔时间: \n")
while true:
    with os.popen('netstat -aon|findstr "' + port + '"') as res:
        res = res.read().split('\n')
    result = []
    if res[0] == '':
        # 不存在端口占用,启动服务
        os.system('start ' + bat_path)
        time.sleep(120)
        continue
    else:
        for line in res:
            # print(line)
            temp = [i for i in line.split(' ') if i != '']
            if len(temp) > 4:
                #  result.append({'pid': temp[4], 'address': temp[1], 'state': temp[3]})
                print('pid:', temp[4])
    # print('sleeping...')
    time.sleep(int(time_u))

生成exe文件,并且启动后显示为命令行。

pyinstaller -f osport.py

python socket端口监听

实现代码

import struct
import socket
import time
import multiprocessing as mp
server_ip = "192.168.1.33"
port_base = 30000
import os
def recvall(conn, n):
    # helper function to recv n bytes or return none if eof is hit
    data = b''
 
    while len(data) < n:
        packet = conn.recv(n - len(data))
        if not packet:
            #print("hahahah","come here")
            break
        data += packet
        #print(len(data))
    #print("result ======",len(data))
    return data
 
def recv_data(conn):
    # result = result.decode("utf8")
    data = b''
    counts = 0
    while true:
        packet = conn.recv(1024)
        counts += len(packet)
        if not packet:
            break
        data += packet
    print("++++++++++++++++",len(data),counts)
    return data
 
def listen_client(port):
    #server_port = port_base + port
    # try its best to listen to bind the ports to receive data
    while true:
        try:
            recv_socket = socket.socket(socket.af_inet, socket.sock_stream)
            recv_socket.setsockopt(socket.ipproto_tcp, socket.tcp_nodelay, 1)
            recv_socket.bind((server_ip,port))
            print(" listening ",server_ip,port)
            recv_socket.listen()
            break
        except exception as e:
            print("bind port fails ", e, server_ip)
            os.system('fuser -k -n tcp ' + str(port))
            time.sleep(3)
 
    while true:
        try:
            conn, client_addr = recv_socket.accept()
            recv_data(conn)
        except exception as e:
            print(e)
 
for i in range(6):
    print("================",port_base + 2 * i)
    mp.process(target=listen_client, args=(port_base + 2 * i,)).start()

到此这篇关于python实现windows端口监听程序的文章就介绍到这了,更多相关python端口监听内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com