本文目录导读:

Python 脚本方法
使用 socket 库(推荐)
import socket
def check_port(host, port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(2) # 超时设置
result = sock.connect_ex((host, port))
sock.close()
if result == 0:
print(f"端口 {port} 已被占用")
return True
else:
print(f"端口 {port} 可用")
return False
# 使用示例
check_port('127.0.0.1', 8080)
check_port('localhost', 3306)
多端口批量检测
def scan_ports(host, start_port, end_port):
available = []
occupied = []
for port in range(start_port, end_port + 1):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(0.5)
result = sock.connect_ex((host, port))
if result == 0:
occupied.append(port)
else:
available.append(port)
sock.close()
return available, occupied
Bash/Shell 脚本
Linux/Mac 系统
#!/bin/bash
# 检查端口是否被占用
check_port() {
PORT=$1
if lsof -i :$PORT > /dev/null 2>&1; then
echo "端口 $PORT 已被占用"
return 0
else
echo "端口 $PORT 可用"
return 1
fi
}
# 使用 netstat
check_port_netstat() {
PORT=$1
if netstat -tuln | grep -q ":$PORT "; then
echo "端口 $PORT 已被占用"
return 0
else
echo "端口 $PORT 可用"
return 1
fi
}
# 使用 ss (推荐,更现代)
check_port_ss() {
PORT=$1
if ss -tuln | grep -q ":$PORT "; then
echo "端口 $PORT 已被占用"
return 0
else
echo "端口 $PORT 可用"
return 1
fi
}
# 使用示例
check_port 8080
Windows 系统 (PowerShell)
function Check-Port {
param([int]$Port)
$connections = Get-NetTCPConnection -LocalPort $Port -ErrorAction SilentlyContinue
if ($connections) {
Write-Host "端口 $Port 已被占用" -ForegroundColor Red
return $true
} else {
Write-Host "端口 $Port 可用" -ForegroundColor Green
return $false
}
}
# 使用 netstat
function Check-PortLegacy {
param([int]$Port)
$result = netstat -ano | Select-String ":$Port "
if ($result) {
return $true
}
return $false
}
# 使用示例
Check-Port 8080
Node.js 脚本
const net = require('net');
function checkPort(port, host = '127.0.0.1') {
return new Promise((resolve, reject) => {
const server = net.createServer();
server.once('error', (err) => {
if (err.code === 'EADDRINUSE') {
resolve(false); // 端口被占用
} else {
reject(err);
}
});
server.once('listening', () => {
server.close();
resolve(true); // 端口可用
});
server.listen(port, host);
});
}
// 使用示例
async function test() {
const isAvailable = await checkPort(8080);
if (isAvailable) {
console.log('端口可用');
} else {
console.log('端口已被占用');
}
}
通用检测原理
不同语言的实现原理类似:
- 尝试绑定端口:如果绑定成功表示端口空闲
- 尝试建立连接:如果连接成功表示端口被占用
- 系统命令调用:使用系统工具检测
注意事项
- 权限问题:检测低于1024的端口可能需要管理员权限
- 超时设置:网络延迟可能导致检测不准确,建议设置合理超时
- 防火墙影响:防火墙可能阻止连接,导致误判
- 端口复用:某些服务可能使用SO_REUSEADDR选项,需特殊处理
选择哪种方法取决于你的使用场景和编程环境,Python的socket方法最为通用且跨平台。