Python實(shí)現(xiàn)Windows端口監(jiān)聽程序
1、安裝庫
pip install tabulate
2、代碼實(shí)現(xiàn)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Windows端口監(jiān)聽程序
顯示本機(jī)處于監(jiān)聽狀態(tài)的端口,進(jìn)程ID和程序名稱
"""
import subprocess
import re
import os
import sys
from tabulate import tabulate
def get_listening_ports():
"""
獲取所有處于監(jiān)聽狀態(tài)的端口信息
返回包含端口、PID和程序名稱的列表
"""
try:
# 使用netstat命令獲取所有TCP監(jiān)聽端口
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]
# 獲取進(jìn)程名稱
try:
process_info = subprocess.check_output(
f'tasklist /fi "PID eq {pid}" /fo csv /nh',
shell=True,
text=True
)
# 解析進(jìn)程信息
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"獲取端口信息時(shí)出錯(cuò): {e}")
return []
def display_port_info(port_info):
"""
以表格形式顯示端口信息
"""
if not port_info:
print("未找到監(jiān)聽中的端口")
return
# 準(zhǔn)備表格數(shù)據(jù)
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 = ["端口", "進(jìn)程ID", "程序名稱"]
print(tabulate(table_data, headers=headers, tablefmt="grid"))
def main():
"""
主函數(shù)
"""
print("正在獲取本機(jī)監(jiān)聽端口信息...\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"程序執(zhí)行出錯(cuò): {e}")
sys.exit(1)3、效果如下

4、知識延展
python監(jiān)聽端口并重啟服務(wù)腳本
通過python運(yùn)行系統(tǒng)命令,netstat -aon|findstr 端口號,查看端口是否占用,如果占用著,說明服務(wù)沒掛,不做處理,sleep設(shè)置的時(shí)間,然后再重新運(yùn)行查看端口占用命令;如果沒占用,說明服務(wù)掛了,重新運(yùn)行啟動腳本,xxxx.bat,啟動服務(wù)。
依賴包:
- os(windows命令)
- time(定時(shí))
代碼:
######################
# 根據(jù)端口自動重啟腳本~ #
######################
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>>>請輸入間隔時(shí)間: \n")
while True:
with os.popen('netstat -aon|findstr "' + port + '"') as res:
res = res.read().split('\n')
result = []
if res[0] == '':
# 不存在端口占用,啟動服務(wù)
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端口監(jiān)聽
實(shí)現(xiàn)代碼
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()到此這篇關(guān)于Python實(shí)現(xiàn)Windows端口監(jiān)聽程序的文章就介紹到這了,更多相關(guān)Python端口監(jiān)聽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python如何實(shí)現(xiàn)讀取csv文件時(shí)忽略文件的編碼格式
我們再日常讀取csv文件的時(shí)候經(jīng)常會發(fā)現(xiàn)csv文件的格式有多種,所以這篇文章為大家介紹了Python如何實(shí)現(xiàn)讀取csv文件時(shí)忽略文件的編碼格式吧2025-03-03
Python下載網(wǎng)絡(luò)小說實(shí)例代碼
這篇文章主要介紹了Python下載網(wǎng)絡(luò)小說實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
Python數(shù)據(jù)分析之Matplotlib數(shù)據(jù)可視化
這篇文章主要介紹了Python數(shù)據(jù)分析之Matplotlib數(shù)據(jù)可視化,Matplotlib?是?Python?中常用的?2D?繪圖庫,它能輕松地將數(shù)據(jù)進(jìn)行可視化,作出精美的圖表2022-08-08
Python面向?qū)ο笾惡蛯ο髮傩缘脑鰟h改查操作示例
這篇文章主要介紹了Python面向?qū)ο笾惡蛯ο髮傩缘脑鰟h改查操作,結(jié)合實(shí)例形式分析了Python面向?qū)ο笙嚓P(guān)的類與對象屬性常見操作技巧,需要的朋友可以參考下2018-12-12
詳解使用pymysql在python中對mysql的增刪改查操作(綜合)
本篇文章主要介紹了使用pymysql在python中對mysql的增刪改查操作,通過pymysql向數(shù)據(jù)庫進(jìn)行查刪增改,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01
在python中實(shí)現(xiàn)將一張圖片剪切成四份的方法
今天小編就為大家分享一篇在python中實(shí)現(xiàn)將一張圖片剪切成四份的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12
Python實(shí)現(xiàn)高效音頻封面批量刪除工具
在數(shù)字音樂管理過程中,音頻文件內(nèi)嵌的封面圖片往往會占用額外存儲空間,本文將介紹一款基于Python和PyQt5開發(fā)的跨平臺音頻封面刪除工具,大家可以了解一下2025-05-05

